在数据库对象上启用/禁用功能的合理方法是什么?

时间:2012-09-26 17:56:05

标签: database database-design database-normalization

假设我有一个包含常规用户名,密码和电子邮件字段的用户数据库表。添加其他布尔字段以启用/禁用任何给定用户的功能的合理方法是什么。

如,

user_can_view_page_x
user_can_send_emails
user_can_send_pms
etc

将一堆布尔列添加到现有用户表似乎是错误的方法。

2 个答案:

答案 0 :(得分:1)

是的,我认为这是错误的方法。

我宁愿创建一个

User_Features Table 

使用类似

的列
UserID
FeatureName

并检查指定用户是否在表格中启用/输入了相关功能。

您甚至可以创建一个Users_Groups表,其中用户也与组相关联,并且可以从组设置继承/禁止功能。

答案 1 :(得分:1)

我会使用三张桌子。

一个是您现有的用户表:

USER table
----
user_id (pk)
name
email
...

另一个是包含可能的用户权限的表:

PRIVILEGE table
----
privilege_id (pk)
name

最后是一个连接表,其中包含每个用户的每个权限设置的条目:

USER_PRIVILEGE table
----
user_id (pk) (fk)
privilege_id (pk) (fk)
allowed

以下是两个用户的一些示例数据,一个具有send email特权和send pms特权,另一个具有视图页面特权:

USER数据

USER_ID  NAME   EMAIL
-------  -----  -------------------
1        USER1  user1@somewhere.com
2        USER2  user2@somewhere.com

PRIVILEGE数据

PRIVILEGE_ID  NAME
------------  -----------
1             view_page_x
2             send_email
3             send_pms

USER_PRIVILEGE数据

USER_ID  PRIVILEGE_ID  ALLOWED
-------  ------------  -------
1        1             'N'
1        2             'Y'
1        3             'Y'
2        1             'Y'
2        2             'N'
2        3             'N'