2010-10-04 47 views
7

我對數據庫設計相當陌生,但我理解基礎知識。我創建了一個關係數據庫,我想做類似於創建可重用類型或類的東西。例如,假設我有一個Customer表和一個Item表。客戶和項目通過標準的一對多關係相關,因此項目有一個名爲CustomerId的列。如何在關係數據庫中爲自定義類型建模?

我還想爲每個客戶有多個「備註」每個項目。在一個正常的OOP模型中,我只需創建一個Note類,並在需要時創建該類的實例。當然,關係數據庫是不同的。我正在考慮製作Note表,並且我希望客戶和備註之間以及項目和備註之間存在一對多的關係。問題在於Note表必須爲希望使用此「類型」的每個其他表創建一列。 (請參閱下面的示例) note_relation1

我還認爲可以在Note和Customer/Item(或其他)之間創建一箇中間表。這樣可以避免在每個引用它的表中添加額外的列,所以在添加更多需要註釋的表時,註釋可以保持不變。我在想這是更好的解決方案。 (參見示例) note_relation2

這種情況通常如何處理?我接近正確嗎?我非常感謝關於如何設計我的數據庫以獲得上述功能的建議。

+0

問:有沒有一個音符不斷應用到多個實體;即相同的筆記能否適用於顧客和物品?或者可以將相同的註釋應用於多個客戶或多個項目? – 2010-10-04 13:28:12

+0

不,每個音符只適用於單個客戶,物品或其他物品。 – 2010-10-04 13:34:58

+0

數據庫設計中的任何內容都不能排除它。您應該將NOTE中的TEXT和DATE字段移動到CustomerNote和ItemNote中,以正確映射每個筆記最多可以與一個Customer或Item關聯。結果,注表將被完全消除。 – 2010-10-04 16:15:40

回答

4

是的,你最後的例子是正確的,應該是要走的路。

您可以通過創建表在關係數據庫中建立「複雜類型」。您可以將該表視爲一個類:實際上ORM解決方案通常將一個類直接映射到一個表。自定義類型的一個實例是其表中的一行,實例可以由主鍵的值引用。

您可以通過使用相同的數據類型爲「複合型」的主鍵,並執行與foreign key constraint的關係,使用自定義「複合型」在其他表中的字段:

讓我們建立一個複雜類型爲「國」:

CREATE TABLE countries (
    iso_code  char(2)  NOT NULL,  
    name   varchar(100) NOT NULL, 
    population bigint  
    PRIMARY KEY (iso_code) 
); 

而且讓我們添加一對夫婦的「國家」的實例:

INSERT INTO countries VALUES ('IE', 'Republic of Ireland', 4470700); 
INSERT INTO countries VALUES ('US', 'United States of America', 310403000); 

現在我們要使用我們的複雜的「國家」類型的「用戶」表:

CREATE TABLE users (
    id   int   NOT NULL, -- primitive type 
    name  varchar(50) NOT NULL, -- primitive type 
    age   int,      -- primitive type 
    country  char(2),     -- complex type 
    PRIMARY KEY (id), 
    FOREIGN KEY (country) REFERENCES countries (iso_code) 
); 

通過上述模型,我們保證,這些users表的country字段只能是一個有效的國家,只不過是一個有效的國家。

另外,使用junction table,正如您所建議的那樣,也是處理那種polymorphic relationship的合適方法。你可能有興趣在檢查出下面的堆棧溢出的帖子關於這個主題的一些進一步閱讀:

+0

嗯,我想當我創建一個類似「CustomerNote」的聯結表時,我可以將它建模爲一個ORM中的繼承關係(我讀過這是多表進行繼承的方式 - 事實上,我已經設計我的「客戶」表是另一個「聯繫人」表的子類)。儘管我的目標不是爲筆記創建繼承,但實際上我爲每個我想要引用「Notes」(例如Customer和Item)的表創建子類的筆記(CustomerNote ...)。當我在ORM中建模時,最好是隻創建一個「Note」類還是繼承模型? – 2010-10-04 13:21:37

+0

@Benny:這是一個有趣的問題,但我認爲答案取決於ORM解決方案。不幸的是,我沒有太多使用ORM的經驗來增加更多的見解。 – 2010-10-04 14:14:40

0

我認爲你可以最好地添加一個Note字段到Customer表和Item表。在此註釋字段(外鍵)中,您可以存儲屬於客戶/項目的註釋的ID。爲了確保您可以將多個註釋附加到客戶或項目,您可以選擇添加註釋表並將單個註釋附加到可以附加到客戶/項目表的「註釋」表中。