我有一个用于为租赁业务建模的数据库。数据库存储多个供应商(所有者)的信息,每个供应商都有一个库的子集。每个仓库在一年中的某些日子关闭,一些特定于该仓库(可能每个星期六或感恩节整整一周关闭)而其他一些都是全球性的(所有仓库都是圣诞节关闭。我试图找出最佳方式模仿这个。
我的第一个想法是拥有一个DepotClosed表,如下所示:
depotclosed
id (PK) INT
start_date DATE
end_date DATE
display VARCHAR
global BOOLEAN
depot_id (FK)
我的问题是,当它是一个全球假日时,depot_id将为null,但它不是“未定义”,假期仅适用于所有仓库。也许我只是做了比我应该做的更多的交易。任何想法都会受到欢迎。
由于
答案 0 :(得分:1)
我的偏好是显式记录每个软件仓库的一个闭包(即为每个软件仓库的depotclosed
表添加一行)。这样就没有歧义,你可以对表执行普通的JOIN
。
或者,您可以将depot_id留空(即NULL
),从而强制理解当没有列出仓库时,它适用于所有仓库。但是,这样你就必须写JOIN
这样的东西:
SELECT things
FROM depot
INNER JOIN depotclosed ON (depotclosed.depot_id = depot.depot_id OR depotclosed.depot_id IS NULL)
答案 1 :(得分:1)
我认为这种结构很好。您可以只选择global为true的所有行。这将转换为两个查询以查找单个商店的关闭日期,一个用于单个商店的所有关闭日期,一个用于查找所有全局关闭日期。您有正确的想法,以避免为每个商店添加全局日期条目:如果需要更改这将是一个痛苦。
答案 2 :(得分:0)
我会发现这是一个可以接受的解决方案。在检查 depot_id 之前,请确保您的应用程序逻辑始终检查全局布尔值。另外,请确保您没有需要 depot_id 的值作为FK的约束。
我认为另一种方法是为全球假期创建一个表,为本地假期创建此表,减去全局布尔值。这需要在应用程序中进行相同类型的检查,因此无论哪种方式对我都没问题。
答案 3 :(得分:0)
您期望总共有多少个仓库?如果答案类似于100,那么在普遍假期的情况下,您可能会考虑在表格中为每个仓库输入一行。它浪费了空间,但它实际上可以节省时间。
对于任何给定的deopt,您必须执行的查询将非常简单,因为您不需要额外的逻辑来测试全局条目。