RBDMS设计适用于公司具有管理权限的员工

时间:2016-05-28 17:59:26

标签: database-design rdbms

我们有两个模型,CompanyEmployee。一家公司有很多员工。

绝大多数Employees没有任何管理员权限,但可能有一名或多名员工拥有该公司的管理员权限。

在DB中执行此操作的最佳方法是什么?我可以想到以下两种方式,两者都有利弊。

1)在Employee表中指出管理状态,即使对于大多数Employees来说这是假的。好处是不必进行任何连接来确定员工是否有管理员。

Company
-------
ID

Employee
--------
ID
Company ID
Is Admin 

2)在公司和员工之间创建联结表,并仅包括具有管理员权限的员工。每当我们想要确定员工是否具有管理员权力时,这需要加入。

Company
-------
ID
Name

Employee
--------
ID
Company ID

AdminEmployee (Is there a better name for this?)
-------------
ID
Company ID
Employee ID

2 个答案:

答案 0 :(得分:3)

执行此类操作的常用方法是创建可与roles关联的users。以下是您需要的最低要求:

列出所有公司的company表:

company
    id                  unsigned int(P)
    name                varchar(255)
    ...
+----+--------------------+
| id | name               |
+----+--------------------+
|  1 | Acme Brick Company |
|  2 | ABC Widgets Inc    |
| .. | .................. |
+----+--------------------+

列出所有可能角色的role表:

role
    id                  unsigned int(P)
    description     varchar(15)

+----+---------------+
| id | description   |
+----+---------------+
|  1 | Administrator |
|  2 | Clerk         |
| .. | ............. |
+----+---------------+

一个user表,用于保存所有公司的所有用户信息:

user
    id          unsigned int(P)
    company_id  unsigned int(F company.id)
    username    varchar(255)
    password    varbinary(255)
    etc.

+----+------------+----------+----------+-----+
| id | company_id | username | password | ... |
+----+------------+----------+----------+-----+
|  1 |          1 | bob      | ******** | ... |
|  2 |          2 | mary     | ******** | ... |
|  3 |          2 | john     | ******** | ... |
| .. | .......... | ........ | ........ | ... |
+----+------------+----------+----------+-----+

最后是一个将用户和角色绑定在一起的关联表。在示例数据中,您可以在bob看到用户AdministratorACME Brick Company,而用户mary同时是AdministratorClerk ABC Widgets Incjohn用户Clerk位于ABC Widgets Inc

user_role
    user_id    unsigned int(F user.id)\_(P)
    role_id    unsigned int(F role.id)/

+----+---------+---------+
| id | user_id | role_id |
+----+---------+---------+
|  1 |       1 |       2 |
|  2 |       2 |       1 |
|  3 |       2 |       2 |
|  4 |       3 |       2 |
| .. | ....... | ....... |
+----+---------+---------+

答案 1 :(得分:2)

补充Benny上面的答案。

采用这种角色方法的一个重要原因是,用户可以被赋予许多具有不同权限的不同角色。然后,您可以显着提高权限的粒度,而无需大量增加成本,db-load-wise。例如,您可以有一名采购员和一名销售员。或者您可以拥有不同类型的管理员,具有不同的权力范围,并且可以授予员工一个或多个权限。

它还可以避免不必要的NULL等,并且可以在需要时拉伸角色。这并不意味着其他方法必然是错误的,但它们通常不太灵活。

对于其他两种方法,通常我会添加标志,如果我这样做。通常,当应用程序存在且您根本没有多个角色的域空间时(例如,我可以看到针对具有有限适用性的特定业务线工具执行此操作)将会有所帮助。理论上,单独的表格更清晰,但在实践中我认为不是。