Database-Design
這些是更好地表示為一對多還是多對多關係?
我試圖模擬一個人可以屬於多個行業並在每個行業擁有不同年經驗的情況。他們還可以了解多種語言,並且對每種語言有不同程度的經驗。
對我來說有意義的是 2 個一對多的關係,我希望通過下表來傳達。一個配置文件可以有許多行業和語言。
但是,使用如下所示的“經驗”連接表對其進行建模是否更有意義?
對我來說,第一種方式似乎更簡單,我很難理解為什麼第二種方式會更受歡迎,但我不知道為什麼在這兩種情況下。
如果我正確理解您要建模的內容,那麼兩者都是錯誤的。
據我了解,您有三個實體:個人資料、行業和語言。配置文件與行業多對多相關,具有持續時間(以年為單位,如果您願意的話)的關係屬性,這種關係已經建立並且對於語言來說是模擬的(但分開的!)。
在您的第一個模型中,您必須在與配置文件的每個關係中重複行業(或語言)名稱和(可能是行業(語言)的其他屬性),並且您只有那裡的名稱(或其他屬性)。接下來,
- 如果您想更改名稱(或其他屬性),例如糾正錯字,您必須在所有指向個人資料的連結中更改它,如果您忘記了一個(某些),您將獲得不一致的數據
- 如果您刪除指向某個行業(語言)的最後一個連結,該行業(語言)將不再存在於您的數據庫中。
您的第二個模型通過為每個行業和語言提供一個表格來糾正這一點。您的連結表指向右側,但存在缺陷,因為它試圖以某種方式將兩個關係合併為一個。持續時間屬於他們中的哪一個?與行業或語言的關係?
擁有三個實體,您需要三個表,每個表一個。
CREATE TABLE profile (id serial, name text, -- other attributes PRIMARY KEY (id)); CREATE TABLE industry (id serial, name text, -- other attributes PRIMARY KEY (id)); CREATE TABLE language (id serial, name text, -- other attributes PRIMARY KEY (id));
然後,由於配置文件與行業和語言相關,這會增加兩個關係,因此您需要兩個連結表,每個表都有一個持續時間列,以對關係屬性進行建模。
CREATE TABLE profile_industry (profile integer, industry integer, duration integer, -- or you might even want to use the interval type to be extremely precise and flexible -- other attributes PRIMARY KEY (profile, industry), FOREIGN KEY (profile) REFERENCES profile (id), FOREIGN KEY (industry) REFERENCES industry (id)); CREATE TABLE profile_language (profile integer, language integer, duration integer, -- or you might even want to use the interval type to be extremely precise and flexible -- other attributes PRIMARY KEY (profile, language), FOREIGN KEY (profile) REFERENCES profile (id), FOREIGN KEY (language) REFERENCES language (id));
或者,除了持續時間,您還可以將屬性更改或添加到與語言的關係中更有意義的東西,例如ACTFL 熟練程度(最好為此定義和使用列舉類型)。