繁体   English   中英

单表 DynamoDB 设计技巧

[英]Single table DynamoDB design tips

我有一个旧应用程序,我正在对其进行现代化改造并将其带到 AWS。 我将为数据库使用 DynamoDB,并希望使用单表设计的 go。 这是一个多租户应用程序。

这些应用程序将包括组织、网点、客户和交易。 一切都源于一个组织,一个组织可以有多个网点,网点可以有多个客户,客户可以有多个交易。

访问模式预计如下:

  • 通过 ID 获取客户
  • 按姓名或 email 搜索客户
  • 获取给定商店的所有客户
  • 获取客户的所有交易
  • 获取一个网点的所有交易
  • 获取给定时间段内某个网点的所有交易(时间戳将与每笔交易一起存储)
  • 获取给定组织的所有网点
  • 通过 ID 获取插座

我一直在阅读单表设计并利用主键和排序键来启用这种访问,但现在我不太清楚表/架构设计。 客户将附加 outletID 和 OrganiastionID,所以我应该始终知道这些 ID

数据结构(可修改)

组织:

  • ID
  • 姓名
  • 所有者
  • 奥特莱斯名单
  • 创建于(时间戳)

网点:

  • 机构编号
  • 分店名称
  • 客户数量
  • 交易笔数
  • 创建于(时间戳)

顾客:

  • ID
  • 组织ID
  • 出口编号
  • email
  • 交易总额
  • 总花费
  • 创建于(时间戳)

交易:

  • ID
  • 客户ID
  • 组织ID
  • 出口编号
  • 创建于(时间戳)
  • 类型
  • 价值

通过对您的实体和访问模式的透彻理解,您有了一个良好的开端,我已经尝试为这些访问模式建模。 但请记住,这不是解决方案 model 的唯一方法,DynamoDB 中的数据建模是迭代的,因此这种特定设计可能不适合 100% 的用例。

有了免责声明,让我们开始吧!

我使用名为data的单个表和名为 GSI1 和 GSI2 的全局二级索引 (GSI) 为您的访问模式建模。 每个 GSI 都有分别名为 GSI#PK 和 GSI#SK 的分区键和排序键。

基表

基表模拟以下访问模式:

  • 通过 ID 获取客户: getItem where PK=CUST#<id> and SK = A
  • 获取客户的所有交易: query where PK=CUST#<id> and SK begins_with TX
  • 通过 ID 获取出口: 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 中插入两条记录。 批量写入操作将执行两个操作:

  • 将新交易写入客户分区(例如 PK = CUST#1和 SK = TX#<id>
  • 将新记录写入 CUSTOMERLIST 分区(例如 PK = OUT#<id>#CUST和 SK = CUST#<id> )。 如果这条记录已经存在,DynamoDB 将只覆盖现有记录,这对您的用例来说很好。

转到 GSI1:

GSI1

GSI1 支持以下操作:

  • 按组织获取网点: query GSI1 where GSI1PK = ORG#<id>
  • 按出口获取交易: query GSI1 where GSI1PK = OUT#<id>
  • 在给定时间段内按出口获取交易:`query GSI1 where GSI1PK=OUT# and GSI1SK between and

最后,还有 GSI2

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM