簡體   English   中英

SQL中的表能否將多列作為僅引用另一表的一個主鍵的外鍵?

[英]Can a table in SQL have multiple columns as foreign keys that refer only to one primary key of another table?

例如,表Companies的列有company_name,first_contact,second_contact,表聯系人的列有id(PK),名稱,電話。 SQL中的表(公司)是否可以有多列作為外鍵,它們僅引用另一張表(聯系人)的一個主鍵?

是的,這里有一個例子:

mysql> CREATE TABLE Contacts (id INT PRIMARY KEY);
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TABLE Companies (id INT PRIMARY KEY, company_name TEXT,
    -> first_contact INT, second_contact INT,
    -> FOREIGN KEY (first_contact) REFERENCES Contacts(id),
    -> FOREIGN KEY (second_contact) REFERENCES Contacts(id)
    -> );
Query OK, 0 rows affected (0.03 sec)

但是用另一種方法設計數據庫會更常見,用第三張表而不是公司中的兩個外鍵:

mysql> CREATE TABLE CompanyContacts (
    -> contact_id INT NOT NULL,
    -> company_id INT NOT NULL,
    -> is_primary BOOL NOT NULL,
    -> PRIMARY KEY (contact_id, company_id),
    -> FOREIGN KEY (contact_id) REFERENCES Contacts(id),
    -> FOREIGN KEY (company_id) REFERENCES Companies(id)
    -> );
Query OK, 0 rows affected (0.04 sec)

一些優點:

  • 每個公司不限於兩個聯系人。
  • 您可以更簡單地搜索聯系人-只需在CompanyContacts.contact_id中進行搜索,而不是搜索聯系人是first_contact還是second_contact。 使用索引優化查詢更為容易。

一些缺點:

  • 沒有辦法使至少一個聯系人成為必需的約束。 您可以通過在設計中將first_contact聲明為NOT NULL來做到這一點,但是沒有SQL約束要求每個公司的第三張表中都存在一行。
  • 如果您因JOIN查詢而推遲,這可能不會很有吸引力。 但是,我建議您在擁有多對多關系的情況下熟悉JOIN。

當然! 從公司到聯系人,您實際上具有幾種一對一的關系。

查詢數據時,您必須多次加入Contacts表(每列一次為外鍵)

select *
from Companies c
join Contacts contact1 on c.first_contact=contact1.id
join Contacts contact2 on c.second_contact=contact2.id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM