1

我的 Python Web 应用程序使用 DynamoDB 作为其数据存储,但这可能适用于在应用程序层完成索引一致性的其他 NoSQL 表。我正在对数据进行非规范化并在几个表中创建索引以方便查找。

例如,对于我的用户表:

* Table 1: (user_id) email, employee_id, first name, last name, etc ...
  Table 2: (email) user_id
  Table 3: (employee_id) user_id

表 1 是我存储用户信息的“主表”。如果 user_id 已知,则可以在单个 GET 查询中检索有关用户的所有信息。

表 2 和表 3 支持通过电子邮件或employee_id 进行查找,需要先查询这些表以获取 user_id,然后再查询表 1 以检索其余信息。

我担心的是非规范化数据——处理表 1 中的删除以确保从表 2 + 3 中删除匹配数据的最佳方法是什么?还确保插入?

现在我的事件链是这样的:

1. Insert row in table 1
2. Insert row in table 2
3. Insert row in table 3

最后添加“检查”是否有意义?就像是:

4. Check that all 3 rows have been inserted.
5. If a row is missing, remove rows from all tables and raise an error.

还有其他技巧吗?

4

2 回答 2

2

简短的回答是:没有办法确保一致性这是您在迁移到NoSQL以换取性能和可扩展性时同意支付的价格。

DynamoDB-mapper 有一个“事务引擎”。事务对象是普通的 DynamoDB 项目,可以持久化。这样,如果一组逻辑操作(即事务)成功,我们可以通过查看持久状态来确定它。但我们无法确定它没有...

做一点广告:),dynamodb-mapper 事务引擎支持

  • 单个/多个目标
  • 子交易
  • 事务创建对象(尚未发布)

如果您正在滚动自己的映射器(这是一项令人愉快的任务),请随时查看我们的源代码:https ://bitbucket.org/Ludia/dynamodb-mapper/src/52c75c5df921/dynamodb_mapper/transactions.py

免责声明:我是主要的 dynamodb-mapper 项目之一。随意贡献:)

于 2012-09-10T14:33:29.257 回答
0

免责声明:我实际上并没有使用过 DynamoDB,只是查看了数据模型和 API,所以请看它的价值。

您提供的用例是数据的一个主表,其他表用于手动索引。这听起来确实像是为 RDBMS 工作(可能需要一些分片以促进增长)。但是,如果这不会削减它,这里有几个想法可能对你有用,也可能不适合你。

A. 保持原样。如果您永远不会从索引表中提供数据,那么只要您首先处理主表,您就可以负担得起延迟删除和插入。假设发生这种情况:

1) Delete JDoe from Main table
xxxxxxxxxx Process running code crashes xxxxxxx
2) Delete from email index       // Never gets here
3) Delete from employee_id index // Never gets here

好吧,如果有一个“电子邮件”查询,您将从索引中解析相应的 user_id(现在已经过时),但它不会显示在主表上。您知道出了点问题,因此您可以返回失败/错误并清理索引。换句话说,您只需处理一些陈旧的数据,并为自己省去麻烦,并在必要时对其进行清理。您必须弄清楚预期会有多少陈旧数据,并且可能编写一个脚本来每天进行一些内务处理。

B. 如果你真的想模拟锁和事务,你可以考虑使用 Apache Zookeeper 之类的东西,它是一个分布式系统,用于管理锁等共享资源。这将是更多的工作和开销,但你可以设置它来做你想做的事。

于 2012-09-11T16:34:09.817 回答