动态表设计模式

时间:2018-10-04 19:40:08

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

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

我是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来获取收件人的详细信息。根据{{​​3}}文档,这将意味着在Building表中将收件人ID作为排序键。

由于您只能使用表格的顶层元素(收件人不是该元素),因此按照准则LSI

似乎不可能
  

索引键属性可以包含基表中的任何顶级String,Number或Binary属性;其他标量类型,文档类型和集合类型是不允许的。

因此,我不希望在不创建另一个表的情况下实现此目的,我应该在该表中复制所有收件人,并更新它们,使表中发生的所有更新都发生。还有其他替代或更好的方法吗?

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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