2012-02-16 74 views
0

我正在考虑涉及具有用户和用户角色的模式设计,但我不确定哪条路线更好。用户角色数据库架构设计

选项1

创建三个表,一个与用户信息,一个与角色信息,并用一个个用户的角色关系。

users { 
    u_id, 
    etc 
} 

roles { 
    r_id, 
    r_name, 
    etc 
} 

user_roles { 
    u_idm 
    r_id 
} 

选项2

创建两个表,一个与用户信息,和其他与角色,角色信息,以及相关信息。

users { 
    u_id, 
    etc 
} 

roles { 
    r_id, 
    u_id, 
    r_name, 
    etc 
} 

选项1更强大,但需要额外的连接。选项2将需要一个额外的主键,但只会是一个连接。如果我更改角色名称,使用选项进行更新需要更长的时间,但我不希望更新频繁。

对于可扩展的解决方案,哪个更好?我错过了什么其他的见解?这是针对mysql和postgresql的解决方案。

回答

1

选项1. 如果只有一个用户可以拥有每个角色,那么角色有什么用? 如果您有100个注册用户,则会有100个“注册用户”的重复定义。

“等”越多,你的数据库就会越大。

拥有那么多副本会减慢数据库的速度,最终事情会变慢很多,即使你只有一个连接少一点。

如果你运行很多基于角色的查询,并且像你需要一个类似于选项2的数据库那样的数据库,你仍然可以创建一个视图并让数据库缓存它,但是我怀疑这对你有什么好处。

0

我会去与一些变化的第一个选项:

- each user can belong to ONLY ONE group 
- create a table defining privileges 
- each group has a list of privileges 

定义的权限可以被映射到应用程序的不同模块或特定的功能。

该解决方案简单,灵活,快捷。 特权和组表都应该非常小,所以额外的JOIN不会产生如此严重的影响。此外,经过身份验证的用户权限可以存储在会话中,而不是每次都加载。 由于解决方案非常灵活并且易于扩展,因此长期会有更多优势。

例如,您将创建一个名为“Configuration”的新模块,并且您希望创建一个名为“superadmin”的新用户组,以便随处访问和“配置”。您只需在数据库中进行更改:创建组“superadmin”,添加权限“配置”,设置所有权限,就是这样。

+0

一组不符合本网站的要求。用户可以是品牌,会员,品牌管理员,客户等或者这些种类的组合。 – 2012-02-16 18:38:55