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

Sql 一对多(固定数)关系的规范化,sql,relational-database,one-to-many,normalization,data-modeling,Sql,Relational Database,One To Many,Normalization,Data Modeling,我需要建立一个最多有5名成员的团队模型,每个成员都有不同的角色。角色可以取消分配,因此团队成员将少于5名。成员的最大数量在未来不太可能改变。用户只能是一个团队的成员 添加:管理员可以将用户分配给团队。管理员拥有用户实体的所有权 我怀疑是否要进行规范化,我想知道哪个数据模型会给我留下最好的性能 如果不进行规范化,我会将此datamodel for Team与用户表的外键一起使用,其中的成员表示为: role1 (User FK) role2 (User FK) role3 (User FK) ro

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

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

我怀疑是否要进行规范化,我想知道哪个数据模型会给我留下最好的性能

如果不进行规范化,我会将此datamodel for Team与用户表的外键一起使用,其中的成员表示为:

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个团队成员,也会打乱未来的查询需求。您可以使用一种不同的非规范化来轻松满足这两个查询,这种非规范化只包含其子项集合的聚合知识


为TeamMember添加一个子表,其中包含对团队、用户和角色的引用。这将为您带来规范化的所有好处。然后为团队添加一个布尔标志,表示所有角色被占用,或者为成员数添加一个整数。是的,您必须维护该字段,但它将为您提供所需的所有速度,并为查询和发展提供更大的灵活性。这类似于账户实体,如银行账户,其中有一列余额,尽管它实际上只是其所有交易金额的总和。

引用您的问题:用户只能是一个团队的成员。然后对于一个用户,我需要能够找到他所在的所有团队。那么,一个用户将只属于一个团队还是属于多个团队?你能解释一下吗?我在提问之前简化了模型-谢谢你注意到这个小故障并通知我。我已经编辑了这个问题。我想知道哪个数据模型会给我留下最好的性能。您预计会有多少团队成员和用户?