1

我正在设计一个数据库,我有一个包含用户的用户表,以及一个包含用户组的组表。

这些组将有一个所有者(创建它的用户)和一组属于该组的用户(如 Whatsapp 组)。

为了代表这一点,我有这样的设计:

在此处输入图像描述

你觉得桌子上的owner那一栏Group有必要吗?也许我可以owner在表上添加一列,Group我可以很容易地知道该组的所有者。

4

4 回答 4

2

如果您不添加ownergroup那么您要在哪里添加呢?除此之外,我看到的唯一方法是isownerusergroup. 无论如何,如果只有 1 个所有者,这是没有意义的。如果可以有N所有者,那么这将是要走的路。

于 2013-10-31T06:35:08.103 回答
0

我知道已经提出了一个解决方案,但我坚信有一个更好的解决方案......

在更高的层次上,所有者的概念可以看作是用户和组之间存在的关系的一种属性。理想情况下,它应该设置为UserGroup 表中的一个字段

它可以是布尔字段,或者更好的是通用userGroupNatureOfRelation字段,可以保存诸如“所有者”、“参与者”、“用户”之类的值,或者任何可能的状态。

当然,这样的解决方案允许您实施任何特定的业务规则,例如“每个组只有一个所有者”。它可以让您在需要时实现任何其他更复杂的业务规则,甚至可以通过添加以下字段来增加一定程度的复杂性:

  • userGroupRelationStartDate
  • userGroupRelationEndDate

在这里,您将能够随着时间的推移跟踪一个群体和一个人之间关系的性质......

当然你可以说“我不需要它”。但是实施这样一个“开放”模型的成本并不比你现在所想的多。然后,如果出于任何原因,在不久的将来或遥远的将来,必须更改或改进业务规则,您的模型将保持有效和高效......

也就是说,使用此模型构建视图和操作数据应该容易得多。所以这是采用它的一个很好的直接理由!

于 2013-10-31T07:37:11.220 回答
0

您走在正确的轨道上,但您还需要进一步确保所有者必须真正属于她所拥有的组:

在此处输入图像描述

组 {groupID, owner} 中有一个引用 UserGroup {groupID, userID} 的 FOREIGN KEY。

如果您的 DBMS 支持延迟外键,您可以将所有者设为 NOT NULL,以确保组不能是无所有者的。否则,您可以将其保留为 NULL(如果您的 DBMS 支持MATCH SIMPLE FK ,您仍然可以通过循环引用打破“鸡和蛋”问题- 几乎所有都支持)。

于 2013-10-31T07:05:02.483 回答
0

你需要4张桌子:

  • 用户

  • 用户组

  • 团体

  • UserRole(与 UserGroup 关联)- 显示用户在组中的角色(管理员/所有者等)- 如果您的角色是管理员和普通用户,您可以在 UserGroup 上使用 Binary 列。

于 2013-10-31T06:34:47.320 回答