【发布时间】:2016-08-13 17:24:59
【问题描述】:
我知道整个设计应该基于自然聚合(文档),但是我正在考虑为本地化(语言、键、文本)实现一个单独的表,然后在其他表中使用键。但是,我找不到任何这样做的例子。
任何指针都可能会有所帮助!
【问题讨论】:
标签: amazon-web-services amazon amazon-dynamodb
我知道整个设计应该基于自然聚合(文档),但是我正在考虑为本地化(语言、键、文本)实现一个单独的表,然后在其他表中使用键。但是,我找不到任何这样做的例子。
任何指针都可能会有所帮助!
【问题讨论】:
标签: amazon-web-services amazon amazon-dynamodb
您说得对,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,而不是加入,我认为最好的解决方案是将数据存储在您以后打算读取的形状中。
如果您发现自己需要复杂的读取查询,您可能会陷入期望 DynamoDB 表现得像 RDBMS 的陷阱,但事实并非如此。转换和塑造您写入的数据,保持读取简单。
现在磁盘比计算便宜得多 - 不要害怕去规范化。
【讨论】:
更新:此答案完全符合定义的社区准则,而不是仅涉及商业解决方案的非答案。
我在这个领域多次看到的一个解决方案是从 DynamoDB 同步到一个更适合您正在寻找的操作类型的单独数据库。
我写了一篇关于这个主题的blog,比较了我看到人们解决这个问题的各种方法,但我会在这里总结一些关键要点,这样你就不必阅读所有内容了。
(完全披露:我在产品团队工作@Rockset) 查看blog,了解有关各个方法的更多详细信息。
【讨论】:
您必须查询第一个表,然后使用获取下一个表的请求遍历每个项目。
其他答案并不令人满意,因为 1) 不回答问题,更重要的是,2) 如何提前设计表格以了解其未来应用?技术债务太高了,无法合理地涵盖无限的未来可能性。
我的回答非常低效,但这是目前唯一解决所提出问题的方法。
我急切地等待更好的答案。
【讨论】:
我知道我的回复稍微晚了几年。但是,我能够挖掘到一些关于 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
如果不是原始海报,我希望这些信息对某人有所帮助。
【讨论】:
最近,我有同样的要求,需要在 dynamoDb 中使用 avg 和 sum 等连接和聚合函数,为了解决这个问题,我使用了 Cdata JDBC 驱动程序,它运行良好。它支持连接以及聚合函数。虽然,由于 Cdata 的许可成本,我也在寻找避免使用 cdata 的解决方案。
【讨论】:
当我需要这样做时,我在 python 中使用 pandas 来跨内存中的表进行连接。
正如已经说过的那样,它并不理想,dynamo DB 不是关系数据库,但有时您需要做一些事情,例如维护两个表中 ID 之间的映射,如果发生这种情况,请使用 pandas 之类的库使用 SDK 可以帮助您。
我有一个正在使用 dynamo DB 的应用程序,现在我希望我只是选择使用 postgres。
【讨论】: