如何在AWS DynamoDB中连接表?

Cen*_*ion 34 amazon amazon-web-services amazon-dynamodb

我知道整个设计应该基于自然聚合(文档),但是我正在考虑为本地化(lang,key,text)实现一个单独的表,然后在其他表中使用键.但是,我无法找到任何关于这样做的例子.

任何指针可能会有所帮助!

Rei*_*hes 33

您是对的,DynamoDB不是设计为关系数据库,不支持连接操作.您可以将DynamoDB视为一组键值对.

您可以在多个表中使用相同的键(例如document_ID),但DynamoDB不会自动同步它们或具有任何外键功能.一个表中的document_ID虽然名称相同,但在技术上与另一个表中的不同.由应用程序软件决定是否同步这些密钥.

DynamoDB是一种考虑数据库的不同方式,您可能需要考虑使用托管关系数据库,例如Amazon Aurora:https://aws.amazon.com/rds/aurora/

需要注意的一点是,Amazon EMR确实允许加入DynamoDB表,但我不确定您的需求是什么:http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/EMRforDynamoDB.html

  • @Centurion,如果您事先知道您的 document_id (或类似的),那么您可以从每个表中获取关联的记录。从每个表中获取一条记录并不昂贵,并且在之后连接它们似乎非常合理。当您需要查询或扫描时,就会发生昂贵的事情:DynamoDB 会对扫描/查询中检索到的每条记录收费,即使您实际上并未将它们返回给应用程序。每当您查询或扫描时,这都提供了更详细地检查该操作的机会,以尝试消除查询/扫描。 (2认同)

Ani*_*han 16

更新:此答案完全符合定义的社区准则,而不是仅谈论商业解决方案的非答案。


我在这个领域多次看到的一个解决方案是从 DynamoDB 同步到一个单独的数据库,该数据库更适合您正在寻找的操作类型。

我写了一篇关于这个主题的博客,比较了我见过的人们解决这个问题的各种方法,但我将在这里总结一些关键的要点,这样你就不必阅读所有内容。

DynamoDB 二级索引

有什么好的?

  1. 快速且不需要其他系统!
  2. 适用于您正在构建的非常具体的分析功能(如排行榜)

注意事项

  1. 二级索引数量有限,查询保真度有限
  2. 如果您依赖扫描,则价格昂贵
  3. 直接使用生产数据库进行分析的安全和性能问题

DynamoDB + 胶水 + S3 + 雅典娜

建筑学

有什么好的?

  1. 所有组件都是“无服务器”的,不需要配置基础设施
  2. 易于自动化 ETL 管道

注意事项

  1. 数小时的高端到端数据延迟,这意味着陈旧数据
  2. 查询延迟从几十秒到几分钟不等
  3. 模式强制可能会丢失混合类型的信息
  4. 如果源中的数据结构发生变化,ETL 过程可能需要不时维护

DynamoDB + Hive/Spark

建筑学

有什么好的?

  1. 在 DynamoDB 中查询最新数据
  2. 除了指定模式外,不需要 ETL/预处理

注意事项

  1. 当字段具有混合类型时,架构强制可能会丢失信息
  2. EMR 集群需要一些管理和基础设施管理
  3. 对最新数据的查询涉及扫描并且成本高昂
  4. 直接在 Hive/Spark 上查询延迟在几十秒到几分钟之间变化
  5. 在操作数据库上运行分析查询的安全性和性能影响

DynamoDB + AWS Lambda + Elasticsearch

有什么好的?

  1. 全文搜索支持
  2. 支持多种类型的分析查询
  3. 可以处理 DynamoDB 中的最新数据

注意事项

  1. 需要管理和监控用于摄取、索引、复制和分片的基础设施
  2. 需要单独的系统来确保 DynamoDB 和 Elasticsearch 之间的数据完整性和一致性
  3. 扩展是手动的,需要配置额外的基础设施和操作
  4. 不支持不同索引之间的连接

DynamoDB + Rockset

建筑学

有什么好的?

  1. 完全无服务器。无需操作或配置基础设施或数据库
  2. DynamoDB 和 Rockset 集合之间的实时同步,因此它们之间的间隔不会超过几秒钟
  3. 监控以确保 DynamoDB 和 Rockset 之间的一致性
  4. 基于数据构建的自动索引支持低延迟查询
  5. 可以扩展到高 QPS 的 SQL 查询服务
  6. 加入来自其他来源的数据,例如 Amazon Kinesis、Apache Kafka、Amazon S3 等。
  7. 通过 REST 和使用客户端库与 Tableau、Redash、Superset 和 SQL API 等工具集成。
  8. 功能包括全文搜索、摄取转换、保留、加密和细粒度访问控制

注意事项

  1. 不太适合存储很少查询的数据(如机器日志)
  2. 不是事务性数据存储

(完全披露:我在产品团队 @ Rockset 工作)查看博客以了解有关各个方法的更多详细信息。


Llo*_*oyd 15

使用DynamoDB,而不是加入我认为最好的解决方案是将数据存储在您打算稍后读取的形状中.

如果您发现自己需要复杂的读取查询,那么您可能已陷入期望DynamoDB表现得像RDBMS的陷阱,但事实并非如此.转换并整形您编写的数据,使读取变得简单.

这些天磁盘比计算便宜得多 - 不要害怕反规范.


小智 5

您必须查询第一个表,然后使用下一个表的get请求遍历每个项目。

其他答案不能令人满意,因为1)不回答问题,更重要的是2)您如何在知道表的未来应用之前设计表?技术债务太高,无法合理地涵盖无限的未来可能性。

我的回答效率极低,但这是当前提出的问题的唯一解决方案。

我热切期待一个更好的答案。

  • 我热切地等待更好的答案。我也是。 (2认同)