0

我正在設置應用程序數據庫,並且我很難設置外鍵。基本設計涉及三個表格:用戶,客戶端和contact_map。用戶有客戶。用戶和客戶都有多個電話和電子郵件帳戶。聯絡地圖包含這些。它有UserID,UserType,Key,Value。MySQL - 使用複合模式設置外鍵(將多個表映射到一個映射)

UserID =來自客戶端或用戶表的ID。 UserType = enum('user','client') Key/value =電話或電子郵件地址鍵/值對。

正是我想要做的事情,如果是的話,你如何做到這一點?

這是我試過的,但沒有奏效。

CREATE TABLE CONTACT_MAP 
... 
CONSTRAINT 'ContactMap_Users' 
    FOREIGN KEY ('UserID', 'UserType') 
    REFERENCES USERS ('ID') 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT 'CONTACT_MAP_CLIENTS' 
    FOREIGN KEY ('UserID', 'UserType) 
    REFERENCES CLIENTS ('ID') 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
+0

你是不是想用'CONTACT_MAP'表來表示用戶和客戶之間的關係(並且是1:N或M:N)?或者,'CONTACT_MAP'實際上獨立於用戶和客戶可能擁有的任何關係? –

+0

它與他們的關係無關。簡單地說,用戶和客戶都擁有多個電話號碼,電子郵件地址,Facebook,Google +,Twitter帳戶。 –

回答

3

寫下FOREIGN KEY約束時,子表中的字段數量需要與您嘗試從父表引用的字段數匹配。所以,你可以寫......

FOREIGN KEY (UserID) REFERENCES USERS (ID) 

......或者......

FOREIGN KEY (UserID, UserType) REFERENCES USERS (ID, UserType) 

...但不...

FOREIGN KEY (UserID, UserType) REFERENCES USERS (ID) 

你真的不能使用UserType「選擇」正確的FOREIGN KEY。規避該需求的一種方法是仿效繼承和只有一個外鍵。

ER Model

這個實體關係術語是「類別」(見ERwin Methods Guide,部分:「子類型的關係」) 。該類別標誌是:

Category

1

這是不可能的。外鍵只能應用於單個「外部」表。

請考慮如果您在'AGENTS'和'CLIENTS'中記錄了兩條引用ContactMap_Users中相同記錄的記錄會發生什麼情況。你已經讓他們設置爲不採取行動,但讓我們假裝他們設置爲級聯。不,如果你在CLIENTS刪除父記錄,數據庫管理系統將跟隨外鍵和contactmap_users刪除子記錄...現在在ACTIONS另一方記錄被晃來晃去......

相同的更新。您更新ACTIONS中的記錄,該記錄將級聯到此映射表,現在CLIENTS中的父記錄是懸掛的。

+0

對不起,代理商是用戶(我認爲如果我改變它,其他人可能會更容易相關)。我可以將它們分成兩個相同的表,但是寧可使用列「enum('user','client')來區分這兩個表。類似繼承或複合模式。兩個不同的數據共享同一個表。 –