【问题标题】:How to join tables in AWS DynamoDB?如何连接 AWS DynamoDB 中的表?
【发布时间】:2016-08-13 17:24:59
【问题描述】:

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

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

【问题讨论】:

    标签: amazon-web-services amazon amazon-dynamodb


    【解决方案1】:

    您说得对,DynamoDB 并非设计为关系数据库,也不支持联接操作。您可以将 DynamoDB 视为一组键值对。

    您可以在多个表中使用相同的键(例如 document_ID),但 DynamoDB 不会自动同步它们或具有任何外键功能。一个表中的 document_ID 虽然名称相同,但在技术上与不同表中的文档 ID 是不同的集合。由您的应用软件确保这些密钥已同步。

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

    有一点需要注意,Amazon EMR 确实允许连接 DynamoDB 表,但我不确定这就是您要查找的内容:http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/EMRforDynamoDB.html

    【讨论】:

    • 谢谢!加入将是一个例外,而不是设计规则/要求。在逐个查询文档然后在应用程序端加入时,您对性能/计费/.. 惩罚有什么想法吗?我仍然认为 DynamoDB 会更适合我的情况,但是我不知道对于像这样的特殊情况会不会有任何明显的劣势。
    • @Centurion,如果您事先知道您的 document_id (或类似的),那么您可以从每个表中获取相关的记录。从每个表中获取一条记录并不昂贵,然后加入它们似乎非常合理。当您需要查询或扫描时会发生昂贵的事情:DynamoDB 对在扫描/查询中检索到的每条记录收费,即使您实际上并未将它们返回给应用程序。每当您进行查询或扫描时,就有机会更详细地检查该操作以尝试消除查询/扫描。
    【解决方案2】:

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

    如果您发现自己需要复杂的读取查询,您可能会陷入期望 DynamoDB 表现得像 RDBMS 的陷阱,但事实并非如此。转换和塑造您写入的数据,保持读取简单。

    现在磁盘比计算便宜得多 - 不要害怕去规范化。

    【讨论】:

      【解决方案3】:

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


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

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

      DynamoDB 二级索引

      有什么好处?

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

      注意事项

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

      DynamoDB + Glue + S3 + Athena

      有什么好处?

      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) 查看blog,了解有关各个方法的更多详细信息。

      【讨论】:

      • 很棒的反应...这是我一直想知道的一个领域,也会去看看 Rockset!
      【解决方案4】:

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

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

      我的回答非常低效,但这是目前唯一解决所提出问题的方法。

      我急切地等待更好的答案。

      【讨论】:

      • 我急切地等待一个更好的答案。我也是。
      【解决方案5】:

      我知道我的回复稍微晚了几年。但是,我能够挖掘到一些关于 Amazon DynamoDB 和 Joins 的额外信息,这可能会使您受益(或者可能是其他人,他们可能会在将来研究此信息时偶然发现此讨论)。

      为了切入主题,我能够在 Amazon DynamoDB 网站上找到一些文档,其中指出可以使用 Apache HiveQL 查询语言来对 Amazon DynamoDB 表、列和数据等执行联接。

      在 DynamoDB(使用 HiveQL)中查询数据: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.Querying.html

      使用 Amazon DynamoDB 和 Apache Hive: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.Tutorial.html

      在 Amazon EMR 上使用 Apache Hive 处理 Amazon DynamoDB 数据: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.html

      如果不是原始海报,我希望这些信息对某人有所帮助。

      【讨论】:

      • 小心!即使是 Hive 也无法发挥作用,它只是顶部的一个便利层,内置了一些缓存。如果您想跨多个 DynamoDB 实体聚合数据,您将产生每个实体的读取成本。您甚至可能以昂贵的扫描操作告终。见docs.aws.amazon.com/amazondynamodb/latest/developerguide/…
      • 感谢您的提示以及指向开发人员指南的链接。非常感谢您的反馈。
      【解决方案6】:

      最近,我有同样的要求,需要在 dynamoDb 中使用 avg 和 sum 等连接和聚合函数,为了解决这个问题,我使用了 Cdata JDBC 驱动程序,它运行良好。它支持连接以及聚合函数。虽然,由于 Cdata 的许可成本,我也在寻找避免使用 cdata 的解决方案。

      【讨论】:

        【解决方案7】:

        当我需要这样做时,我在 python 中使用 pandas 来跨内存中的表进行连接。

        正如已经说过的那样,它并不理想,dynamo DB 不是关系数据库,但有时您需要做一些事情,例如维护两个表中 ID 之间的映射,如果发生这种情况,请使用 pandas 之类的库使用 SDK 可以帮助您。

        我有一个正在使用 dynamo DB 的应用程序,现在我希望我只是选择使用 postgres。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-11-11
          • 1970-01-01
          • 2016-12-28
          • 2018-07-17
          • 2021-09-19
          • 1970-01-01
          • 2016-03-11
          相关资源
          最近更新 更多