我有一个名为Users
的表格,目前正在同时保存Customers
和Staff
的数据。它有自己的名字,电子邮件和密码等。它还有一个名为TypeOfUserID
的字段,它有一个值来说明它们是什么类型的用户。例如客户或员工
有两个单独的表格会更好吗Customers
和Staff
?
这似乎是重复,因为两种类型的用户的字段都相同。我可以摆脱的唯一字段是TypeOfUserID
列。
但是,将它们放在一个名为Users
的表中意味着在我的前端应用程序中,我必须不断添加一个子句来检查它们是什么类型的用户。如果由于任何原因我需要允许不同类型的用户访问,例如External Supplier
然后我必须在WHERE子句中的多个位置管理TypeOfUserID
的添加。
答案 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_user
和can_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服务器。很抱歉。但差异应该很小。)
您需要确保uid
和gid
是users
和groups
表中的主键,并且存在外键约束使用它们的每个其他表中的那些值;您不希望不存在的组拥有权限,或者不会将不存在的用户意外添加到组中。
图形数据库非常优雅地解决了这个问题;您只需创建将用户链接到组的边,以及将组链接到权限的边。如果您想使用当前性感/流行语兼容的技术,可能需要尝试一下,具体取决于变化的巨大程度。
您想要谷歌的短语是&#34;访问控制&#34;。您可能希望实现访问控制列表(如上所述)或类似的东西。由于这主要是与安全相关的主题,您可能还想在sec.se上提出这个问题,或者至少在那里查找相关答案。
答案 1 :(得分:0)
您可以为id
user table
foreign key
的{{1}}人员提供单独的表格作为staff table
。如果您这样做,那么任何仅与工作人员相关的功能都可以查询user table
加入staff table
。此解决方案还将为您提供未来扩展的灵活性,因为只有员工(例如他们工作的部门)成员的任何数据都可以放在{{1}}中。
答案 2 :(得分:0)
即使它们看起来很相似,但它们在逻辑上来自不同的领域。你永远不需要这些表之间的联合。但随着您的应用程序的开发,您需要为这些表添加越来越多的特定字段,它们将变得与类似的不同。