您總是使用第三個表在兩個表之間創建多對多關係,其中的行包含每個表的主鍵的列,並且所有列的組合都是第三個表的主鍵。對於具有複合主鍵的表,該規則不會更改。
CREATE TABLE Table1(Col11 ..., Col12 ..., Col1N ...,
PRIMARY KEY(Col11, Col12));
CREATE TABLE Table2(Col21 ..., Col22 ..., Col2N ...,
PRIMARY KEY(Col21, Col22));
CREATE TABLE RelationTable
(
Col11 ...,
Col12 ...,
FOREIGN KEY (Col11, Col12) REFERENCES Table1,
Col21 ...,
Col22 ...,
FOREIGN KEY (Col21, Col22) REFERENCES Table2,
PRIMARY KEY (Col11, Col12, Col21, Col22)
);
這工作正常。它確實建議您儘可能簡單地保留鍵,但是如果它們有一個方便使用的自然組合鍵,則絕對不需要向後向自動增量列添加自動增量列。 OTOH,如果使用複合鍵,涉及關係表的連接難以寫入 - 如果兩個複合鍵涉及兩列以上,我會多次思考我的情況,不僅僅是因爲它可能表明參考表的設計。
看着實際的ER圖 - 問題中的'er_lp'URL - 'tbl'前綴似乎是不必要的;在數據庫中存儲數據的東西總是表格,所以告訴我用前綴是......不必要的。名爲「機器」的表似乎被誤稱;它並不是將機器描述爲在特定班次上分配給機器的責任。我猜測'場'表是指土地領域,而不是數據庫的一部分。你有'IsDone'表(再次,不是特別好的名字),它標識了在一臺機器上工作一個特定班次的用戶,因此用於特定的任務。這涉及到Machine表(其具有三部分主鍵)和用戶表之間的鏈接。目前還不清楚特定機器是否可用於某個班次的多項任務。目前尚不清楚輪班號碼在一天中是否有周轉,或者每個輪班號碼在幾天內是否是唯一的,但推測必須是每天有三班倒,並且需要輪班號碼和日期以確定何時發生。據推測,Shift表可以識別時間和其他此類信息。
機器上的三部分主鍵很好 - 但最好有兩個唯一標識符。一個是當前的主鍵組合;另一個將是一個自動分配的號碼 - 自動增量,序列號,序列或其他...
尋址擴展信息。
我不清楚你正在追尋什麼。如果'機器'表應該跟蹤給定機器的使用情況,那麼你可能需要做一些更多的數據結構。考慮到一臺機器可以用於不同領域的不同任務,可能需要考慮一個MachineTasks表,它可以識別操作開始和結束時的(日期和時間)以及操作類型。對於維修操作,您需要將信息存儲在描述修理的表格中;對於某個領域的日常操作,您可能不需要太多額外的信息。或者,也許這是矯枉過正。
我不清楚是否某個任務是代表多個部門執行的,或者您是否僅僅試圖指出在一次班次中機器可能會被多個部門使用,但每個部門每次只能使用一個部門任務。如果每個任務都針對一個單獨的部門,那麼只需將主要MachineTasks表中的部門信息作爲外鍵字段添加即可。
如果您決定使用自動增量鍵,您仍然需要保持組合鍵的唯一性。這是我看到人們用自動增量字段所犯的最大錯誤。它不像「具有自動遞增鍵的表格必須具有第二個唯一約束」那麼簡單,但它並不太離譜。
當您使用自動遞增鍵時,您需要檢索將記錄插入表中時分配的值;然後將其他記錄插入其他表中時,您可以在外鍵列中使用該值。
您需要閱讀關於數據庫設計的書籍 - 我不確定當前好的書籍是什麼,因爲我十年以前學習了大部分學習內容,因此我的書籍不太可能仍然可用。