【问题标题】:convert C++ key/value structure to database (sqlite3)将 C++ 键/值结构转换为数据库(sqlite3)
【发布时间】:2012-02-19 07:58:32
【问题描述】:

我有一个如下所示的 C++ 键/值表:

class kvBucket {
   ...
   map<string, kvBucket*> buckets;
   map<string, string> keyPairs;
   ...
}
class kvTree {
   ...
   kvBucket base;
   ...
}

我想将其从内存结构转换为在数据库中实现的结构 (sqlite3)。由于嵌套的存储桶,我不确定如何表示模式。这是示例数据:

bucket | key | value
------   ---   -----
   a      v      1
  a/b     w      2
  a/b     x      3
 a/b/c    y      4
   d      z      5

在 C++ 结构中,我有成员函数来执行诸如检索另一个存储桶下的存储桶列表或检索存储桶路径下的键/值对列表等操作。我需要对数据库。有没有一种有效的方法来设计架构来做到这一点?

【问题讨论】:

    标签: c++ sql database sqlite schema


    【解决方案1】:

    没有有效的方法来表示关系存储中的层次关系。键值存储(您可能听说过它们,它们现在风靡一时)在这方面做得更好,但通常不提供 SQL 层。如果您希望能够移动存储桶,则在特定路径下获取所有存储桶将需要多个查询(如果您不想移动存储桶,您可以使用您已经获得的方案并在存储桶名称上执行子字符串搜索,例如 "a/*")。

    也就是说,即使不让每个存储桶存储自己的完整路径,您也可以做到这一点:您需要从 bucketbucket 的自到自多关系映射。您需要两张表,一张用于存储桶,一张用于映射。在映射表中有两列,parent_bucketchild_bucket。在bucket 表中有三个bucket_idkeyvalue

    【讨论】:

    • 我还需要映射表中的bucket_id吗?
    • @Octave parent_bucketchild_bucket 都是指向 buckets 表的存储桶 ID。
    • 是否会有第三个表将存储桶名称映射到 id 的?如果我使用单表模式,那么移动存储桶会有什么问题 - 不只是对需要移动的存储桶进行重命名吗?
    • @Octave 不,您不需要将名称映射到 ID 的表 - 由于它们之间存在一对一的对应关系,因此您可以在其中包含“名称”和“ID”列桶表。是的,如果您使用单表方法,则需要重命名 all 的存储桶 - 如果使用两行,则只需更改一行。您可以选择哪个更好。
    • 给定一个bucket,比如说“a/b”,在不知道名字“a”和“b”的父子关系的情况下,如何遍历映射表?换句话说,既然我们假设存储桶表没有存储完整的存储桶路径,我怎么知道他们的 id 是什么?
    猜你喜欢
    • 2011-07-25
    • 2012-06-21
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    相关资源
    最近更新 更多