用户角色数据库架构设计

时间:2012-02-16 17:57:19

标签: php mysql sql postgresql scalability

我正在考虑涉及拥有用户和用户角色的架构设计,但我不确定什么是更好的路径。

选项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解决方案。

2 个答案:

答案 0 :(得分:1)

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

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

拥有那么多重复数据会降低你的数据库速度,最终即使你少了一个连接,事情也会慢得多。

如果您运行大量基于角色的查询,并且像您需要一个类似于选项二的数据库,您仍然可以创建一个视图并让数据库缓存它,但我怀疑这对您有什么用处。< / p>

答案 1 :(得分: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',添加权限'配置',设置所有权限,就是这样。