我正在设计一个数据库,我有一个包含用户的用户表,以及一个包含用户组的组表。
这些组将有一个所有者(创建它的用户)和一组属于该组的用户(如 Whatsapp 组)。
为了代表这一点,我有这样的设计:
你觉得桌子上的owner
那一栏Group
有必要吗?也许我可以owner
在表上添加一列,Group
我可以很容易地知道该组的所有者。
我正在设计一个数据库,我有一个包含用户的用户表,以及一个包含用户组的组表。
这些组将有一个所有者(创建它的用户)和一组属于该组的用户(如 Whatsapp 组)。
为了代表这一点,我有这样的设计:
你觉得桌子上的owner
那一栏Group
有必要吗?也许我可以owner
在表上添加一列,Group
我可以很容易地知道该组的所有者。
如果您不添加owner
,group
那么您要在哪里添加呢?除此之外,我看到的唯一方法是isowner
在usergroup
. 无论如何,如果只有 1 个所有者,这是没有意义的。如果可以有N
所有者,那么这将是要走的路。
我知道已经提出了一个解决方案,但我坚信有一个更好的解决方案......
在更高的层次上,所有者的概念可以看作是用户和组之间存在的关系的一种属性。理想情况下,它应该设置为UserGroup 表中的一个字段。
它可以是布尔字段,或者更好的是通用userGroupNatureOfRelation
字段,可以保存诸如“所有者”、“参与者”、“用户”之类的值,或者任何可能的状态。
当然,这样的解决方案允许您实施任何特定的业务规则,例如“每个组只有一个所有者”。它可以让您在需要时实现任何其他更复杂的业务规则,甚至可以通过添加以下字段来增加一定程度的复杂性:
userGroupRelationStartDate
userGroupRelationEndDate
在这里,您将能够随着时间的推移跟踪一个群体和一个人之间关系的性质......
当然你可以说“我不需要它”。但是实施这样一个“开放”模型的成本并不比你现在所想的多。然后,如果出于任何原因,在不久的将来或遥远的将来,必须更改或改进业务规则,您的模型将保持有效和高效......
也就是说,使用此模型构建视图和操作数据应该容易得多。所以这是采用它的一个很好的直接理由!
您走在正确的轨道上,但您还需要进一步确保所有者必须真正属于她所拥有的组:
组 {groupID, owner} 中有一个引用 UserGroup {groupID, userID} 的 FOREIGN KEY。
如果您的 DBMS 支持延迟外键,您可以将所有者设为 NOT NULL,以确保组不能是无所有者的。否则,您可以将其保留为 NULL(如果您的 DBMS 支持MATCH SIMPLE FK ,您仍然可以通过循环引用打破“鸡和蛋”问题- 几乎所有都支持)。
你需要4张桌子:
用户
用户组
团体
UserRole(与 UserGroup 关联)- 显示用户在组中的角色(管理员/所有者等)- 如果您的角色是管理员和普通用户,您可以在 UserGroup 上使用 Binary 列。