这是机票在线商店的数据库(如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
我认为第一种选择更直观(?),但我也认为额外的连接有时维护起来会很痛苦
我应该问自己什么问题(标准)来决定这两个问题?
2条答案
按热度按时间zyfwsgd61#
在设计关系数据库时,连接的数量可能不是你需要问自己的最重要的问题。
最重要的问题是如何确保数据的完整性。数据完整性最好与您介绍的第一个选项保持一致,因此这是您应该使用的选项。
如果连接是困扰您的问题,那么您可以始终使用视图来“展平”数据。
但是为什么第一种选择更好呢?因为
TimeSlot
表必须包含product
,date
以及time
-而第二种选择并没有将产品考虑在内TimeVariant
table。你可以加上
product
一些dba会建议,作为最好的选择(那些dba会反对使用代理键),但就个人而言,尽管我自己不是dba,但我认为代理键有它的优点,其中一个正是您在这里所拥有的优势—您可以使用一个列而不是三个列来连接两个表—这使您的工作更加轻松(并且通过强制表的自然键的唯一性,代理键没有完整性问题)。dw1jzc5e2#
首先,您应该考虑是否要减少连接开销?如果是,则可以使用存储在视图中的展平数据。
第一个案例
在timeslotvariant中,您添加了variant和timeslot,只有通过查询timeslotvariant表才能获得所需的数据。在这种情况下,您的数据完整性正常。
第二种情况
如果将产品密钥添加到timeslotvariant中,那么只显示产品列表就可以了,尽管时间和日期也可以重新输入。
我的建议是保留第一个案例,并将展平数据存储在视图中。