surrealpatch/docs/STORAGE.md
Tobie Morgan Hitchcock cb01214ca9 Update documentation
2016-07-04 11:28:26 +01:00

151 lines
No EOL
3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Storage
Surreal can be used with any key-value storage which enables range scans. This document describes how the data is stored in the storage layer, so that it can be queried and manipulated quickly and efficiently.
**Base keys**
```bash
{$kv} = "surreal" # This is the base key
```
The base key is used to separate the data used in SurrealDB from data used by other databases using the same key:value store.
```bash
{$ns} = "acme" # This is the name of the namespace
```
The namespace key is used to enable separation of data and multi-tenancy of databases on SurrealDB.
```bash
{$db} = "test" # This is the name of the database
```
The database key is used to separate data into multiple different databases under each multi-tenant installation.
**Data types**
Each data type is stored using a different symbol in the key:value pair.
```bash
! # Used to store Surreal config data
* # Used to store item data
~ # Used to store item diffs
¤ #
« # Used to store item edges
» # Used to store item edges
# Used to store item events
# Used to store item links
# Used to store item links
# Used to store index data
```
---
### Config
**Namespace**
```bash
/{$kv}/!/n/{$ns} ""
# e.g.
/{$kv}/!/n/acme ""
```
**Database**
```bash
/{$kv}/!/d/{$ns}/{$db} ""
# e.g.
/{$kv}/!/d/{$ns}/test ""
```
**Table**
```bash
/{$kv}/!/t/{$ns}/{$db}/{$tb} ""
# e.g.
/{$kv}/!/t/{$ns}/{$db}/people ""
```
**Field**
```bash
/{$kv}/!/f/{$ns}/{$db}/{$tb}/{$fld} "{}"
# e.g.
/{$kv}/!/f/{$ns}/{$db}/{$tb}/fullname `{
"name": "fullname",
"type": "string",
"code": "",
"min": 0,
"max": 0,
"default": "",
"notnull": false,
"readonly": false,
"mandatory": false,
}`
```
**Index**
```bash
/{$kv}/!/i/{$ns}/{$db}/{$tb}/{$idx} "{}"
# e.g.
/{$kv}/!/i/{$ns}/{$db}/{$tb}/fullname `{
"name": "fullname",
"code": "",
"cols": ["firstname", "middlename", "lastname"],
"uniq": false,
}`
```
---
### Items
```bash
/{$kv}/{$ns}/{$db}/{$tb}/{$id} "{}"
# e.g
/{$kv}/{$ns}/{$db}/{$tb}/UUID `{"name":"Tobie","age":18}`
```
*TRAIL*
```bash
/{$kv}/{$ns}/{$db}/{$tb}/•/{$id}/{$time} "{}"
# e.g
/{$kv}/{$ns}/{$db}/{$tb}/•/UUID/2016-01-29T22:42:56.478173947Z `{}`
```
*EVENT*
```bash
/{$kv}/{$ns}/{$db}/{$tb}/‡/{$id}/{$type}/{$time} "{}"
# e.g
/{$kv}/{$ns}/{$db}/{$tb}/‡/UUID/login/2016-01-29T22:42:56.478173947Z `{}`
```
*EDGES*
```bash
/{$kv}/{$ns}/{$db}/{$tableid}/»/{$id}/{$type}/{$edgeid} ""
/{$kv}/{$ns}/{$db}/{$typeid}/{$id} "{}"
/{$kv}/{$ns}/{$db}/{$tableid}/«/{$id}/{$type}/{$edgeid} ""
# e.g
/{$kv}/{$ns}/{$db}/{$tableid}/»/1537/follow/9563 ""
/{$kv}/{$ns}/{$db}/{$typeid}/9563 `{"in":"1537","out":"5295"}`
/{$kv}/{$ns}/{$db}/{$tableid}/«/5295/follow/9563 ""
```
---
### Index
**Unique index**
```bash
/{$kv}/{$ns}/{$db}/{$table}/¤/{$index}/[{$columns}] "{$id}"
# e.g
/{$kv}/{$ns}/{$db}/{$table}/¤/{$index}/[lastname,firstname] `@person:1342`
```
### Point
**Non-unique index**
```bash
/{$kv}/{$ns}/{$db}/{$table}/¤/{$index}/[{$columns}]/{$id} "{$id}"
# e.g
/{$kv}/{$ns}/{$db}/{$table}/¤/{$index}/[lastname,firstname]/{$id} `@person:1342`
```