2013-05-17 65 views
0

我是數據庫設計的新手,對於如何最好地模擬此特定情況存在一些不確定因素。我會很感激這個相當簡單的場景的任何建議。數據庫設計:兩個表之間存在多個非標識關係

當生產任務開始時,兩個人都參與在任何時候。一個負責生產,另一個負責質量保證。對於數據庫中的任何任務,必須能夠識別這兩個人。它們都存在於人員表格中,並具有ID,所以我只想將它們與生產任務聯繫起來的最佳方式。存在以下規則:

  • 任何人都可能在任何時間換出其他人。
  • 每個任務總是涉及兩個人(這兩個都不爲空)。
  • 從未有任何其他人蔘與我們想要記錄的任務。
  • 每個人可能參與多個任務,或根本沒有。

如果我們有任務和人民之間關係的一大堆,我會建立某種形式的錯綜複雜的關係結構的描述他們之間的關係(如生產,質量保證人員,監工等),但在這裏我覺得把兩個人的ID粘貼在任務表中,分別放在生產人員和質量保證人員的專欄中是明智的。這是因爲某些原因我不能看到的嗎?

真的促使我的問題是,我正試圖在DBDesigner 4中完全設計它,我是新來的,它只是不喜歡它 - 當我嘗試設置第二個非 - 確定任務和人之間的關係,它不會給我第二個領域。它似乎也不會讓我重新命名任務中涉及人員的字段,因此無論如何都不可能區分這兩個字段。由於沒有人似乎分享這個問題,我開始懷疑這是否是一個好主意。一旦兩個實體之間存在兩個或多個鏈接,引入附加表格是否標準?如果我想執行上述規則,看起來會是什麼樣子?我看不到我如何確保n:m表總是有兩個工作任務的人的條目。

+0

Stack Exchange中還有另一個站點,這種問題更常見並且被鼓勵:[程序員](http://programmers.stackexchange.com)。 SO鼓勵更具體的與代碼相關的問題,而不是設計問題。我並不是低調或任何事情,只是建議你試着在那裏問。 – Renan

+0

@Renan除,不交叉發佈皺起了眉頭? – ErikE

+0

@ErikE IMO最好的解決辦法是移動的問題。 – Renan

回答

2

如果您確信您的需求將保持這種僵硬的永遠,那麼就創建兩個NOT NULL FKS:

enter image description here

此聲明強制執行正好兩個人在任何時候都相關的任務,如果僅僅使用聯結表,就不容易實現(如您已經注意到的那樣)。

OTOH,如果你預計你的要求可能會在未來的某個時刻改變,然後結臺的更大的靈活性可能比你的業務規則完全聲明執法更重要。


我不熟悉DBDesigner,並因此與您的特定問題,但在一般的ER建模,用相同的實體倍數關係是由他們的「角色名」,它決定遷移屬性的名稱(區分請參閱ERwin Methods Guide第3章中「角色名稱」一節)。嘗試在工具的用戶界面中沿着這些行定位某些內容。

0

如果你想知道目前的狀態,而不是誰持有的角色以前@Branko Dimitrijevic的解決方案會奏效。

但如果聲明「中的任意一方可換出一個不同的人在任何時間」意味着你需要知道誰曾擔任該角色考慮3臺設計

Task; TaskID, <other details> 

Assignee; TaskID, PeopleID, role, start_date, end_date 

People; PeopleID, <other details> 

然後在受讓人表你需要約束來確保每個TaskID,Role組合的日期都是合理的,例如日期不重疊或有差距。每個角色每次只有1個角色處於活動狀態。要管理這可能需要在觸發器或應用程序中使用代碼。