0

LMDB 是一个键值对存储。这里可以存储哪些类型的键和值?示例显示intchar arrays.. 另外我想知道是否可以将相关数据存储在lmdb我们将与学生相关的所有数据存储tableRDBMS

4

2 回答 2

1

听起来您不是 C 程序员,但在 C 语言的上下文中,LMDB 中键和值的数据都是 (void *) - 即指向任何东西的通用指针。这意味着可以使用任何可以用编程语言表达的数据类型。在其他语言中,通过提供任何绑定,您的选择可能会受到更多限制。

LMDB 不在乎你存储什么,它看到的只是 blob。显然它不是 RDBMS。如果要存储结构化数据,则需要自己管理该结构。您可以采用复杂的数据结构并将其序列化为 blob,并将其存储在单个键下。这是 OpenLDAP 的 slapd 中使用的方法。或者,您可以在 LMDB 中将数据的各个列设置为单独的命名 DB,并将各个值存储在各自的 DB 中。(例如,OpenLDAP 和 SQLite/SQLightning 中的索引就是以这种方式处理的。)所以是的,虽然 LMDB 本身不提供任何管理关系的功能,但如果您愿意,您当然可以将其用作 RDBMS 的后备存储。(同样,参见 SQLightning 示例。MySQL/MariaDB 或 Postgres 的后端也是可行的,

于 2016-06-10T19:10:28.630 回答
0

键和数据都可以包含零个或多个字节的任意组合。

因此,您的数据 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>键。

students;<teacher-id>;<student-id>使用teacher-id = 2 进行迭代将给出映射到用户“benny”的所有学生的ID。

使用 student-id = 4 进行迭代teachers;<student-id>;<teacher-id>将为用户“sue”提供所有教师的 id。

除了为不同类型的数据使用键前缀,还可以在 LMDB 中创建多个键/值数据库。

于 2018-05-05T21:20:29.623 回答