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

时间:2009-08-11 16:55:02

标签: database-design

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

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

depotclosed
   id (PK) INT
   start_date DATE
   end_date DATE
   display VARCHAR
   global BOOLEAN
   depot_id (FK)

我的问题是,当它是一个全球假日时,depot_id将为null,但它不是“未定义”,假期仅适用于所有仓库。也许我只是做了比我应该做的更多的交易。任何想法都会受到欢迎。

由于

4 个答案:

答案 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,您必须执行的查询将非常简单,因为您不需要额外的逻辑来测试全局条目。