Database design 如何在关系数据库中对此进行建模?

Database design 如何在关系数据库中对此进行建模?,database-design,Database Design,我有一个数据库,用于模拟租赁业务。数据库存储多个供应商(所有者)的信息,每个供应商都有一个子集仓库。每个仓库在一年中的某些日子都会关闭,有些是特定于该仓库的(可能在每个星期六或感恩节关闭一整周),而另一些是全球性的(所有仓库都在圣诞节关闭。我正在尝试找出最佳的建模方法 我的第一个想法是创建一个DepotClosed表,如下所示: depotclosed id (PK) INT start_date DATE end_date DATE display VARCHAR

我有一个数据库,用于模拟租赁业务。数据库存储多个供应商(所有者)的信息,每个供应商都有一个子集仓库。每个仓库在一年中的某些日子都会关闭,有些是特定于该仓库的(可能在每个星期六或感恩节关闭一整周),而另一些是全球性的(所有仓库都在圣诞节关闭。我正在尝试找出最佳的建模方法

我的第一个想法是创建一个DepotClosed表,如下所示:

depotclosed
   id (PK) INT
   start_date DATE
   end_date DATE
   display VARCHAR
   global BOOLEAN
   depot_id (FK)
我的问题是,当这是一个全球假期时,仓库id将为空,但它不是“未定义的”,假期只适用于所有仓库。也许我只是从中得到了比我应该做的更多的交易。任何想法都是受欢迎的


谢谢

我的首选是明确记录每个仓库的关闭(即,为每个仓库的
depotclosed
表添加一行)。这样就不会有歧义,您可以对该表执行普通的
JOIN
操作

或者,您可以将depot_id保留为空(即,
NULL
),从而强制理解,当没有列出depot时,它适用于所有depot。但是,通过这种方式,您必须编写
JOIN
,如下所示:

SELECT things
FROM depot
INNER JOIN depotclosed ON (depotclosed.depot_id = depot.depot_id OR depotclosed.depot_id IS NULL)

我会发现这是一个可接受的解决方案。只需确保您的应用程序逻辑在检查depot_id之前始终检查全局布尔值。此外,确保您没有要求depot_id值作为FK的约束


在我看来,另一种方法是为全局假日创建一个表,为本地假日创建一个表,减去全局布尔值。这需要在应用程序中进行相同类型的检查,因此任何一种方法对我都合适。

我认为这种结构很好。您只需选择全局为真的所有行。这将转换为两个查询ies用于查找单个门店的关闭日期、单个门店的所有关闭日期和所有全局关闭日期。您的想法是正确的,避免为每个门店输入全局日期条目:如果需要更改,这将是一件痛苦的事情。

您希望总共有多少个仓库?如果答案大约是100个,yo你可以考虑在一个通用假日的情况下只为每个仓库输入一排,这会浪费空间,但实际上可能节省时间。
对于任何给定的deopt,您必须执行的查询都非常简单,因为您不需要额外的逻辑来测试全局条目。

此解决方案会让我感到害怕。例如,如果添加了一个新的存储点,我们需要记住在每个全球假日为该存储点添加一行。谢谢Vince,我假设您也是uld也可以在单个查询中执行此操作。从depot内部连接depotclosed ON(depot.id=depotclosed.depot\u id或depotclosed.global=TRUE)中选择*可能最接近100个depot