在db中同时存在预定义用户角色和自定义用户角色的情况下实现表关系

时间:2014-10-22 09:32:19

标签: sql oracle database-design oracle11g user-roles

我正在开发数据库设计,以在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)

这没有考虑让用户具有“自定义”角色的可能性。

这些方法中的任何一种都接近设计的方式吗?或者我是以错误的方式进入这个?

1 个答案:

答案 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

等。