分层多部分键值存储

时间:2012-05-05 01:44:27

标签: algorithm data-structures tree b-tree

我正在尝试设计一个配置/设置管理系统,我正考虑将其存储在一个键值存储中。

我有一个多部分密钥 - OrganizationId + TenantId + UserId + ApplicationId,而value是一个序列化的配置/设置对象。密钥的多个部分是分层的 - 即userid属于tenantid,属于组织id

业务要求是必须返回用户级(用户ID)配置/设置对象(如果存在)或者返回租户级别(租户ID)或者返回组织级别(org id)对象。组织级别对象将始终存在。

我打算用键存储组织级别对象 - (OrgId - a,TenantId - 0,UserId - 0,AppId - 0) 同样,租户级别对象将存储为 - (OrgId - a,TenantId - b,UserId - 0,AppId - 0)等等......

当我得到一个返回某个配置/设置对象的查询时,我得到 - OrgId(a),TenantId(b),UserId(c)和AppId(d)作为输入。我的工作是查询键值存储以返回适当级别的对象

我可以通过在最坏的情况下向键值存储区进行4次调用来实现此目的 -

  1. a,b,c,d
  2. a,b,c,0
  3. a,b,0,0
  4. a,0,0,0
  5. 有没有什么方法可以在一次通话中实现这一目标?我可以维护任何其他数据结构来实现这一目标吗?我可以用什么算法来解决这个问题?

    提前致谢!!

1 个答案:

答案 0 :(得分:1)

以下是两个示例设置

(a,0,0,0) => 1
(a,b,0,0) => 2

现在假设我按字典顺序浏览所有可能的组合,看看我得到了什么

(a,0,0,0) => 1
(a,0,0,a) => 1
....
(a,b,0,0) => 2
(a,b,0,a) => 2
...
(a,c,0,0) => 1

我只存储事情发生变化的点

(a,0,0,0) => 1
(a,b,0,0) => 2
(a,c,0,0) => 1

我没有将原始数据扩展超过两倍,我可以通过使用返回最大位置< =查询位置的单个查询来计算任何位置的设置。