2013-06-24 69 views
1

我創建了一個簡單的應用程序,用戶通過OAuth系統登錄,並將他們的用戶ID存儲在會話中。簡單的關係數據庫規劃建議

我的數據庫有3個表:用戶,&組頁

  • 用戶可以在許多團體
  • 一個組可以有很多用戶
  • 一個頁面可以有很多團體

所以基本上在我的設置區域:

  • 用戶可以被分配到組
  • 該組可以被添加到頁面以允許訪問

那麼我就可以使用該用戶的ID,找到什麼組(S),他們都在,然後選擇他們有權訪問的頁面ID。然而這種方法似乎很長時間,我認爲會涉及不少循環(另外,我想我會得到許多相同的頁面ID回來?)。

的我的解釋草圖起來:

http://i.imgur.com/oFVsniH.png

我有一種感覺,有一種更好的方式來完成,雖然本 - 使用一個「支點」表,3個表格...像:

http://i.imgur.com/IZfhZO1.jpg

如果有人能提供一些洞察到這將是最好的,也是我的關係(MTM)是否正確,那簡直是真棒。

FYI:構建它Laravel 4

謝謝!

回答

1

你已經完成它的方式(在你的第一個圖中)更好,因爲你已經說明了你的問題。

用戶屬於組,頁面權限被映射到組。頁面和用戶之間沒有直接的關係(即,您不能直接向用戶分配訪問頁面的權限,而只能分配給用戶所屬的組)。如果以上內容正確地描述了你想要做的事情,那麼第一個圖是設計你的數據庫的最規範化的方法。

使用第二個圖表,您可以在數據庫關係中插入無用的數據。比如你的鏈接表可以包含這些行

[user.id=1, group.id=1, page.id=1] 
[user.id=1, group.id=2, page.id=2] 
[user.id=2, group.id=2, page.id=1] 

現在,隨着這些行,2組可同時訪問第1頁和第2頁(行2和3)。但用戶2屬於組2並且只能訪問頁面1(第3行)。 您仍然可以完成這項工作,但是您需要從應用程序中控制Link中的所有行都有意義。

+0

是的,現在有道理,我沒有想到你描述的整個情況,所以會堅持規範化的方法。乾杯 – Alias

1

第一種方法(有5個表格)更加標準化。我會建議堅持這一點,除非你有一個特定的理由來反規範化。

下面的SQL將得到所有給定用戶的不同頁面ID:

select DISTINCT GP.page_id 
from GroupUser GU 
join GroupPage GP on GU.group_id = GP.group_id 
where GU.user_id = ? 
3

通常Fourth Normal Form是爲了防止你在一個路口表中存儲多個許多一對多的關係。

在這種情況下,您授予頁面對組的訪問權限,而不授予用戶。所以我不會在引用用戶成員資格的同一張表中存儲對頁面的引用。

舉例來說,您在一個組中有1000個用戶,並且該組可以訪問1個頁面。但在第二種設計中,您必須將組的訪問權限存儲在1000行的頁面上。

1

三向關係表意味着完全不同於兩個雙向關係表的東西,因爲它將三個實體連接在一起。

如果你想描述user1是在第一個二維表使用的group1成員:

user  group 
user1 group1 

但與其他領域和頁面擴展變化的含義:

user  group page 
user1 group1 page1 

這不僅在user1group1,group1page1之間產生關聯,而且在user1page1之間產生關聯。

與此同時,你可以有非常奇怪的情況是這樣的:

user  group page 
user1 group1 page1 
user1 group1 page2 
user1 group2 page1 

注意,在這個例子中,沒有與user1 group2 page2沒有行。換句話說,user1僅與page1有關,通過group2user1僅與group2有關(?!?)page1。我希望很明顯,這與你在第一位所描述的不符。

所以,我的第一個例子是與兩個關係表一起去。