[英]Single table DynamoDB design tips
我有一个旧应用程序,我正在对其进行现代化改造并将其带到 AWS。 我将为数据库使用 DynamoDB,并希望使用单表设计的 go。 这是一个多租户应用程序。
这些应用程序将包括组织、网点、客户和交易。 一切都源于一个组织,一个组织可以有多个网点,网点可以有多个客户,客户可以有多个交易。
访问模式预计如下:
我一直在阅读单表设计并利用主键和排序键来启用这种访问,但现在我不太清楚表/架构设计。 客户将附加 outletID 和 OrganiastionID,所以我应该始终知道这些 ID
数据结构(可修改)
组织:
网点:
顾客:
交易:
通过对您的实体和访问模式的透彻理解,您有了一个良好的开端,我已经尝试为这些访问模式建模。 但请记住,这不是解决方案 model 的唯一方法,DynamoDB 中的数据建模是迭代的,因此这种特定设计很可能不适合 100% 的用例。
有了免责声明,让我们开始吧!
我使用名为data
的单个表和名为 GSI1 和 GSI2 的全局二级索引 (GSI) 为您的访问模式建模。 每个 GSI 都有分别名为 GSI#PK 和 GSI#SK 的分区键和排序键。
基表模拟以下访问模式:
getItem where PK=CUST#<id> and SK = A
query where PK=CUST#<id> and SK begins_with TX
getItem where PK=ORG#<id> and SK = A
query where PK=OUT#<id>#CUST
最后一个访问模式可能需要更多解释。 我选择了 model 使用独特的 PK/SK 模式,其中 PK 是OUT#<id>#CUST
,SK 是CUST#<id>
。 当您的应用程序为特定客户记录交易时,它可以使用批量写入操作在 DDB 中插入两条记录。 批量写入操作将执行两个操作:
CUST#1
和 SK = TX#<id>
)OUT#<id>#CUST
和 SK = CUST#<id>
)。 如果这条记录已经存在,DynamoDB 将只覆盖现有记录,这对您的用例来说很好。转到 GSI1:
GSI1 支持以下操作:
query GSI1 where GSI1PK = ORG#<id>
query GSI1 where GSI1PK = OUT#<id>
最后,还有 GSI2
GSI2 支持以下事务:
query GSI2 where GSI2PK = ORG#<id>
query GSI2 where GSI2PK=OUT#<id> and GSI2SK between <period1> and <period2>
对于您的最终访问模式,您要求支持按 email 或姓名搜索客户。 DynamoDB非常擅长通过主键查找项目。 DynamoDB不适合搜索,因为搜索需要模糊或部分匹配。 如果您需要 email 或名称的精确匹配,您可以在 DynamoDB 中通过将电子邮件//名称合并到用户项的主键中来实现。
我希望这能给您一些关于如何 model 您的访问模式的想法!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.