如何建模地图<编号,地图<编号,编号>&gt;在Berkeley DB

时间:2016-06-25 10:54:03

标签: counter berkeley-db embedded-database

我正在考虑将Berkeley DB用作高度并发移动应用程序的后端的一部分。对于我的应用程序,使用Queue进行记录级别锁定将是理想的选择。但是,正如标题中所述,我需要查询和更新将在概念上建模的数据,如Map<Number,Map<Number,Number>>

外键会引用唯一的Item,内键会引用其中一个Item的指标。内部值将是一个我需要原子递增的计数器,可能非常频繁。因此,为什么记录级锁定是一个理想的功能。理想情况下,记录级别与数据模型中的Item级别类似。

数据将以下列两种方式使用:

  1. 添加<Number,Map<Number,Number>>条目

    • 相对不常见
  2. 在给定Item id和度量标准ID列表的情况下,在数据库中以原子方式批量递增约15个度量标准

    然后,获取Item的指标地图

    • 非常频繁
  3. 内部Map应该能够增长,但不会超过200个条目。

    就是这样。

    您认为Berkeley DB是否适合此应用程序?

    更新

    显然,我的数据架构不够清晰,所以我要进一步细分。

    Item有多个指标,每个指标都有一个计数器,即一对一(多对一),即<Number,Map<Number,Number>>

    但我有很多Item,所以我需要的是Map<Number,Map<Number,Number>>

1 个答案:

答案 0 :(得分:0)

我认为伯克利数据库是一个不错的选择,但有一些关于如何选择布局数据的警告。但是,您可能也想考虑其他key-value stores - 例如,LMDB比BDB更容易实现。

乍一看,系统中的记录(&#34;值&#34;&#34;键/值&#34;)似乎是您的内部Map<Number, Number>queue访问方法(或btree,FWIW)提供外部Map<Number, Record>

Berkeley DB没有提供太多(实际上任何)帮助来访问记录中的内容。因此,您仍然必须以某种方式表示您的内部地图随机访问和修改其内容。根据{{​​1}}中第一个数字的大小,您可以执行一个简单的C风格数组。你可以使用JSON对象,或者protobuf,或者你能想到的任何其他东西。

如果您在外部地图&gt;中有许多条目,那么这种布局才有意义,相比之下您提到的内部地图大小的200个条目。记录级别锁定适用于整个内部地图,因为这是您的记录。

另一种技术是在架构中的前两个Map<Number, Number>中创建一个复合键。也就是说,Number成为具有键Map<NumberX, Map<NumberY, NumberZ>和值NumberX_NumberY的数据库。这样您就可以快速随机访问内部地图中的任何特定条目,但是您必须使用光标来检索整个内部地图中的所有条目。