2009-08-11 74 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