2009-08-11 53 views
1

我有一个建模租赁业务的数据库。数据库存储多个供应商(所有者)的信息,每个供应商都有一个库的子集。每个仓库在一年中的某些特定日子关闭,其中一些特定于该仓库(可能在感恩节的每个星期六或一个星期内关闭),另一些则是全球性的(所有仓库都关闭了圣诞节,我试图找出最佳方式对此建模如何在关系数据库中对此进行建模?

我首先想到的是有一个DepotClosed表如下:

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

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

回答

1

我觉得这个结构很好。您可以选择全局为true的所有行。这将转换为两个查询来查找单个商店的关闭日期,其中一个用于单个商店的所有关闭日期,另一个用于所有全球关闭日期。您有正确的想法来避免为每个商店输入全球日期条目:如果需要改变这种情况将是一件痛苦的事情。

+1

感谢Vince,我想你也可以在单个查询中做到这一点。选择*从仓库INNER JOIN depotclosed ON(depot.id = depotclosed.depot_id OR depotclosed.global = TRUE) – Shane 2009-08-11 17:12:32

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

数据完整性影响使这个解决方案吓坏了我。例如,如果添加了新的软件仓库,我们需要记住在每个全球假日的该软件仓库中添加一行。 – JoshJordan 2009-08-11 17:00:25

0

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

正如我所看到的,替代方法是为全球假期创建一个表格,并为本地节假日创建一个表格,减去全局布尔值。这需要在应用程序中进行相同类型的检查,所以无论哪种方式对我都没问题。

0

您预计总共有多少站?如果答案是100,那么你可以考虑在普遍假期的情况下在每个车厂的表格中输入一行。它浪费空间,但实际上可能会节省时间。

对于任何给定的deopt,您将必须执行的查询将会非常简单,因为您不需要额外的逻辑来测试全局条目。

+0

可能只是100个仓库中最害羞的将是最 – Shane 2009-08-13 20:22:23

相关问题