【问题标题】:DynamoDB table design for business hours针对营业时间的 DynamoDB 表设计
【发布时间】:2020-04-23 19:36:41
【问题描述】:

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

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

这是我的要求

  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)之间的企业(或企业列表)工作时间

我尝试过的:

定义了一个表,其中业务 ID 是 partition key (HASH),特殊日期/星期几是 sort key (RANGE)。

这种方法的问题是我不能按多个营业时间查询,除非我使用scan api,由于操作昂贵,不推荐使用。

请建议我应该为这个应用程序使用什么样的表格设计。

【问题讨论】:

    标签: database amazon-web-services database-design amazon-dynamodb


    【解决方案1】:

    您可能需要首先在 DynamoDB 之外构建总体逻辑,确定业务是否正常运行,并且仅将 Dynamo 中的采石场用于该逻辑的子集。

    假设我们使用 DynamoDB 查询正常工作时间,不包括假期和特殊情况等逻辑,但您可以在访问 Dynamo 后使用它进行过滤。您无法在 Dynamo 中构建一个查询来回答您的所有问题,这更像是您可以在 SQL 中执行的操作。

    假设我们有一个与正常工作日相关的值的表/子集。所以你有这样的东西:

    分区键 (PK):business,范围键 (RK):dayOfWeek,以及属性,opens & closes

    然后我们可以创建 2 个 GSI:

    • PKdayOfWeek RKopens
    • PKdayOfWeek RKcloses

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

    • PK == 星期一 & 开放时间
    • PK == 星期一 & 关闭 > 下午 4 点

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

    显然,每天进行一次 PK 可能不是一个好主意,因为您将只有 7 个分区。所以你会怎么做?好吧,您的查询中可能有比简单的日期更多的条件,例如,商店类型、商店所在的城市等。这意味着您将拥有类似以下内容的 PK:city-category-dayOfWeek

    同样,在排序方面,您可能希望评分较高的商店成为第一选择,因此您可能会有类似:{rating}-{open} & {rating}-{closes}

    您只需要有创意,首先在设计表格之前布局所有查询。我真的很喜欢this关于桌子设计的视频,太棒了。

    【讨论】:

    • 感谢您的回答!它真的帮助我更了解如何设计我的桌子。真的很喜欢随附的视频!
    猜你喜欢
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 2015-03-07
    • 2021-10-05
    • 1970-01-01
    • 2018-01-21
    相关资源
    最近更新 更多