我制作了一个游戏,玩家逐个移动。我有以下表格:
╔═════════╗
║ players ║
╠═════════╣
║ id ║
║ name ║
╚═════════╝
╔════════════╗
║ games ║
╠════════════╣
║ id ║
║ started_at ║
╚════════════╝
╔═════════════╗
║ game_player ║
╠═════════════╣
║ id ║
║ game_id ║
║ player_id ║
║ turn ║
╚═════════════╝
现在,我想添加moves
表来跟踪游戏的历史记录。我不确定哪种方式更好:
1)将moves
与数据透视表game_player
连接起来,如下所示:
╔════════════════╗
║ moves ║
╠════════════════╣
║ id ║
║ game_player_id ║
║ made_at ║
╚════════════════╝
2)重复game_id
和player_id
对,如下所示:
╔═══════════╗
║ moves ║
╠═══════════╣
║ id ║
║ game_id ║
║ player_id ║
║ made_at ║
╚═══════════╝
第一个解决方案使我的数据更简洁,如果我使用外键,就无法放置未使用的游戏玩家对。
使用ORM可以更轻松地处理第二种解决方案。
如何解决这个问题?是否可以通过ORM轻松使用第一个想法,也许是为游戏玩家对创建另一个实体,如Participation
?你们会怎么做?
答案 0 :(得分:1)
您的文件没有唯一性或完整性。据我了解,您需要一个关系数据库,具有关系完整性,功能和速度。
这是一个数据模型,作为讨论点。显然它并不完整,因为需要提出和关闭许多细节。然而,使用这种SO媒体来获取更快的信息比使用SO媒体来回问答更快。
拳头草稿Game Data Model
请评论/讨论。
如果您不习惯乐谱,请注意每个小刻度,刻痕和标记,实线与虚线,方形与圆角,意味着非常具体。请参阅IDEF1X Notation。
对目标来说似乎太复杂了
目标是什么?
如果您的目标是关系数据库(作为您对项目的其他目标的一部分),那么这是最小的复杂性",即生成关系数据库所需的配置,关系完整性。因此,你有责任攀登学习曲线。
否则,请从您的问题中删除database
和relational-database
标记。
我对数据库完整性的第一个想法是什么?
很明显,你一直在阅读那些声称是关系数据库的书籍,这些书籍是由对关系数据库显然一无所知的人写的,你已经实现了他们的建议,或者你看到别人做了什么。 / p>
关系模型所要求的行唯一性。例如。允许重复的Player.names。例如,游戏没有上下文。
每个文件中都有ID
个字段。这给记录ID(在RFS中)唯一性,但没有行唯一性。请仔细阅读this Answer。
EG。在你的(1)和(2)中,你允许不受他们正在玩的游戏约束的玩家移动。允许任何现有的player_id和game_id。
以上只是您所拥有的完整性错误的类型的示例,我没有全部列出。
我建议的模型修复了所有完整性错误,我没有列举我修复的所有错误,我只是给了你一个有效的数据库。
为你做出一些事情比回答问题更快
例如:
独立存在的游戏概念并不合理。游戏只存在于创建游戏的玩家的环境中。所以我已经实现了。这改善了标识符,游戏现在更具有上下文性。
同样地,没有游戏或没有参与特定游戏的玩家的移动概念是不合理的。哟有这个。该模型修复了该问题。
首先,我有响应者加入游戏,一个玩家开始。它们的总和是该特定游戏的玩家。
接下来,我的动作受限于每个特定游戏。
接下来,我在每个特定游戏中都有限制每个特定palyer的动作。
接下来,为了正确实现,我使用基本的,Relational, Basetype :: Subtype 结构。这区分了initiating_player和respond_players。它还允许我将相关约束应用于正确的表。 is_initiator
列区分基本类型。
除了一个ID
列外,所有列都已消失,当然,并没有试图摆脱它们。对于player_id剩下的只有一个,因为player.name可能太宽。如果player.name是不是他们的真实姓名,如果是user_name(例如CHAR(12))
),那么将player_id更改为user_name,整个结构会更好。请指教,我将改进模型。
现在我们有了一个关系数据库的基础。我确实将它标记为初稿,我预计会有问题,也许会有微小的变化。我没想到会覆盖记录归档系统和关系数据库之间的巨大差距。随意提问,我可能会建议为那些需要详细答案的人提出新问题。