可以存储在 LMDB 中的值
Values that can be stored in LMDB
LMDB 是一个键值存储。这里可以存储什么类型的键和值?示例显示 int
或 char arrays
.. 另外我想知道是否可以将相关数据存储在 lmdb
中,就像我们将与学生相关的所有数据存储在 table
在 RDBMS
听起来你不是 C 程序员,但在 C 语言的上下文中,LMDB 中键和值的数据都是 (void *) - 即指向任何东西的通用指针。这意味着可以使用可以用编程语言表达的任何数据类型。在其他语言中,通过提供的任何绑定,您的选择可能会更加有限。
LMDB 不关心你存储的是什么,它看到的都是 blob。显然它不是 RDBMS。如果要存储结构化数据,则需要自己管理该结构。您可以采用复杂的数据结构并将其序列化为一个 blob,并将其存储在单个键下。这是 OpenLDAP 的 slapd 中使用的方法。或者,您可以将数据的各个列设置为 LMDB 中单独命名的数据库,并将各个值存储在各自的数据库中。 (例如,OpenLDAP 和 SQLite/SQLightning 中的索引就是这样处理的。)所以是的,虽然 LMDB 本身不提供任何管理关系的功能,但如果你想,你当然可以将它用作 RDBMS 的后备存储. (同样,参见 SQLightning 示例。MySQL/MariaDB 或 Postgres 的后端也是可行的,但在它们的前端和 LMDB API 之间涉及更多的粘合代码。)
键和数据都可以包含零个或多个字节的任意组合。
因此您的数据 blob 可以是逗号分隔的文本字符串,JSON 或某种形式的数据包二进制数据(如 flatbuffers)。
这也意味着如果你想添加多个键来定位相同的数据,或者你想在一个RMDB中存储类似于多个表的多种类型的数据。
一种简单的数据存储方式如下:
born;1980-01-01;2 -> <null>
born;1983-05-17;1 -> <null>
born;1983-05-17;3 -> <null>
born;1992-09-11;4 -> <null>
db;nextuser -> 5
names;benny;2 -> <null>
names;jenny;3 -> <null>
names;john;1 -> <null>
names;sue;4 -> <null>
occupation;student;3 -> <null>
occupation;student;4 -> <null>
occupation;teacher;1 -> <null>
occupation;teacher;2 -> <null>
students;1;3 -> <null>
students;2;3 -> <null>
students;2;4 -> <null>
teachers;3;1 -> <null>
teachers;4;1 -> <null>
teachers;4;2 -> <null>
users;0001 -> {"name":"john","born":"1983-05-17","occupation":"teacher"}
users;0002 -> {"name":"benny","born":"1980-01-01","occupation":"teacher"}
users;0003 -> {"name":"jenny","born":"1983-05-17","occupation":"student"}
users;0004 -> {"name":"sue","born":"1992-09-11","occupation":"student"}
以上数据将允许使用 users;<id>
键在插入顺序 (id) 上迭代用户。或者使用 born;<date>;<id>
键按年龄。
使用 teacher-id = 2 遍历 students;<teacher-id>;<student-id>
将给出映射到用户 "benny" 的所有学生的 ID。
使用 student-id = 4 迭代 teachers;<student-id>;<teacher-id>
将给出用户 "sue".
的所有教师的 ID
除了为不同类型的数据使用键前缀,还可以在 LMDB 中创建多个 key/value 数据库。
LMDB 是一个键值存储。这里可以存储什么类型的键和值?示例显示 int
或 char arrays
.. 另外我想知道是否可以将相关数据存储在 lmdb
中,就像我们将与学生相关的所有数据存储在 table
在 RDBMS
听起来你不是 C 程序员,但在 C 语言的上下文中,LMDB 中键和值的数据都是 (void *) - 即指向任何东西的通用指针。这意味着可以使用可以用编程语言表达的任何数据类型。在其他语言中,通过提供的任何绑定,您的选择可能会更加有限。
LMDB 不关心你存储的是什么,它看到的都是 blob。显然它不是 RDBMS。如果要存储结构化数据,则需要自己管理该结构。您可以采用复杂的数据结构并将其序列化为一个 blob,并将其存储在单个键下。这是 OpenLDAP 的 slapd 中使用的方法。或者,您可以将数据的各个列设置为 LMDB 中单独命名的数据库,并将各个值存储在各自的数据库中。 (例如,OpenLDAP 和 SQLite/SQLightning 中的索引就是这样处理的。)所以是的,虽然 LMDB 本身不提供任何管理关系的功能,但如果你想,你当然可以将它用作 RDBMS 的后备存储. (同样,参见 SQLightning 示例。MySQL/MariaDB 或 Postgres 的后端也是可行的,但在它们的前端和 LMDB API 之间涉及更多的粘合代码。)
键和数据都可以包含零个或多个字节的任意组合。
因此您的数据 blob 可以是逗号分隔的文本字符串,JSON 或某种形式的数据包二进制数据(如 flatbuffers)。
这也意味着如果你想添加多个键来定位相同的数据,或者你想在一个RMDB中存储类似于多个表的多种类型的数据。
一种简单的数据存储方式如下:
born;1980-01-01;2 -> <null>
born;1983-05-17;1 -> <null>
born;1983-05-17;3 -> <null>
born;1992-09-11;4 -> <null>
db;nextuser -> 5
names;benny;2 -> <null>
names;jenny;3 -> <null>
names;john;1 -> <null>
names;sue;4 -> <null>
occupation;student;3 -> <null>
occupation;student;4 -> <null>
occupation;teacher;1 -> <null>
occupation;teacher;2 -> <null>
students;1;3 -> <null>
students;2;3 -> <null>
students;2;4 -> <null>
teachers;3;1 -> <null>
teachers;4;1 -> <null>
teachers;4;2 -> <null>
users;0001 -> {"name":"john","born":"1983-05-17","occupation":"teacher"}
users;0002 -> {"name":"benny","born":"1980-01-01","occupation":"teacher"}
users;0003 -> {"name":"jenny","born":"1983-05-17","occupation":"student"}
users;0004 -> {"name":"sue","born":"1992-09-11","occupation":"student"}
以上数据将允许使用 users;<id>
键在插入顺序 (id) 上迭代用户。或者使用 born;<date>;<id>
键按年龄。
使用 teacher-id = 2 遍历 students;<teacher-id>;<student-id>
将给出映射到用户 "benny" 的所有学生的 ID。
使用 student-id = 4 迭代 teachers;<student-id>;<teacher-id>
将给出用户 "sue".
除了为不同类型的数据使用键前缀,还可以在 LMDB 中创建多个 key/value 数据库。