2012-10-16 99 views
1

我目前正在設計一個數據庫模型,並且遇到了一個問題,在哪裏我想了解更多有關什麼是正確的做事方式的輸入。數據庫設計 - 關聯實體

在下面的例子中,我有兩個表,人員和角色。 現在1人可能被分配0個或更多角色。 這與多對多的關係相當直接,但棘手的部分來自於當你想允許用戶選擇他當前「操作」的角色時。

假定用戶有一個選擇5個角色可供選擇,並且根據他目前選擇了哪個角色,應用將呈現與他不同的意見/菜單/按鈕/等

我看到了兩個解決方案在這裏:

1:(見下面鏈接的圖像的頂部)

在個人表,你有一個可以爲空FK的許多一對多的關係(關聯實體)。

維基百科上Associative entity

它似乎確定爲「其他實體」來引用這種關係。我只是不完全確定這是否包括角色和人員實體。

我對這個設計的喜歡是,很容易得到一個人所有允許角色的列表,然後你只需指向其中一個允許的角色,說「你是當前/活動的角色」 。這也是一種很好的方式,以確保用戶只能擁有最新的角色,如果他有權訪問該角色......只有我也看到了潛在的災難: 如果在persons表中的FK引用另一個用戶的關係。數據庫設計將允許這樣做。這隻會是防止它的代碼。

2:(見下面鏈接的圖像的底部)

我把關聯實體簡單,而是我有FK在指向的角色表中的特定角色的人表。

這裏的問題是我從DB設計中獲得的幫助更少,確保一個人的「當前角色」是一個實際上「允許」的角色。

Example image

任何對此的思考,將不勝感激=)

更新:我有同樣的問題的另一種變體。

兩個實體:工作訂單和站點

  • 1網站可以訪問許多工作單
  • 1工單可以被很多網站訪問

因此,我們有一個多TO-許多關係

問題:我們如何最好地在數據庫中存儲哪個站點是工單的所有者,哪些站點只能擁有一個擁有工單的站點。

我們是否將「OwnerSiteId」作爲WorkOrder表中的列,或者是否可以引用多對多關係,而是說「那一個」是所有者。

+0

類似於:http://stackoverflow.com/questions/12652152/mysql-circular-dependency-in-foreign-key-constraints –

回答

0

如果你的要求是:
一個人可以有多個角色,但只能有一個積極的作用
如果是比你的兩個設計具有以下優點和缺點

- 設計1.具有關鍵PERSON表中的ROLE表優點:加入時會減少,因此在數據庫操作時會降低成本。缺點:您可以爲用戶分配一個從未進入其允許列表中的角色。

  • 設計(二)有PERSON表利弊副實體表的關鍵:人將被分配只有那些允許他中的作用。缺點:比第一種方法增加一個連接成本。

結論:如果我是你,我會去設計1,並確保從應用程序角色分配。

0

將當前角色與其他會話數據一起存儲。

+0

是的,對於這個問題,我可以看到這可能是一個解決方案。只有我看到這個問題也出現在其他變體中。 示例: 我們有兩個其他實體WorkOrders和Sites。 WorkOrder由1個站點擁有,並可能與其他幾個站點共享。 在這裏你再次得到問題。你有幾個應該有權訪問工作訂單的網站,但其中只有一個是「所有者」 –

+0

@TrondBlomholmKvamme是的,但所有這些引用都是* transient *,不應該正式存儲在數據庫中:它是所有會話的東西。如果需要存儲「當前」數據,則只需將其存儲爲實體的一列。否則,請考慮遵循奧斯瓦爾德的建議。 – Bohemian