我正在考虑将Berkeley DB
用作高度并发移动应用程序的后端的一部分。对于我的应用程序,使用Queue
进行记录级别锁定将是理想的选择。但是,正如标题中所述,我需要查询和更新将在概念上建模的数据,如Map<Number,Map<Number,Number>>
。
外键会引用唯一的Item
,内键会引用其中一个Item
的指标。内部值将是一个我需要原子递增的计数器,可能非常频繁。因此,为什么记录级锁定是一个理想的功能。理想情况下,记录级别与数据模型中的Item
级别类似。
数据将以下列两种方式使用:
添加<Number,Map<Number,Number>>
条目
在给定Item
id和度量标准ID列表的情况下,在数据库中以原子方式批量递增约15个度量标准
然后,获取Item
的指标地图
内部Map
应该能够增长,但不会超过200个条目。
就是这样。
您认为Berkeley DB
是否适合此应用程序?
显然,我的数据架构不够清晰,所以我要进一步细分。
Item
有多个指标,每个指标都有一个计数器,即一对一(多对一),即<Number,Map<Number,Number>>
但我有很多Item
,所以我需要的是Map<Number,Map<Number,Number>>
答案 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
的数据库。这样您就可以快速随机访问内部地图中的任何特定条目,但是您必须使用光标来检索整个内部地图中的所有条目。