2011-10-12 150 views
4

假設我有一個與另一個表1:0..1關係的客戶表,我通常會在客戶表中指向另一個表的Nullable FK。1到0..1的關係 - FK指向哪個方向?

然而,說與客戶有關的其他可選數據片斷的數量會增加,僅僅因爲參數的緣故,表的數量現在是10個。最好是使用相同的體系結構,以便有10個額外的客戶表中的列,如果沒有存儲額外的數據,全部可能爲空,或者FK指向孩子的客戶表是否更好?這個模型看起來很整潔,因爲我沒有大量可爲空的列,如果需要的話,我可以逐漸擴展系統,只需在新表中添加新表格和指向客戶的新FK列。唯一的缺點是,它看起來(查看數據庫),你可以添加更多的行打破1:0-1關係規則。但是,我的應用程序永遠不會插入額外的行。

第一種方法要求我爲每個添加到系統中的新表格添加客戶表末尾的新列。

在這種情況下哪種方法最好?

+0

另請參閱此關係問題:http://stackoverflow.com/questions/5177991/normalization-of-an-11-or-10-relationship – Hibou57

回答

3

答案是機械地從功能依賴的想法中派生出來的。

對於一個關係中存在的值,這意味着值必須存在於另一個關係中。如果這是真的,屆時將有來自相關表(前)外鍵約束的獨立表(後者)

看待這個另一種方式是一對一的關係,實際上只是一個特殊的一對多關係的情況;只有而不是許多,你只有一個。

在SQL

CREATE TABLE independent (
    id INTEGER PRIMARY KEY 
); 

CREATE TABLE dependent (
    independent_id INTEGER UNIQUE NOT NULL FOREIGN KEY REFERENCES independent(id) 
); 

像一對多,「衆多」有一個外鍵「一」,但打開「多」到「一」,只是使它unique。這是典型的便利通過使外鍵列上的依賴關係的主鍵的這種關係來表達這一切:

CREATE TABLE dependent (
    independent_id INTEGER PRIMARY KEY FOREIGN KEY REFERENCES independent(id) 
); 

編輯:我注意到您的標題提出了一個不同的問題比你的身體似乎問。以上回答標題。

從數據庫規範化的角度來看,可能最好使用多個表,如上所述,以支持可空屬性。空值是一種帶外方式,表示特定屬性的價值在某種程度上是「特殊的」,但並不真正強化對可能意味着什麼的任何特定解釋。空manager_id可能意味着完全不同於空birthdate,即使它們具有相同的標記。

從嚴格的抽象或學術的角度來看,添加表格並不是一件壞事;也沒有添加屬性。選擇應始終基於您實際需要建模的數據類型。

這就是說,有一些非常實際的原因使用其中一個或另一個。最明顯的性能原因來自於使用其中一個或另一個的空間成本。當通常使用可選值時,外鍵和相應索引使用的額外空間不會很好地支付。同樣,如果可選值很少使用;將這些值放在另一個關係中更加緊湊。具有可空屬性會佔用表中幾乎不用的空間。

找出哪些基本上需要實際的數據,以及性能測試這些(也許是其他)配置,看看哪個最好。

-1

部分答案:

請記住,打破了表二用1-1或1-0..1關係,始終需要這些表之間的附加連接。

如果您經常需要從兩個表中一起返回數據,並且這些表的負載很重,那麼在較大的單個表中使用「噸的NULL值」會更好。

+1

這將是很好,在評論中添加downvote原因... –