2013-12-10 182 views
0

假設我有員工&會議表。數據庫設計與其他表的多對多關係

Employee 
----------- 
id 
name 


Meeting 
----------- 
id 
name 


Employee_Meeting 
----------- 
id 
employee_id 
meeting_id 

現在我需要在該會議中添加員工的任務(或其他任務)。最佳做法是什麼?我能有這樣的關係:

Employee_Meeting_Task 
----------- 
Employee_Meeting_id 
task_id 

Employee_Tasks 
----------- 
id 
employee_id 
meeting_id 
task_id 

是這兩種方法從視圖「適當的」數據庫設計點是否有效?

我的擔憂是:

案例1:在大多數情況下,如果我從我需要刪除他的任務,這次會議以及會議中移除的員工。 Employee_Meeting_Task將強制約束。案例2:有時員工參加一些日常會議,並定期在該會議中執行相同的任務。如果他病了好幾天,我想把他從會議中解救出來,但我不想在他下次參加會議時將他的任務重新加入到會議中。

+0

由於員工在會議中可以有多個任務,因此我認爲讓Employee_Meeting_Task表最有意義。如果它是1比1的映射,但表格會感到多餘。 – Tobberoth

+1

在多對多表的主鍵上閱讀http://stackoverflow.com/questions/2190272/sql-many-to-many-table-primary-key。 –

回答

1

有幾件事你應該看看。首先,如果員工有可能完成與會議無關的任務,則可能會遇到麻煩。其中一種方法是在會議桌上記錄一個名稱,如「不適用」。另一種方法是從employee_tasks表中取出meeting_id字段。最好的方法取決於將任務與會議相關聯的要求,這是您必須向任務管理員詢問的問題。

接下來,對於許多到許多表格,您不需要單獨的id字段。例如,對於employee_meeting,PK可以是employee_id和meeting_id。

接下來,看看你對案例2所說的話。如果每天都有一次會議,那麼每天會議桌上的記錄不會是一個記錄嗎?

+0

爲了簡單起見,假設所有會議都是每日會議,並且在會議數據庫中每次會議都有一個記錄。我的疑問是,如果有時候想要從所有相關數據的「多對多」表中刪除記錄,並且有時只想暫時刪除映射但保留相關數據,那麼設計表格有多恰當。我僅以會議/員工爲例。現在我想我可以在employee_meeting表中添加'is_active'來知道員工是否只是臨時移除,並使用Employee_Meeting_Task來指定任務。使用2列而不是單列的外鍵更好嗎? – jonasnas

+0

我認爲你在employee_meeting表中的開始日期和結束日期會更好。這可以讓你保持歷史。 –

相關問題