我有一个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 ++结构中,我有成员函数,可以执行诸如在另一个存储桶下检索存储桶列表,或者在存储桶路径下检索键/值对列表等等。我需要执行相同的操作。数据库。是否有一种有效的方法来设计模式来执行此操作?
答案 0 :(得分:1)
没有高效的方式来表示关系存储中的层次关系。键值存储(你可能听说过它们,它们现在风靡一时)比它更好但通常不提供SQL层。如果你想要移动存储桶,那么在特定路径下获取所有存储桶将需要多个查询(如果你不想移动存储桶,你可以使用你已经到达的方案并对存储桶名称执行子字符串搜索,例如"a/*"
)。
也就是说,即使没有每个存储桶存储其自己的完整路径,您也可以这样做:您需要从bucket
到bucket
的自我多对多关系映射。您需要两个表,一个用于存储桶,另一个用于映射。在映射表中,您有两列parent_bucket
和child_bucket
。在bucket
表中,您有三个,bucket_id
,key
和value
。