【问题标题】:What is the best DynamoDB architecture for storing several document types?存储多种文档类型的最佳 DynamoDB 架构是什么?
【发布时间】:2018-07-01 04:24:45
【问题描述】:

阅读 Amazon DynamoDB 文档我仍然无法理解将它用于最常见任务的最佳方式是什么 - 拥有多种类型的文档(例如,“用户”、“事件”、“新闻”)具有唯一 ID。 据我了解,由于 DynamoDB 仅意味着对文档主键的限制,我们可以在其中存储任何具有主键的数据。因此,最自然的解决方案如下:

- partion key 'type' is document type - 'user', 'event' etc
- sort key is uuid

但这与官方文档相矛盾,根据它更好的是:

- partition key 'id' is just uuid
- sort key is type - 'user', 'event'

但是由于键名,这与常识相矛盾。 最后,我们可以为用户、事件和新闻创建 3 个不同的 DynamoDB 实例,所有实例都具有 uuid 作为分区键并且没有排序键。 哪种解决方案是 DynamoDB 使用的最佳或常见做法?

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb


    【解决方案1】:

    这是一个主观的问题,但我会试一试并给你一些理由。

    1) 您可以使用“uuid:type”作为您的主 ID。您不应该使用 type 作为分区 id 的原因是因为您的所有数据最终都将位于每种类型的单个分区上。分区是 Dynamo 和 S3 提供并行化的方式。如果这样做,您将极大地限制摄取和查询速度。

    2) 出于定价原因,我个人更喜欢一张桌子,而不是每种类型一张。您按表的读/写容量付费。使用单个表,您将无需跟踪和管理。调整一张表的容量比调整三张表的容量更容易。

    3) 在这种情况下我不会使用排序键。

    【讨论】:

    • 感谢您的回复。不幸的是,我不知道“uuid:type”分区键。在我看来,仅使用 uuid 没有任何优势(当然,所有 uuid 对于所有数据都是唯一的)。
    • 关于单个(或更少)表的吞吐量聚合的要点。
    • @arsenii fomin。我所说的“uuid:type”的意思是使用附加类型的 uuid 作为分区键。优点是它可以让您在同一个表中保存许多数据类型,我认为出于我所描述的定价原因而需要这样做。
    • @jeff 我还是不太清楚你的意思。如果 uuid 对于任何对象都是唯一的,您仍然可以仅使用它在同一个表中存储不同的数据类型。无论如何,这里的问题是通常的任务是获取某种类型的所有项目。由于您不知道 uuid 并且无法查询它们,因此您将不得不对所有此类任务使用扫描,这是非常无效的。您能否提供任何想法如何在一个表中存储多种文档类型而不使用扫描来接收相同类型的所有文档?
    • 哦。我知道了。我没有从你的问题中明白这一点。您可能会更新问题以反映该常见用例。在那种情况下,我可能会使用不同的表。您可以在 DynamoDB 表中存储“索引记录”,其中分区 ID 类似于“用户”,排序键为“uuid”。这将允许您扫描所有用户的 uuid,然后对每个用户记录进行二次扫描。但是,所有索引记录都将在单个分区上结束,因此如果您有数百万条记录,这可能不是一件好事。
    【解决方案2】:

    明确的陈述需要具体说明,但对您的数据的外观做出一些假设:

    - partion key 'type' is document type - 'user', 'event' etc
    - sort key is uuid
    

    上面的想法几乎可以肯定是一个糟糕的设计。您最终会得到一些大分区,从而导致性能问题。此外,我建议您最终对查询进行扫描。

    - partition key 'id' is just uuid
    - sort key is type - 'user', 'event'
    

    上述想法可能是一个糟糕的设计。排序键没有给您带来真正的好处。假设您需要单独访问用户或事件等,您最终将执行扫描。

    它极有可能为用户、事件等提供单独的表格。这些表中的键实际上只取决于您的数据。 UUID 可能是一个不错的选择,但这取决于您希望如何查询数据。基于日期的属性,尤其是对于事件,通常是很好的排序键。

    我建议您查看this answer,这是对大致相同问题的更长答案。

    【讨论】:

    • 感谢您的回复。我也读了你的长答案。吞吐量是一件棘手的事情,我根本不会注意到。我真的认为“分区”是哈希键的一个非常糟糕的命名。现在有了基本的了解,如果我们有相关数据,我仍然不确定表格应该是什么样子。例如,我们有用户和用户交易。拥有从用户 uuid 创建的分区部分和从事务时间戳创建的排序部分(对用户为空)是一个好主意吗?因此用户和特定用户的所有事务具有相同的分区部分但不同的排序部分。
    • 所有此类问题的答案都是“视情况而定”。这主要取决于您希望如何访问您的数据——驱动您的设计。如果您知道要执行哪些查询,则可以围绕它设计架构。这在某种程度上还取决于您的优先事项 - 速度、成本、简单性等。
    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2010-09-05
    • 2017-04-21
    • 2021-07-05
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多