我正在开发数据库设计,以在Oracle 11g数据库中实现用户角色。这种关系是多对多的,但是这种设置的不同之处在于用户可以拥有具有预先确定的访问权限集的特定用户类型(管理员,用户等),或者用户类型是自定义的并且将具有仅限此用户的访问权限列表。我尝试了很多方法,我将简要列出,但似乎都没有一个完整而强大的解决方案。
另一件事是我想尽量减少user_responsibilities中的数据,所以如果100万用户使用'用户'并且有10个'用户'职责,我不希望他们有5百万条记录,只有5。 / p>
方法1:
users (username, usertype)
user_responsibilites (usertype, username, responsibility_description) // username is null if usertype is not 'custom'
Example: USERS:
username usertype
-------- --------
user1 admin
user2 custom
user3 admin
USER_RESPONSIBILITIES:
usertype username responsibility_description
-------- -------- --------------------------
admin null create_user
admin null delete_user
admin null update_user
custom user2 create_user
custom user2 add_responsibility
但是使用这种方法,我无法链接这两个表,因为user_responsibilities没有主键或唯一键。
我还研究了经典的Junction Table方法:
方法2:
users (username, usertype)
user_responsibilites (username, responsibility_description)
responsibilities (responsibility_description)
但是如果usertype是'admin'并且因此已经具有预定义的职责,则不考虑这一点。我必须在user_responsibilites中为每个用户/ responsiblity_desc使用一条记录。 (1百万用户发行)。
方法3:
users (username, usertype)
user_responsibilites (usertype, responsibility_description)
这没有考虑让用户具有“自定义”角色的可能性。
这些方法中的任何一种都接近设计的方式吗?或者我是以错误的方式进入这个?
答案 0 :(得分:0)
我工作的ERP程序(优先级)有类似的东西:用户可以从一个组继承他们的权限,或者他们是他们自己的组。根据这一点,在用户表中,您需要一个名称为“权限组”的字段,该字段将是“权限组”表的外键,后者又链接到“权限”表。
因此,在您的情况下,您似乎拥有以下数据/结构:
PERMISSION_GROUP
id | name
1 Admin
2 user2
USERS
username | pergroup
user1 1
user2 2
user3 1
PERMISSIONS
pergroup | action
1 create_user
1 delete_user
1 read access to 'orders' table
1 write access to 'orders' table
2 read access to 'orders' table
等。