sql数据库设计,减少连接

mkshixfv  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(263)

这是机票在线商店的数据库(如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

我认为第一种选择更直观(?),但我也认为额外的连接有时维护起来会很痛苦
我应该问自己什么问题(标准)来决定这两个问题?
zyfwsgd6

zyfwsgd61#

在设计关系数据库时,连接的数量可能不是你需要问自己的最重要的问题。
最重要的问题是如何确保数据的完整性。数据完整性最好与您介绍的第一个选项保持一致,因此这是您应该使用的选项。
如果连接是困扰您的问题,那么您可以始终使用视图来“展平”数据。
但是为什么第一种选择更好呢?因为 TimeSlot 表必须包含 product , date 以及 time -而第二种选择并没有将产品考虑在内 TimeVariant table。
你可以加上 product 一些dba会建议,作为最好的选择(那些dba会反对使用代理键),但就个人而言,尽管我自己不是dba,但我认为代理键有它的优点,其中一个正是您在这里所拥有的优势—您可以使用一个列而不是三个列来连接两个表—这使您的工作更加轻松(并且通过强制表的自然键的唯一性,代理键没有完整性问题)。

dw1jzc5e

dw1jzc5e2#

首先,您应该考虑是否要减少连接开销?如果是,则可以使用存储在视图中的展平数据。
第一个案例
在timeslotvariant中,您添加了variant和timeslot,只有通过查询timeslotvariant表才能获得所需的数据。在这种情况下,您的数据完整性正常。
第二种情况
如果将产品密钥添加到timeslotvariant中,那么只显示产品列表就可以了,尽管时间和日期也可以重新输入。
我的建议是保留第一个案例,并将展平数据存储在视图中。

相关问题