首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带邻接表的DynamoDB单表模式设计

带邻接表的DynamoDB单表模式设计
EN

Stack Overflow用户
提问于 2021-08-09 21:19:52
回答 1查看 121关注 0票数 2

我正在努力理解如何正确地设计DynamoDB模式。我读过几篇文章,看过一些YouTube视频,但老实说,我还不太舒服。

这就是我试图正确设计的:

  • 两个实体,“位置”(id & name)和"vehicle“(id & name)
  • 一个位置可以有0-n个车辆。
  • 车辆可以在0-1的位置。

访问模式:

  • 获取所有可用位置的列表(id & name)
  • 获取所有可用车辆及其当前位置的列表(id、名称、位置id、位置名称)。
  • 获取给定位置的所有车辆的列表(id,名称)

我读过邻接列表,因为会有n-m关系,所以我决定试一试。

这就是我想出来的:

代码语言:javascript
复制
# | PK (GSI1-SK)         | SK (GSI1-PK)       | DATA
==|======================|====================|==============
1 | LOCATION#locationId1 | A                  | locationName1
2 | LOCATION#locationId2 | A                  | locationName2
3 | LOCATION#locationId1 | VEHICLE#vehicleId1 |
4 | LOCATION#locationId1 | VEHICLE#vehicleId2 |
5 | LOCATION#locationId2 | VEHICLE#vehicleId3 |
6 | VEHICLE#vehicleId1   | A                  | vehicleName1
7 | VEHICLE#vehicleId2   | A                  | vehicleName2
8 | VEHICLE#vehicleId3   | A                  | vehicleName3

#1-2和#6-8是我的实体记录,那些有实体本身的额外数据的记录(例如它的名称)。

#3-5是我如何设计一段关系的一个例子。我增加了一个倒置的GSI,以便能够以两种方式进行搜索。

回到我的访问模式:

  • 获取所有可用位置的列表(id & name) 查询GSI1 for SK=A,PK以LOCATION#开头
  • 获取所有可用车辆及其当前位置的列表(id、名称、位置id、位置名称)。 查询GSI1 for SK=A,PK以VEHICLE#开头 对于每个结果项,查询GSI1 for SK=VEHICLE#vehicleId和PK以LOCATION#开头 对于每个结果项,PK=LOCATION#locationId和SK=A的查询表 ..。这似乎不对
  • 获取给定位置的所有车辆的列表(id,名称) PK=LOCATION#locationId和SK的查询表以VEHICLE#开头 对于每个结果项,PK=VEHICLE#vehicleId和SK=A的查询表 ..。这似乎不对

邻接列表看起来是设计复杂关系的一种很好而干净的方法,但要么我做错了什么(可能),要么它们带来了大量的查询,这些查询是查找事物所必需的。

如有任何建议,敬请见谅。

EN

回答 1

Stack Overflow用户

发布于 2021-08-13 03:19:28

我在DynamoDB工作台中对此进行建模:

  1. Main Index (PK -> SK)
  2. GSI1 (PK1 -> SK)

为了:

  • “获取所有可用位置的列表(id & name)”

从GS1 PK1="ALL#LOCATION“中选择*

  • 获取所有可用车辆及其当前位置的列表(id、名称、位置id、位置名称)。

从PK="ALL#VEHICLE“的主索引中选择*

  • 获取给定位置的所有车辆的列表(id,名称)

从GSI1 PK1="LOC#ID“中选择*

这里有几件事:

  • 在所有分区密钥之间分发流量是很重要的。我在这个设计中使用"ALL#“分区键。理想情况下,您可以将其分解为几个技巧,比如使用日期或时间戳来开始一天。您可以将它们随机分布在固定数量的"ALL#“记录上,然后随机查询1(如果用例允许的话)。如果你有数以百万计的地点,这可能是可以的。这就是你做这些决定的方式:想想数据的流量和行为。
  • 为了同时使用这两种索引,我将"ALL#LOCATION“和"ALL#VEHICLE”分区键放在不同的索引中。
  • 注意,车辆4没有PK1。看看GSI1会发生什么。这就是所谓的稀疏索引。
  • 我取消了车辆与位置的关系。假设位置ID和位置名称是不可变的,那么这样做是可以的,问题是当您去角色化的属性是可变的时,如果可能的话,请避免这样做。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68718651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档