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 |
| .. | ....... | ....... |
+----+---------+---------+

补充上面本尼的回答

采用这种角色方法的一个重要原因是,用户可以被赋予许多具有不同权限的不同角色。然后,您就可以在不增加大量成本的情况下显著提高权限的粒度,而不增加数据库负载。例如,您可以有一个采购员和一个销售员。或者你可以有不同种类的管理员,拥有不同的权限,员工可以被授予一个或多个权限

它还避免了不必要的空值等,并且角色可以在您需要时被惰性地拉入。这并不意味着其他方法必然是错误的,但它们通常不那么灵活


对于其他两种方法,如果我这样做,通常会添加标志。通常,如果应用程序是,而您没有多个角色的域空间,那么这将非常有用(例如,我可以看到,对于适用性有限的特定业务线工具这样做)。理论上,单独的表格比较干净,但实际上我不这么认为。

补充了本尼的上述答案

采用这种角色方法的一个重要原因是,用户可以被赋予许多具有不同权限的不同角色。然后,您就可以在不增加大量成本的情况下显著提高权限的粒度,而不增加数据库负载。例如,您可以有一个采购员和一个销售员。或者你可以有不同种类的管理员,拥有不同的权限,员工可以被授予一个或多个权限

它还避免了不必要的空值等,并且角色可以在您需要时被惰性地拉入。这并不意味着其他方法必然是错误的,但它们通常不那么灵活


对于其他两种方法,如果我这样做,通常会添加标志。通常,如果应用程序是,而您没有多个角色的域空间,那么这将非常有用(例如,我可以看到,对于适用性有限的特定业务线工具这样做)。理论上,单独的桌子更干净,但实际上我不这么认为。

是的,有道理。到目前为止,只有两个角色:管理员和非管理员,但在未来可能会有更多的角色,所以我还是做好准备。我也同意你的最后一段。是的,有道理。到目前为止,只有两个角色:管理员和非管理员,但在未来可能会有更多的角色,所以我还是做好准备。我也同意你的最后一段。