2011-12-20 96 views
1

我有一個關於辦公室及其工作人員以下典型場景:兩個實體之間的多重關係,這是一個好的做法嗎?

  • 每名工作人員屬於一個辦公室
  • 每個辦公室只有一個經理(工作人員)

ER型號

er http://img814.imageshack.us/img814/2204/capturefsi.png

正如你所看到的,這導致關係被記錄兩次,一次是辦公室表中的外鍵指向經理,另一個是員工表中指向職員工作的辦公室。

我已經研究了建模的其他方法,但我仍然有點失落。請有人建議一個合適的建模方式,或者如果我的方法可以接受的情況。

非常感謝

+1

工程完美IMO ..除非你試圖追蹤辦事處的人的歷史或管理人員的歷史;那麼使用這種設計將需要JOURNAL或額外的表格。如果您嘗試在表格中保留歷史記錄,則需要更多字段 – xQbert 2011-12-20 23:16:10

回答

2

這並不是說「的關係[是]記錄了兩次」,但你確實有這些表—這是完全正常的之間的兩個關係。我唯一擔心的是,經理是否屬於他經​​理的同一個辦公室? (並且相關:工作人員有一個辦公室和辦公室有一個經理誰是職員?)如果是這樣,你有一個循環依賴:你不能設置經理的辦公室,直到該辦公室存在,但您不能設置辦公室的經理直到經理存在。只要一個或另一個字段可以爲空,您可以通過應用程序邏輯來解決此問題(INSERT一個,然後INSERT另一個,然後UPDATE第一個),但它有點難看。但是,如果這些是存在的關係,那麼關於它的關係就不多了。

+0

這正是我最初的問題。我解決了這個問題,允許經理因爲循環依賴而暫時爲空,當表格清晰時我不能插入辦公室或職員。感謝您的迴應,並感謝其他人,感謝您的意見。 – 2011-12-20 23:27:42

1

對我來說沒問題,因爲無論關係中的表是否相同,關係實際上是非常不同的。您可以扣除管理人員在她管理的辦公室工作是正確的,但這是一個域規則,並且不會對數據庫設計的這部分進行反規範化處理。 如果你想擺脫雙重關係,你總是可以創建一個管理員表,其中將包含員工和辦公室的外鍵。

1

從SQL的角度來看,這樣的循環關係是有效的,但它會導致一些事情變得複雜。例如,當您備份和還原數據時,必須推遲創建其中一個外鍵約束,直到您還原數據爲止。因爲如果在填充表格之前創建約束,則在恢復其辦公室之前無法還原辦公室的經理,並且在恢復其經理之前無法還原辦公室。

解決這個問題的另一種方法,而不是使用Office.Manager外鍵列是使用布爾列Staff.IsManager這對經理是真實的,但對給定辦公室中的所有其他工作人員是錯誤的。

+0

一個有趣的解決方案,這聽起來很合理,因爲辦公室已經記錄了每個工作人員,非常感謝。 – 2011-12-20 23:28:46

0

當你想添加一個新的辦公室時,這看起來很尷尬。一個辦公室必須有一個經理,所以你需要首先讓經理。但經理是一名職員,必須有一個辦公室,所以你需要先辦公室。

要打破這個循環,您需要允許一個臨時爲NULL或其他不真實的值,然後修改您創建的第一個引用第二個值。不是不可能的,只是尷尬。

如果我正在設計這個,我可能會有一個單獨的「管理」表,將辦公室與經理關聯起來。

0

這是好的,只是爲了顯示關係。但請注意,這可能導致無限循環。

staffid ->officeid -> manager -> staffid 

這個循環可能發生檢索數據(我面臨同樣的情況曾經)在,所以它是更好地規範這一點,避免這種2的關係問題。

相關問題