DynamoDB table 为工作时间设计

DynamoDB table design for business hours

我正在尝试使用 DynamoDB 创建营业时间应用程序。

我看到了很多针对不同数据库的示例和架构设计,但就是找不到适合 DynamoDB 的 table 设计。

这是我的要求:

  1. 每个企业都应有默认工作时间(星期一 08:00 - 14:00、16:00 - 20:00)和特殊活动(26/11/2020 商店关闭/ 由于感恩节 10:00 - 14:00 之间开放)
  2. 每天可以有多个工作时长(08:00 - 14:00, 16:00 - 20:00)

这些是我需要允许的操作

  1. 为每个企业创建/编辑工作时间(包括特殊事件)
  2. 检查企业(或企业列表)现在是否营业 - 通过提供企业 ID 列表。
  3. 通过提供业务 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:

  • PKdayOfWeekRKopens
  • PKdayOfWeekRKcloses

如果商店在星期一下午 3 点到 4 点营业,现在我们可以执行两个查询:

  • PK == 星期一 & 下午 2 点开始营业
  • PK == 星期一 & 关闭 > 下午 4 点

并且只收集出现在两个查询中的值。

当然,PK 可能不是一个好主意,因为您只有 7 个分区。所以你会怎么做?好吧,您的查询中可能有更多的条件,而不仅仅是天,例如,商店类型、商店所在的城市等。这意味着您将拥有类似于:city-category-dayOfWeek 的 PK。

类似地,在排序方面,您可能希望评分较高的商店成为第一个选项,因此您可能有类似的内容:{rating}-{open} & {rating}-{closes}.

您只需要发挥创意,在设计 table 之前首先对所有查询进行布局。我真的很喜欢 this 关于 table 设计的视频,太棒了。