3

我目前正在通過MS Access 2003開發數據庫,​​並陷入循環引用問題。基本上,它歸結爲下列關係三角形(這是我的關係表的簡化形式):數據庫設計中的循環引用 - 是否應該避免?

     Positions 
       oo   oo 
       /    \ 
      /    \ 
      /     \ 
      /     \ 
      /      \ 
     /      \ 
     /       \ 
     /       \ 
     /        \ 
    /        \ 
     oo         oo 
    Employees oo -------------------- oo Software, 

其中位置,員工和軟件是表,並"oo-------...-------oo"顯示器之間的多對多的關係他們。

簡而言之,公司中的所有員工都被分配到特定職位(其中一些員工被分配到多個員工),並且有權根據他們的職位使用特定的軟件(或多個) 。然而,也有例外情況,除了根據其職位允許的內容之外,還允許一些員工使用少數其他軟件包。

問題是,在這種數據庫中允許循環關係可以嗎?是否有任何解決方法不需要非規範化?

在此先感謝, VS.

回答

0

您可以通過爲每個例外生成新位置來避免它。如果需要,可以將布爾標誌添加到位置以區分實際和異常生成位置。

0

您需要正確標準化數據庫。恕我直言 - 我不會在職位表中使用關係。這裏是我會做

  • 員工
  • 軟件
  • EmployeeSoftware
  • 位置

的 「陣地」 表在你的情況,我認爲,是你的角色。請注意,數據庫應該用作存儲,並且應該將最小的業務邏輯放置在那裏。話雖這麼說,......讓我繼續

會有員工和EmployeeSoftware(EMPID存在於EmployeeSoftware外鍵。同樣對於軟件和EmployeeSoftware(SoftID的存在於EmployeeSoftware外鍵之間的關係。

在插入記錄之前,應用程序首先檢查一個人是否處於正確的位置(POSITIONS)表中。對於額外的數據庫檢查,您可以在EmployeeSoftware上添加檢查限制,以在...之前檢查POSITIONS數據庫,然後需要成爲軟件和職位之間的關係

+0

謝謝,夥計們。但是,我的初始結構中的循環關係在這裏確實是一個問題?擁有它有什麼可能的後果?有沒有任何算法來分析可能的錯誤/怪異行爲? – user459459 2010-09-27 14:22:40

+0

允許您選擇對數據庫執行任何操作(在您的情況下爲循環引用)「OK」。有沒有任何解決方法?...取決於。你是否看過視圖?......也許你可以用一些視圖來按照你選擇的方式來構造數據。 – 2010-09-27 15:26:50

+1

如果您在思考得足夠遠以便擔心糟糕的設計決策帶來的後果,那麼爲什麼您仍在使用Access? – Sorpigal 2010-09-27 18:17:17

1

您的圖是橢圓的,因爲您已經省略了al:N之間的N:N連接表l你的實體。這些對循環關係的副作用產生巨大的影響。與CASCADE DELETE之間的直接1:N關係可能導致真正的問題和潛在的死鎖。但是在N:N表格之間,你不應該有這個問題,因爲CASCADE DELETE只能從1個表格到N個「下坡」運行,而不是從N:N表格到另一個表格父表。

在我看來,這是一個常見的問題,與地址問題同構,即,一個人可以擁有一個個人地址並繼承僱主的地址,而@Saif Khan的解決方案是從一個位置消除軟件繼承,這是一種非規範化的形式,因爲您已經將兩個複雜的實體關係合併爲一個。我從來不知道如何對此進行建模,不是因爲潛在的循環關係,而是因爲彙編所有軟件/地址的單個結果集(這需要使用UNION)而導致的性能問題(以及不可編輯性)。我會試圖用觸發器來複制從該位置繼承的軟件,並將該人與該軟件連接起來。

在A2010之前,這在Access/Jet/ACE的引擎級別是不可能的,但A2010增加了表級數據宏,可用於實現觸發器的等效功能。這可能是這種新功能可以讓你用觸發器實現這個結構的情況。

但我不確定我是否適合複製數據,即使觸發器允許您在引擎級同步複製數據。

0

我覺得這個數據庫的設計變得過於複雜的,因爲處理異常的方式,

「一些員工被授予 使用其他軟件 包的極少數,除了它們是什麼 允許根據自己的 位置(S)。

不要試圖一個員工直接鏈接到軟件。

我只會創建另一個位置,因爲在這種情況下,職位的主要目的是確定軟件訪問。即使一個人有一個獨特的軟件列表,他們將在未來被替換,並且該人員可以被分配相同的位置。

查詢會更容易。正如David-W-Fenton指出的那樣,你將不得不使用很多工會來找出誰可以使用哪些軟件,反之亦然。