Database design RBDMS为公司拥有管理权限的员工设计
我们有两种模式,Database design RBDMS为公司拥有管理权限的员工设计,database-design,rdbms,Database Design,Rdbms,我们有两种模式,公司和员工。一家公司有很多员工 绝大多数员工没有任何管理权限,但可能有一名或多名员工在该公司拥有管理权限 在DB中执行此操作的最佳方式是什么?我可以想到以下两种方法,两者都有利弊 1) 在Employee表中指明管理员状态,即使对于大多数员工来说这是错误的。好处是不必进行任何联接来确定员工是否有管理员 Company ------- ID Employee -------- ID Company ID Is Admin 2) 在公司和员工之间创建一个连接表,并仅包括具有管理
公司
和员工
。一家公司有很多员工
绝大多数员工
没有任何管理权限,但可能有一名或多名员工在该公司拥有管理权限
在DB中执行此操作的最佳方式是什么?我可以想到以下两种方法,两者都有利弊
1) 在Employee表中指明管理员状态,即使对于大多数员工来说这是错误的。好处是不必进行任何联接来确定员工是否有管理员
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
这样做的通常方法是创建可与
用户关联的角色
。以下是您需要的最低要求:
列出所有公司的公司
表:
company
id unsigned int(P)
name varchar(255)
...
+----+--------------------+
| id | name |
+----+--------------------+
| 1 | Acme Brick Company |
| 2 | ABC Widgets Inc |
| .. | .................. |
+----+--------------------+
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 | ******** | ... |
| .. | .......... | ........ | ........ | ... |
+----+------------+----------+----------+-----+
一个role
表格,列出所有可能的角色:
role
id unsigned int(P)
description varchar(15)
+----+---------------+
| id | description |
+----+---------------+
| 1 | Administrator |
| 2 | Clerk |
| .. | ............. |
+----+---------------+
用于保存所有公司的所有用户信息的user
表:
company
id unsigned int(P)
name varchar(255)
...
+----+--------------------+
| id | name |
+----+--------------------+
| 1 | Acme Brick Company |
| 2 | ABC Widgets Inc |
| .. | .................. |
+----+--------------------+
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
是acmebrick公司的管理员
,而用户mary
在abcwidgets公司既是管理员
又是办事员
,用户john
在abcwidgets公司是办事员
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 |
| .. | ....... | ....... |
+----+---------+---------+
这样做的通常方法是创建可与用户关联的角色
。以下是您需要的最低要求:
列出所有公司的公司
表:
company
id unsigned int(P)
name varchar(255)
...
+----+--------------------+
| id | name |
+----+--------------------+
| 1 | Acme Brick Company |
| 2 | ABC Widgets Inc |
| .. | .................. |
+----+--------------------+
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 | ******** | ... |
| .. | .......... | ........ | ........ | ... |
+----+------------+----------+----------+-----+
一个role
表格,列出所有可能的角色:
role
id unsigned int(P)
description varchar(15)
+----+---------------+
| id | description |
+----+---------------+
| 1 | Administrator |
| 2 | Clerk |
| .. | ............. |
+----+---------------+
用于保存所有公司的所有用户信息的user
表:
company
id unsigned int(P)
name varchar(255)
...
+----+--------------------+
| id | name |
+----+--------------------+
| 1 | Acme Brick Company |
| 2 | ABC Widgets Inc |
| .. | .................. |
+----+--------------------+
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
是acmebrick公司的管理员
,而用户mary
在abcwidgets公司既是管理员
又是办事员
,用户john
在abcwidgets公司是办事员
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 |
| .. | ....... | ....... |
+----+---------+---------+
补充上面本尼的回答
采用这种角色方法的一个重要原因是,用户可以被赋予许多具有不同权限的不同角色。然后,您就可以在不增加大量成本的情况下显著提高权限的粒度,而不增加数据库负载。例如,您可以有一个采购员和一个销售员。或者你可以有不同种类的管理员,拥有不同的权限,员工可以被授予一个或多个权限
它还避免了不必要的空值等,并且角色可以在您需要时被惰性地拉入。这并不意味着其他方法必然是错误的,但它们通常不那么灵活
对于其他两种方法,如果我这样做,通常会添加标志。通常,如果应用程序是,而您没有多个角色的域空间,那么这将非常有用(例如,我可以看到,对于适用性有限的特定业务线工具这样做)。理论上,单独的表格比较干净,但实际上我不这么认为。补充了本尼的上述答案
采用这种角色方法的一个重要原因是,用户可以被赋予许多具有不同权限的不同角色。然后,您就可以在不增加大量成本的情况下显著提高权限的粒度,而不增加数据库负载。例如,您可以有一个采购员和一个销售员。或者你可以有不同种类的管理员,拥有不同的权限,员工可以被授予一个或多个权限
它还避免了不必要的空值等,并且角色可以在您需要时被惰性地拉入。这并不意味着其他方法必然是错误的,但它们通常不那么灵活
对于其他两种方法,如果我这样做,通常会添加标志。通常,如果应用程序是,而您没有多个角色的域空间,那么这将非常有用(例如,我可以看到,对于适用性有限的特定业务线工具这样做)。理论上,单独的桌子更干净,但实际上我不这么认为。是的,有道理。到目前为止,只有两个角色:管理员和非管理员,但在未来可能会有更多的角色,所以我还是做好准备。我也同意你的最后一段。是的,有道理。到目前为止,只有两个角色:管理员和非管理员,但在未来可能会有更多的角色,所以我还是做好准备。我也同意你的最后一段。