2009-02-24 307 views
0

我對此設計有疑問(er_lp)。我的疑問是如何與具有複合鍵的實體建立多對多的關係,其次,使用日期類型作爲pk。在這裏,每臺機器每天工作三個班次,爲一個或多個領域的不同用戶部門工作。因此,爲了保持機器的工作和停機時間的記錄,我已經使用shift,taskDay和machinePlate作爲pks。正如您從ER圖中看到的,我在許多地方的鏈接表中結束了太多的pks。我猶豫不要在編碼階段陷入困境實體關係

有沒有更好的方法來做到這一點?

謝謝!

德傑


又見額外發布的第二個問題Entity Relationship信息。重新格式化的材料是:

詳細說明:是的,「字段」是指土地的區域。我們在不同的地點有幾個甘蔗種植地。它[每個領域?]被命名並且有預算。

用戶不是指在機器上工作的個人。他們是部門。我用'isDone'表將userDept與機器鏈接起來。一臺機器可以被多個部門使用,許多機器可以爲一個用戶部門工作。

特定的機器可以用於給定班次的多個任務。它可以工作2個小時,並可以在另一個領域開始另一項任務。我們每天三班,每個8小時!

如果我使用自動增量PK,你認爲其他密鑰是重要的嗎?我不喜歡使用它!

通常,我只在表格中使用自動增量鍵。我們如何創建涉及自動遞增鍵的關係?

謝謝你的深思熟慮的評論!沒有得到與主鍵的麻煩


回答

0

的一個好方法是有主鍵的單個字段。通常一個數字(自動增量)欄就好了。您仍然可以擁有多列唯一鍵。

1

您總是使用第三個表在兩個表之間創建多對多關係,其中的行包含每個表的主鍵的列,並且所有列的組合都是第三個表的主鍵。對於具有複合主鍵的表,該規則不會更改。

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表中的部門信息作爲外鍵字段添加即可。

如果您決定使用自動增量鍵,您仍然需要保持組合鍵的唯一性。這是我看到人們用自動增量字段所犯的最大錯誤。它不像「具有自動遞增鍵的表格必須具有第二個唯一約束」那麼簡單,但它並不太離譜。

當您使用自動遞增鍵時,您需要檢索將記錄插入表中時分配的值;然後將其他記錄插入其他表中時,您可以在外鍵列中使用該值。

您需要閱讀關於數據庫設計的書籍 - 我不確定當前好的書籍是什麼,因爲我十年以前學習了大部分學習內容,因此我的書籍不太可能仍然可用。

0
  • tblWorksOn
  • tblMachine
  • tblIsDone

...似乎是問題表。

它看起來像你可以使用taskDate爲tblMachine表作爲主鍵。其餘的可以是foriegn鍵。

隨着對tblMachine表的更改,您可以使用taskDate以及tblWorksOn表的fieldNo和tblIsDone的userID的taskDate。使用這兩個字段創建複合鍵(CK)

tblMachine taskDate(PK)

tblWorksOn fieldNo(CK) taskDate(CK)

tblIsDone 用戶ID(CK) taskDate(CK)