【问题标题】:Values that can be stored in LMDB可以存储在 LMDB 中的值
【发布时间】:2018-05-06 05:20:29
【问题描述】:

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

【问题讨论】:

    标签: openldap lmdb nosql


    【解决方案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 之间涉及更多的粘合代码。)

    【讨论】:

    • Thankyou...AFAIK,曾经存储的键值对只能删除不能更新,删除的节点以后可以重用。如果在 1000 条记录中,我删除 500 条记录并再次添加 250 条记录怎么办? DB占用的空间会减少吗?
    【解决方案2】:

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

    因此,您的数据 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;&lt;id&gt; 键在插入顺序 (id) 上进行迭代。或使用born;&lt;date&gt;;&lt;id&gt; 键按年龄。

    以teacher-id = 2 遍历students;&lt;teacher-id&gt;;&lt;student-id&gt; 将给出映射到用户“benny”的所有学生的ID。

    在student-id = 4 的情况下遍历teachers;&lt;student-id&gt;;&lt;teacher-id&gt; 将为用户“sue”提供所有教师的ID。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 2014-08-03
      • 2015-01-07
      • 1970-01-01
      相关资源
      最近更新 更多