Database-Theory

關聯表

  • June 7, 2020

我可以使用關聯(或“連結”)表來模擬多對多關係,例如Student<- Enrolment-> Course,其中註冊描述了學生和課程之間的基本關係。

我也可以有Course->DepartmentCourse-> Language,其中語言和部門都是課程的屬性,但它們之間沒有特殊關係。

這兩個場景看起來很相似,但我不會呼叫Course關聯表……它還有其他名稱嗎?有沒有一種合乎邏輯的方法來區分這兩種情況?

您的技術名稱association (or 'linking') tableassociative entity- 該頁面上列出了大約 15 個替代名稱。我在這裡探討了這些背後的邏輯——特別是PRIMARY KEY連結表中的 s 應該是連結表中兩個FOREIGN KEYs 的組合。

在沒有看到你的 DDL 的情況下,我覺得你Course -&gt; DepartmentCourse -&gt; Language桌子是你共同或花園Parent -&gt; Child關係的例子。這些都在這裡簡單明了地解釋。

父表欄位必須要麼是PRIMARY KEY表的,要麼至少是UNIQUE(並且在這種情況下被索引,PKs 通常被自動索引)。子表欄位顯然不必UNIQUE應該被索引,因為它通常是JOIN任何 SQL 查詢中的 ing 欄位。由於NULL值邏輯的樂趣,UNIQUE父欄位可以NULL(參見小提琴here),但是我強烈建議NOT NULL向該父欄位添加約束!

我想你的Course -&gt; Department場景看起來像這樣(參見這裡的小提琴- 範例是 PostgreSQL,但它適用於 dbfiddle.uk 上的每個伺服器):

CREATE TABLE department
(
 dept_id INTEGER NOT NULL PRIMARY KEY,
 dept_name VARCHAR (25) NOT NULL,
 dept_head INTEGER,  -- this could relate to an id in a personnel table, allowed to be NULL if position is vacant
 dept_contact INTEGER, -- id of secretary to the head of department?
 dept_address VARCHAR (100),
 --
 -- other fields
 --
);

CREATE TABLE course
(
 course_id INTEGER NOT NULL PRIMARY KEY,
 course_code VARCHAR (10) NOT NULL,
 course_name VARCHAR (50) NOT NULL,
 course_dept INTEGER NOT NULL,
 --
 --  other fields
 --
 CONSTRAINT course_dept_fk FOREIGN KEY (course_dept) REFERENCES department (dept_id)
);

這些表聲明的重要部分(對於本次討論)是:

CONSTRAINT course_dept_fk FOREIGN KEY (course_dept) REFERENCES department (dept_id)

因此,department在這種情況下,表是父表,而子表是course我想的問題的重點。意思是對於表中的CONSTRAINT任何course_dept條目,course表中必須有對應的條目department!如果您覺得這個解釋不令人滿意,請告訴我(為什麼),我會嘗試進一步澄清。

ps 歡迎來到論壇!

引用自:https://dba.stackexchange.com/questions/268630