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

时间:2015-04-13 10:34:14

标签: sql relational-database one-to-many normalization data-modeling

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

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

我怀疑是否要进行规范化,我想知道哪种数据模型会给我带来最佳性能。

如果没有进行规范化,我会为Team提供这个数据模型(使用User表的外键,代表成员):

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)

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

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

感谢您的投入!

1 个答案:

答案 0 :(得分:0)

你的非规范化解决方案是一个重复组的例子,其中父母(团队)知道它的一些孩子(成员)。这是一个严肃的反模式,即使你永远只限于5个团队成员,它也会破坏未来的查询要求。您可以使用不同类型的非规范化来轻松满足两个查询,这些非规范化仅具有其子项的SET的聚合知识。

为TeamMember添加子表,并引用Team,User和Role。这将为您提供规范化的所有好处。然后为team for all_roles_are_occupied添加一个布尔标志或为number_of_members添加一个整数。是的,您必须维护该领域,但它将为您提供所需的全部速度,并且可以更灵活地查询和发展。这类似于一个帐户实体,如银行帐户,它有一个余额列,尽管它实际上只是其所有交易金额的总和。

相关问题