LMDB是一个键值存储。这里可以存储哪些类型的键和值?示例显示int
或char arrays
..此外,我想知道是否可以在lmdb
中存储相关数据,就像我们将与学生相关的所有数据存储在{{1}中一样在table
答案 0 :(得分:1)
听起来你并不是C程序员,但在C语言的上下文中,LMDB中的键和值的数据都是(void *) - 也就是指向任何东西的通用指针。这意味着可以使用可以用编程语言表达的任何数据类型。在其他语言中,通过提供的任何绑定,您的选项可能会受到更多限制。
LMDB并不关心你存储的内容,它看到的只是blob。显然它不是RDBMS。如果要存储结构化数据,则需要自己管理该结构。您可以采用复杂的数据结构并将其序列化为blob,并将其存储在单个密钥下。这是OpenLDAP的slapd中使用的方法。或者,您可以将数据的各个列设置为LMDB中的单独命名DB,并将各个值存储在各自的DB中。 (例如,OpenLDAP和SQLite / SQLightning中的索引以这种方式处理。)所以是的,虽然LMDB没有提供任何管理关系本身的函数,但如果你愿意,你当然可以将它用作RDBMS的后备存储。 (再次,请参阅SQLightning。例如,MySQL / MariaDB或Postgres的后端也是可行的,但在它们的前端和LMDB API之间需要更多的粘合代码。)
答案 1 :(得分: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>
键。
使用teacher-id = 2迭代students;<teacher-id>;<student-id>
会将所有学生的ID映射到用户“benny”。
使用student-id = 4迭代teachers;<student-id>;<teacher-id>
将为用户“sue”提供所有教师的ID。
也可以在LMDB中创建多个键/值数据库,而不是为不同类型的数据使用键前缀。