它是否遵循最佳实践数据库设计,将员工和客户详细信息混合在一个表中?

时间:2014-06-20 13:21:03

标签: sql sql-server

我有一个名为Users的表格,目前正在同时保存CustomersStaff的数据。它有自己的名字,电子邮件和密码等。它还有一个名为TypeOfUserID的字段,它有一个值来说明它们是什么类型的用户。例如客户或员工

有两个单独的表格会更好吗CustomersStaff

这似乎是重复,因为两种类型的用户的字段都相同。我可以摆脱的唯一字段是TypeOfUserID列。

但是,将它们放在一个名为Users的表中意味着在我的前端应用程序中,我必须不断添加一个子句来检查它们是什么类型的用户。如果由于任何原因我需要允许不同类型的用户访问,例如External Supplier然后我必须在WHERE子句中的多个位置管理TypeOfUserID的添加。

3 个答案:

答案 0 :(得分:2)

简答:

这取决于。如果您当前的需求得到满足,并且您不能预见这个模型需要长时间更换/如果您不得不这样做很容易改变,请坚持下去。

更长的回答:

如果工作人员只是用户的特殊情况,我不会发现您想要更改数据库结构的任何理由。是的,对于员工特定的东西,你需要确定这个人是员工,但我真的没有看到任何解决方法 - 你首先必须要知道他们是员工,<。 / p>

但是,如果您希望获得比二进制更细粒度的权限(一个人可以属于&#39;员工&#39;组,但是并不一定要说他们是否属于&#39;例如,用户&#39;您可能想要更改数据库。

当然,最简单的方法是使用与每个用户关联的唯一ID,并使用该密钥在不同的表中查找其组权限。

类似的东西:

uid   | group
------------
1     | users
1     | staff
2     | users
3     | staff
4     | users
5     | admin

虽然您可能想要或不想要每个组的实际字符串;最有可能的是,您希望通过拥有一个&#39;群组来实现另一个间接层次。表。所以,上面的表格是一个 &#39; group_membership&#39;表,它看起来更像是:

uid   | gid
------------
1     | 1
1     | 2
2     | 1
3     | 2
4     | 1
5     | 3

与此同时,您拥有&#39;&#39;&#39;表,这将是:

gid  |  group
-------------
1    |  users
2    |  staff
3    |  admin

但是,只有当你想象更多的角色而你想要更多的灵活性时,才会这样。如果您只打算让用户使用&#39;和&#39;员工&#39;工作人员只是高度特权的用户,所有这些额外的东西都会浪费你的时间。

但是,如果您希望获得非常精细的权限,并且具有最大的灵活性,则可以使用上述方法通过“权限”来实现这些权限。表:

gid  | can_create_user | can_fire_people | can_ban_user
-------------------------------------------------------
1    | false           | false           | false
2    | true            | false           | true
3    | true            | true            | true

一些示例代码

这是一个有效的PostgreSQL示例,为拥有uid 1的用户获取权限can_create_usercan_fire_people

SELECT bool_or(can_create_user) AS can_create_user,
       bool_or(can_fire_people) AS can_fire_people
FROM permissions
WHERE gid IN (SELECT gid FROM group_membership WHERE uid = 1);

哪会回来:

can_create_user | can_fire_people 
----------------------------------
true            | false           

因为用户1在第1组和第2组中,而第2组具有can_create_user权限,但是 两个群组都没有can_fire_people权限。

((我知道你正在使用SQL Server,但我现在只能访问PostgreSQL服务器。很抱歉。但差异应该很小。)

备注

您需要确保uidgidusersgroups表中的主键,并且存在外键约束使用它们的每个其他表中的那些值;您不希望不存在的组拥有权限,或者不会将不存在的用户意外添加到组中。

替代地

图形数据库非常优雅地解决了这个问题;您只需创建将用户链接到组的边,以及将组链接到权限的边。如果您想使用当前性感/流行语兼容的技术,可能需要尝试一下,具体取决于变化的巨大程度。

更多信息

您想要谷歌的短语是&#34;访问控制&#34;。您可能希望实现访问控制列表(如上所述)或类似的东西。由于这主要是与安全相关的主题,您可能还想在sec.se上提出这个问题,或者至少在那里查找相关答案。

答案 1 :(得分:0)

您可以为id user table foreign key的{​​{1}}人员提供单独的表格作为staff table。如果您这样做,那么任何仅与工作人员相关的功能都可以查询user table加入staff table。此解决方案还将为您提供未来扩展的灵活性,因为只有员工(例如他们工作的部门)成员的任何数据都可以放在{{1}}中。

答案 2 :(得分:0)

即使它们看起来很相似,但它们在逻辑上来自不同的领域。你永远不需要这些表之间的联合。但随着您的应用程序的开发,您需要为这些表添加越来越多的特定字段,它们将变得与类似的不同。