我正在构建一个具有以下要求的应用程序:
-> 一个用户可以是不同球队的球员。 -> 团队可以是运动类型的。
我的问题是:
-> 由于对于每种运动类型,我想存储玩家的不同信息,那么建模的最佳方法是什么?
我考虑过为每种运动准备几个模型(和桌子),例如:
Basketball_Players、Football_Players 等,但我不确定这是否是一个好方法。您通常如何在 RoR 上执行此操作?
我想说你有两个选择,而且我不知道在不知道你的应用程序要求的详细信息的情况下是否真的可以说哪一个是“最正确”的方法。
给定的是,您将拥有一张
sport
桌子和一张 player
桌子。我可以肯定地说。问题是如何将两者联系起来。
选项 1:单个联接表
您可以有一个名为
player_sport
(或其他)的表,其中包含 player_id
列、sport_id
列和 serialized_player_data
列或类似的内容,您可以在其中保存序列化的玩家数据(JSON,也许)取决于运动。 优点:简单的模式。 缺点:未正确标准化,因此会出现不一致。
选项 2:每个运动都有单独的连接表
这就是您在问题中提到的内容,其中有
basketball_player
、football_player
等。这里您还有一个 player_id
列,但可能不是 sport_id
列,因为现在它是多余的您在表名称中指定了运动项目。对 serialized_player_data
列的需求将会消失,因为您现在可以自由地将所需的属性直接存储在列中,例如wrestling_player.weight_class_id
或其他什么。 优点:适当的标准化。 缺点:更复杂的架构,因此需要在应用程序代码中进行更多工作。
实际上还有第三种选择:
选项 3:1 和 2 的组合
在这里,您可以执行选项 2 中要做的所有操作,除了将常见球员属性移至
player_sport
表并保存 basketball_player
等特定于运动的属性。因此 weight_class_id
将保留在 wrestling_player
中,但 player_sport
将拥有 height
、weight
以及与所有运动相关的其他列。
如果您正在寻找建议,我可能会选择选项 2,或者,如果看起来有足够的重叠使其有意义,则选择选项 3。
我正在开发自己的类似项目 - MudClub - 最终决定在球员/教练和团队之间使用 has_and_belongs_to_many 用例。