關聯表
我可以使用關聯(或“連結”)表來模擬多對多關係,例如
Student
<-Enrolment
->Course
,其中註冊描述了學生和課程之間的基本關係。我也可以有
Course
->Department
和Course
->Language
,其中語言和部門都是課程的屬性,但它們之間沒有特殊關係。這兩個場景看起來很相似,但我不會呼叫
Course
關聯表……它還有其他名稱嗎?有沒有一種合乎邏輯的方法來區分這兩種情況?
您的技術名稱
association (or 'linking') table
是associative entity
- 該頁面上列出了大約 15 個替代名稱。我在這裡探討了這些背後的邏輯——特別是PRIMARY KEY
連結表中的 s 應該是連結表中兩個FOREIGN KEY
s 的組合。在沒有看到你的 DDL 的情況下,我覺得你
Course -> Department
和Course -> Language
桌子是你共同或花園Parent -> Child
關係的例子。這些都在這裡簡單明了地解釋。父表欄位必須要麼是
PRIMARY KEY
表的,要麼至少是UNIQUE
(並且在這種情況下被索引,PK
s 通常被自動索引)。子表欄位顯然不必UNIQUE
但應該被索引,因為它通常是JOIN
任何 SQL 查詢中的 ing 欄位。由於NULL
值邏輯的樂趣,UNIQUE
父欄位可以是NULL
(參見小提琴here),但是我強烈建議NOT NULL
向該父欄位添加約束!我想你的
Course -> 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 歡迎來到論壇!