为公司中具有管理权限的员工设计 RBDMS
RBDMS design for Employees with admin powers in a Company
我们有两个模型,Company
和 Employee
。一个公司有很多员工。
绝大多数 Employees
没有任何管理员权限,但该公司可能有一名或多名员工拥有管理员权限。
在数据库中执行此操作的最佳方法是什么?我可以想到以下两种方式,各有利弊。
1) 在 Employee table 中指明管理员状态,即使这对大多数 Employees 来说都是错误的。好处是不必进行任何连接来确定员工是否有管理员。
Company
-------
ID
Employee
--------
ID
Company ID
Is Admin
2) 在公司和员工之间创建一个连接 table,并且只包括那些具有管理员权限的员工。每次我们想要确定员工是否具有管理员权限时,都需要加入。
Company
-------
ID
Name
Employee
--------
ID
Company ID
AdminEmployee (Is there a better name for this?)
-------------
ID
Company ID
Employee ID
通常的做法是创建可以与 users
关联的 roles
。以下是您需要的最低限度:
A company
table 列出所有公司:
company
id unsigned int(P)
name varchar(255)
...
+----+--------------------+
| id | name |
+----+--------------------+
| 1 | Acme Brick Company |
| 2 | ABC Widgets Inc |
| .. | .................. |
+----+--------------------+
A role
table 列出所有可能的角色:
role
id unsigned int(P)
description varchar(15)
+----+---------------+
| id | description |
+----+---------------+
| 1 | Administrator |
| 2 | Clerk |
| .. | ............. |
+----+---------------+
A user
table 保存所有公司的所有用户信息:
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 | ******** | ... |
| .. | .......... | ........ | ........ | ... |
+----+------------+----------+----------+-----+
最后一个关联 table 将用户和角色联系在一起。在示例数据中,您可以看到用户 bob
在 ACME Brick Company
是 Administrator
,而用户 mary
在 Administrator
和 Clerk
都是ABC Widgets Inc
和用户 john
是 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 |
| .. | ....... | ....... |
+----+---------+---------+
补充上面 Benny 的回答。
采用这种角色方法的一个重要原因是,用户可以被赋予许多具有不同权限的不同角色。然后,您可以显着提高权限的粒度,而不会增加很多成本,db-load-wise。例如,您可以有一名采购员和一名销售员。或者,您可以拥有不同类型的管理员,拥有不同的权力领域,并且可以向员工授予一项或多项权限。
它还避免了不必要的NULL等,并且可以在需要时懒惰地拉取角色。这并不意味着其他方法一定是错误的,但它们通常不太灵活。
对于其他两种方法,如果我采用那种方式,通常我会添加标志。通常,当应用程序存在并且您根本没有多个角色的域 space 时,这通常会有帮助(例如,我可以看到针对适用性有限的特定业务线工具执行此操作)。从理论上讲,单独的 table 更干净,但实际上我认为并非如此。
我们有两个模型,Company
和 Employee
。一个公司有很多员工。
绝大多数 Employees
没有任何管理员权限,但该公司可能有一名或多名员工拥有管理员权限。
在数据库中执行此操作的最佳方法是什么?我可以想到以下两种方式,各有利弊。
1) 在 Employee table 中指明管理员状态,即使这对大多数 Employees 来说都是错误的。好处是不必进行任何连接来确定员工是否有管理员。
Company
-------
ID
Employee
--------
ID
Company ID
Is Admin
2) 在公司和员工之间创建一个连接 table,并且只包括那些具有管理员权限的员工。每次我们想要确定员工是否具有管理员权限时,都需要加入。
Company
-------
ID
Name
Employee
--------
ID
Company ID
AdminEmployee (Is there a better name for this?)
-------------
ID
Company ID
Employee ID
通常的做法是创建可以与 users
关联的 roles
。以下是您需要的最低限度:
A company
table 列出所有公司:
company
id unsigned int(P)
name varchar(255)
...
+----+--------------------+
| id | name |
+----+--------------------+
| 1 | Acme Brick Company |
| 2 | ABC Widgets Inc |
| .. | .................. |
+----+--------------------+
A role
table 列出所有可能的角色:
role
id unsigned int(P)
description varchar(15)
+----+---------------+
| id | description |
+----+---------------+
| 1 | Administrator |
| 2 | Clerk |
| .. | ............. |
+----+---------------+
A user
table 保存所有公司的所有用户信息:
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 | ******** | ... |
| .. | .......... | ........ | ........ | ... |
+----+------------+----------+----------+-----+
最后一个关联 table 将用户和角色联系在一起。在示例数据中,您可以看到用户 bob
在 ACME Brick Company
是 Administrator
,而用户 mary
在 Administrator
和 Clerk
都是ABC Widgets Inc
和用户 john
是 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 |
| .. | ....... | ....... |
+----+---------+---------+
补充上面 Benny 的回答。
采用这种角色方法的一个重要原因是,用户可以被赋予许多具有不同权限的不同角色。然后,您可以显着提高权限的粒度,而不会增加很多成本,db-load-wise。例如,您可以有一名采购员和一名销售员。或者,您可以拥有不同类型的管理员,拥有不同的权力领域,并且可以向员工授予一项或多项权限。
它还避免了不必要的NULL等,并且可以在需要时懒惰地拉取角色。这并不意味着其他方法一定是错误的,但它们通常不太灵活。
对于其他两种方法,如果我采用那种方式,通常我会添加标志。通常,当应用程序存在并且您根本没有多个角色的域 space 时,这通常会有帮助(例如,我可以看到针对适用性有限的特定业务线工具执行此操作)。从理论上讲,单独的 table 更干净,但实际上我认为并非如此。