【问题标题】:Database design, reducing join数据库设计,减少join
【发布时间】:2020-05-24 02:30:48
【问题描述】:

这是一个用于门票在线商店的数据库(例如 Airbnb 体验)

对于产品(票),

有可用的日期(和时间)

在有空的日子,
- 可能有多种选择(例如初级班、高级班)
- 有一个可以出售的数量(在多个选项之间共享)

表示这一点的一种方法是

Product
  name

Variant (Option)
  product

TimeSlot
  product
  date
  time
  quantity


TimeslotVariant
  variant
  timeslot

另一种方法如下。

我看到两个主要区别,

  • 第一个区别

    • 以上:您需要加入TimeSlot 以查找特定日期的变体。
    • 以下:可直接查询TimeVariant
  • 第二个区别

    • 上图:[{date, time, [variant1, variant2], quantity}](我认为客户端应用程序更喜欢这个)
    • 下方:[{date, time, variant1}, {date, time, variant2}] + [{date, time, quantity}]

Product
  name

Variant (Option)
  product


TimeSlot
  product
  date
  time
  quantity

TimeVariant
  variant
  date
  time

我认为第一个选项更直观(?),但我也认为有时维护额外的连接可能会很痛苦

我应该问自己哪些问题(标准)才能在这两者中做出决定?

【问题讨论】:

  • 时隙变体总是(强调永远、永远、永远,即使需求发生变化......)是否与时隙一致?如果是,那么第一个选项更好;如果不是,肯定是第二个更灵活。
  • 我很难想象未来的第二个要求会更好,(不是说没有,只是我对这个问题本身不熟悉)你能给我一个吗?跨度>
  • “直观”是客观的。参照完整性不是。归结为@TheImpaler 提出的问题。此外,连接也没有问题。

标签: sql database database-design


【解决方案1】:

恕我直言,连接数可能不是您在设计关系数据库时需要问自己的最重要问题。

最重要的问题是如何确保保护数据完整性。 您提供的第一个选项可以最好地保持数据完整性,因此您应该选择此选项。

如果连接是困扰您的问题,您始终可以使用视图来“扁平化”数据。

但是为什么第一个选项更好呢? 因为TimeSlot 表的主键(或至少是自然键)必须由productdatetime 组成 - 而第二个选项在@ 中没有考虑乘积987654325@ 表。

您也可以将product 添加到该表中,并且一些 DBA 会建议将其作为最佳选择(那些将是反对使用代理键的 DBA) - 但就个人而言,即使我不是我自己是一名 DBA,我认为代理键有它的优势,其中一个正是您在这里所拥有的 - 您可以使用单列而不是三列来连接两个表 - 这使您的生活更加轻松(并且强制执行唯一性表的自然键,代理键没有完整性问题)。

【讨论】:

  • 您能否详细说明you can use a single column to join two tables instead of three 单列将是TimeSlot 的代理键,以及two 和`三个`表是什么?
  • 我的意思是使用一列而不是三列来连接两个表。现在不那么混乱了吗? (如果是,我会将其编辑到我的答案中)
【解决方案2】:

首先您应该认为您想减少加盟费用吗?如果是,那么您可以使用存储在视图中的展平数据。

第一个案例

TimeslotVariant 中,您添加了 varianttimeslot,只有通过查询 TimeslotVariant 表,您才能获得您想要的数据。在这种情况下,您的数据完整性还可以。

第二种情况

如果您将产品密钥添加到您的 TimeslotVariant,那么仅显示产品列表就可以达到目的,尽管时间和日期也会重新输入。

我的建议是保留第一个案例并将展平的数据存储在视图中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    相关资源
    最近更新 更多