【问题标题】:Dynamodb table design patternDynamodb 表设计模式
【发布时间】:2019-03-10 06:37:59
【问题描述】:

我不确定这是否是提出这个问题的正确地方。

我是 dynamodb 的新手,我正在努力想办法创建一个小型 Web 应用程序。我在这里阅读了最佳实践http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/BestPractices.html

我的桌子将是:

  1. 建筑物
  2. 租户(一栋建筑可以有多个租户,由楼层号标识)
  3. 收件人(每个楼层可以有多个收件人,基本上是租户的别名)
  4. 快递员
  5. 递送(与特定收件人绑定的快递员)

我目前设计架构的方法如下:

// Tables
// PK: Building Id, SK: name
- Building ID : {
  name: <Building Name>
  Tenants: [
     { TenantId: { Receipients: [{Receipient Id 1, Receipient Id 2...}] }
  ] 
}

// PK: Courier Id, SK: createdAt
- CourierId :  {
 name: <Courier name>
 ...
}

//PK: Not Sure, SK: Not Sure <-- This is where I messed up, looks relational, defeats the purpose?
- Deliveries: {
  receipient id: Courier id
}

为了列出所有交付以及收件人详细信息,我需要按收件人 ID 列出收件人详细信息。根据LSI 文档,这意味着将收件人 ID 作为 Building 表中的排序键。

由于您只能拥有表格的顶级元素(收件人不是那个),根据https://docs.amazonaws.cn/en_us/amazondynamodb/latest/developerguide/GSI.html 的指导方针,这似乎是不可能的

索引键属性可以由基表中的任何顶级字符串、数字或二进制属性组成;不允许使用其他标量类型、文档类型和集合类型。

所以,如果不制作另一个表格,我希望这可以实现,我应该复制所有收件人,更新他们在表格中发生的所有更新。还有其他替代方法或更好的方法吗?

由于投递似乎是快递员与收件人的一对一关系,是否可以在列出所有投递时保留 ID 并遍历所有收件人和快递员?

【问题讨论】:

    标签: amazon-web-services database-design amazon-dynamodb dynamodb-queries


    【解决方案1】:

    DynamoDB 可能不是满足您需求的最佳解决方案。据我了解,您有一个关系数据结构,主要在与交付相关的表中。 DynamoDB 旨在保留主要由一两个键请求的非结构化数据。它不是为了维护关系完整性或提供表连接而设计的。

    我不知道您是否有云开发经验,但使用云基础架构,您可以为每种数据结构拥有一个数据库。例如:

    1. 您可以在DynamoDB中维护您的建筑和快递数据,主要通过ids请求使用;甚至可能在同一张桌子上。您可以拥有不同结构的不同文档/对象;
    2. 您可以使用 RDS 将交货信息保存在关系数据库中。根据您的 AWS 区域,您可以尝试 Aurora Serverless。费用会更低。
    3. 如果您在 DynamoDB 对象中的信息不会变大(DynamoDB 对象/文档的限制为 400 kB),您可以仅将所有数据保存在一个对象中,并使用 DynamoDB 流将信息发送到搜索解决方案(CloudSearch或弹性搜索)。当您需要查询单个交付时,您使用搜索端点。当您需要建筑物或租户历史记录时,您可以使用 DynamoDB 端点。

    如果您扩大视野并结合使用多个资源,还有很多其他解决方案。

    【讨论】:

      猜你喜欢
      • 2018-04-27
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 2022-01-09
      相关资源
      最近更新 更多