DynamoDB table 为工作时间设计
DynamoDB table design for business hours
我正在尝试使用 DynamoDB
创建营业时间应用程序。
我看到了很多针对不同数据库的示例和架构设计,但就是找不到适合 DynamoDB
的 table 设计。
这是我的要求:
- 每个企业都应有默认工作时间(星期一 08:00 - 14:00、16:00 - 20:00)和特殊活动(26/11/2020 商店关闭/ 由于感恩节 10:00 - 14:00 之间开放)
- 每天可以有多个工作时长(08:00 - 14:00, 16:00 - 20:00)
这些是我需要允许的操作:
- 为每个企业创建/编辑工作时间(包括特殊事件)
- 检查企业(或企业列表)现在是否营业 - 通过提供企业 ID 列表。
- 通过提供业务 ID 列表和每个 ID 的日期范围,获取 2 个日期(例如 23/04/2020 - 25/04/2020)之间的业务(或业务列表)工作时间
我尝试过的:
定义了 table,其中业务 ID 为 partition key
(HASH
),特殊日期/星期几为 sort key
(RANGE
) .
这种方法的问题是我无法按多个营业时间进行查询,除非我使用 scan
api,由于操作昂贵,因此不推荐使用。
请建议我应该为这个应用程序使用哪种 table 设计。
您可能需要首先在 DynamoDB 之外构建总体逻辑,确定业务是否正常运行,并且仅将 Dynamo 中的采石场用于该逻辑的一个子集。
假设我们使用 DynamoDB 查询正常工作时间,不包括假期和特殊情况等逻辑,您可以在访问 Dynamo 后使用它进行过滤。您无法在 Dynamo 中构造一个查询来回答您所有的问题,这更像是您在 SQL.
中可以做的事情
所以假设我们有 Table/Subset 个与正常工作日相关的值。所以你有这样的东西:
分区键 (PK):business
,范围键 (RK):dayOfWeek
,以及属性,opens
& closes
。
然后我们可以创建 2 个 GSI:
- PK
dayOfWeek
RKopens
- PK
dayOfWeek
RKcloses
如果商店在星期一下午 3 点到 4 点营业,现在我们可以执行两个查询:
- PK == 星期一 & 下午 2 点开始营业
- PK == 星期一 & 关闭 > 下午 4 点
并且只收集出现在两个查询中的值。
当然,PK 可能不是一个好主意,因为您只有 7 个分区。所以你会怎么做?好吧,您的查询中可能有更多的条件,而不仅仅是天,例如,商店类型、商店所在的城市等。这意味着您将拥有类似于:city-category-dayOfWeek
的 PK。
类似地,在排序方面,您可能希望评分较高的商店成为第一个选项,因此您可能有类似的内容:{rating}-{open}
& {rating}-{closes}
.
您只需要发挥创意,在设计 table 之前首先对所有查询进行布局。我真的很喜欢 this 关于 table 设计的视频,太棒了。
我正在尝试使用 DynamoDB
创建营业时间应用程序。
我看到了很多针对不同数据库的示例和架构设计,但就是找不到适合 DynamoDB
的 table 设计。
这是我的要求:
- 每个企业都应有默认工作时间(星期一 08:00 - 14:00、16:00 - 20:00)和特殊活动(26/11/2020 商店关闭/ 由于感恩节 10:00 - 14:00 之间开放)
- 每天可以有多个工作时长(08:00 - 14:00, 16:00 - 20:00)
这些是我需要允许的操作:
- 为每个企业创建/编辑工作时间(包括特殊事件)
- 检查企业(或企业列表)现在是否营业 - 通过提供企业 ID 列表。
- 通过提供业务 ID 列表和每个 ID 的日期范围,获取 2 个日期(例如 23/04/2020 - 25/04/2020)之间的业务(或业务列表)工作时间
我尝试过的:
定义了 table,其中业务 ID 为 partition key
(HASH
),特殊日期/星期几为 sort key
(RANGE
) .
这种方法的问题是我无法按多个营业时间进行查询,除非我使用 scan
api,由于操作昂贵,因此不推荐使用。
请建议我应该为这个应用程序使用哪种 table 设计。
您可能需要首先在 DynamoDB 之外构建总体逻辑,确定业务是否正常运行,并且仅将 Dynamo 中的采石场用于该逻辑的一个子集。
假设我们使用 DynamoDB 查询正常工作时间,不包括假期和特殊情况等逻辑,您可以在访问 Dynamo 后使用它进行过滤。您无法在 Dynamo 中构造一个查询来回答您所有的问题,这更像是您在 SQL.
中可以做的事情所以假设我们有 Table/Subset 个与正常工作日相关的值。所以你有这样的东西:
分区键 (PK):business
,范围键 (RK):dayOfWeek
,以及属性,opens
& closes
。
然后我们可以创建 2 个 GSI:
- PK
dayOfWeek
RKopens
- PK
dayOfWeek
RKcloses
如果商店在星期一下午 3 点到 4 点营业,现在我们可以执行两个查询:
- PK == 星期一 & 下午 2 点开始营业
- PK == 星期一 & 关闭 > 下午 4 点
并且只收集出现在两个查询中的值。
当然,PK 可能不是一个好主意,因为您只有 7 个分区。所以你会怎么做?好吧,您的查询中可能有更多的条件,而不仅仅是天,例如,商店类型、商店所在的城市等。这意味着您将拥有类似于:city-category-dayOfWeek
的 PK。
类似地,在排序方面,您可能希望评分较高的商店成为第一个选项,因此您可能有类似的内容:{rating}-{open}
& {rating}-{closes}
.
您只需要发挥创意,在设计 table 之前首先对所有查询进行布局。我真的很喜欢 this 关于 table 设计的视频,太棒了。