【问题标题】:How to model Map<Number,Map<Number,Number>> in Berkeley DB如何在 Berkeley DB 中建模 Map<Number,Map<Number,Number>>
【发布时间】:2016-10-27 22:00:12
【问题描述】:

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

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

数据将用于以下两种方式:

  1. 添加&lt;Number,Map&lt;Number,Number&gt;&gt; 条目

    • 比较少见
  2. 在给定Item id 和指标 id 列表的情况下,在数据库中以原子方式批量增加约 15 个指标

    然后,获取 Item 的度量图

    • 非常频繁

内部Map 应该能够增长,但不会超过 200 个条目。

就是这样。

你觉得Berkeley DB会适合这个应用吗?

更新:

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

Item 有很多指标,每个指标都有一个计数器,即一对(多对一)即&lt;Number,Map&lt;Number,Number&gt;&gt;

但是我有很多Item,所以我需要的是Map&lt;Number,Map&lt;Number,Number&gt;&gt;

【问题讨论】:

  • 您能否提供一个示例表(?)来明确您的数据架构,好吗?你想解决什么问题,我想不出 Map> 解决的问题
  • Map 的键 Number 是不可变的吗?
  • 是否已经提供了数字键(内部和外部),或者您需要它们由数据库生成?
  • 为什么需要关卡记录锁定? ACID 交易还不够吗? GPL 是一种选择吗?
  • 您需要多处理和/或多线程吗?

标签: counter berkeley-db embedded-database


【解决方案1】:

我认为 Berkeley DB 将是一个不错的选择,但需要注意一些关于如何选择数据布局的注意事项。但是,您可能还想考虑其他key-value stores - 例如,LMDB 应该比 BDB 更容易上手。

乍一看,您系统中的一条记录(“键/值”中的“值”)可能是您内心的Map&lt;Number, Number&gt;queue 访问方法(或btree,FWIW)提供了外部Map&lt;Number, Record&gt;

Berkeley DB 没有为访问记录内的内容提​​供太多(实际上没有)帮助。因此,您仍然必须以某种允许随机访问和修改的方式表示您的内部 Map其内容。根据Map&lt;Number, Number&gt; 中第一个数字的大小,您可以创建一个简单的 C 样式数组。您可以使用 JSON 对象、protobuf 或其他任何您能想到的东西。

这种布局只有在外部地图中有很多条目时才有意义>,与您提到的内部地图大小的大约 200 个条目相比。记录级别锁定适用于整个内部 Map,因为那是您的记录。

另一种技术是从架构中的前两个Numbers 创建一个复合键。也就是说,Map&lt;NumberX, Map&lt;NumberY, NumberZ&gt; 变成了一个具有键 NumberX_NumberY 和值 NumberZ 的数据库。这将使您可以快速随机访问内部映射中的任何特定条目,但您必须使用光标来检索整个内部映射中的所有条目。

【讨论】:

  • Berkeley DB 似乎不允许对记录的值部分进行操作——Oracle link。在我的用例中,指标的批量增量将非常频繁且同时发生。您仍然认为 Berkeley DB 或 LMDB 是合适的解决方案吗?
  • 好吧,同时在同一个“记录”上会是一个问题。您可以考虑按照我最后建议的那样拆分数据,方法是为每个单独的指标制作记录,并拥有一个由两个 Map 键组合而成的键(例如,通过将其中一个数字移动 N 位,然后与另一个数字进行或运算)。您至少需要使用游标来检索批量指标。
  • FWIW,我认为对任何单个记录的并发修改对于几乎所有数据库来说都是一个问题。使用嵌入式数据库,您可以控制更新记录的方式。但是,这并没有什么魔力……您要么必须处理事务并重试冲突更新,要么锁定,要么记录,或以上所有。
  • 我不确定您是如何使用“记录”的。您是指对计数器的并发更新,还是对特定Item 的并发更新。在任何情况下,通过锁定记录(Item)很容易解决问题,因为它正在更新;这在数据库中并不少见。 Berkeley DB 队列有它,但问题是它们不支持数据库更新值或Map 数据类型,所以我必须使用你的复合方法来组织我的数据。更新将涉及从数据库读取、在应用程序中修改以及写入数据库。
  • 感谢您迄今为止的帮助。除非你对Berkeley DB 有任何更重要的优点或对Aerospike 有明显的缺点,否则我会选择Aerospike
猜你喜欢
  • 1970-01-01
  • 2021-11-03
  • 2021-10-16
  • 2022-11-28
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
相关资源
最近更新 更多