我正在构建一个具有以下要求的应用程序:
-> 一个用户可以是不同球队的球员。-> 团队可以是运动类型。
我的问题是:
-> 因为对于每种运动类型,我都想存储玩家的不同信息,那么最好的建模方法是什么?
我考虑过为每种运动设置几个模型(和表格),例如:
Basketball_Players、Football_Players 等等,但我不确定这是否是一个好方法。您通常如何在 RoR 上执行此操作?
我正在构建一个具有以下要求的应用程序:
-> 一个用户可以是不同球队的球员。-> 团队可以是运动类型。
我的问题是:
-> 因为对于每种运动类型,我都想存储玩家的不同信息,那么最好的建模方法是什么?
我考虑过为每种运动设置几个模型(和表格),例如:
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。