一对多(定数)关系的规范化

Normalization of one-to-many (fixed number) relation

我需要为最多 5 名成员的团队建模,每个成员都有不同的角色。角色可以取消分配,因此团队成员将少于 5 人。成员的最大数量在未来不太可能改变。一个用户只能是一个团队的成员。

已添加:管理员可以将用户分配给团队。管理员拥有用户实体的所有权。

我不确定是否要进行归一化,我想知道哪种数据模型会给我留下最好的性能。

如果不进行规范化,我将为 Team 使用此数据模型(带有指向用户 table 的外键,其中代表成员):

role1 (User FK)
role2 (User FK)
role3 (User FK)
role4 (User FK)
role5 (User FK)

如果规范化,我会在用户和团队之间建立关系:

team_id (Team FK)
user_id (User FK)
role (ENUM)

编辑: 对于管理员,我需要能够找到拥有用户的所有团队。 此外,我需要能够找到一个或多个给定角色未被成员占据的团队。

我可以看到做和不做标准化的利弊。在上面的两个查询中,第一个似乎受益于规范化,而第二个似乎受益于扁平化数据模型。

感谢您的意见!

您的非规范化解决方案是重复组的一个示例,其中父组(团队)知道其子组(成员)的一些信息。这是一个严重的反模式,即使您永远限制在 5 个团队成员内,它也会扰乱未来的查询需求。您可以使用另一种非规范化轻松地满足这两个查询,这种非规范化仅具有其子项 SET 的聚合知识。

为 TeamMember 添加一个子项 table,并引用团队、用户和角色。这将为您提供规范化的所有好处。然后为 all_roles_are_occupied 添加一个布尔标志或为 number_of_members 添加一个整数。是的,你必须维护这个领域,但它会给你所有你需要的速度,以及更大的查询和发展灵活性。这类似于账户实体,例如银行账户,其中有一个余额列,尽管它实际上只是所有交易金额的总和。