2013-06-24 30 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。我希望很明显,这与你在第一位所描述的不符。

所以,我的第一个例子是与两个关系表一起去。