加入数据透视表与复制列

时间:2015-04-25 23:41:30

标签: database orm foreign-keys relational-database foreign-key-relationship

我制作了一个游戏,玩家逐个移动。我有以下表格:

╔═════════╗
║ 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_idplayer_id对,如下所示:

╔═══════════╗
║   moves   ║
╠═══════════╣
║ id        ║
║ game_id   ║
║ player_id ║
║ made_at   ║
╚═══════════╝

第一个解决方案使我的数据更简洁,如果我使用外键,就无法放置未使用的游戏玩家对。

使用ORM可以更轻松地处理第二种解决方案。

如何解决这个问题?是否可以通过ORM轻松使用第一个想法,也许是为游戏玩家对创建另一个实体,如Participation?你们会怎么做?

1 个答案:

答案 0 :(得分:1)

初步回复

您的文件没有唯一性或完整性。据我了解,您需要一个关系数据库,具有关系完整性,功能和速度。

这是一个数据模型,作为讨论点。显然它并不完整,因为需要提出和关闭许多细节。然而,使用这种SO媒体来获取更快的信息比使用SO媒体来回问答更快。

拳头草稿Game Data Model

请评论/讨论。

如果您不习惯乐谱,请注意每个小刻度,刻痕和标记,实线与虚线,方形与圆角,意味着非常具体。请参阅IDEF1X Notation

对评论的回应

  

对目标来说似乎太复杂了

目标是什么?

如果您的目标是关系数据库(作为您对项目的其他目标的一部分),那么这是最小的复杂性",即生成关系数据库所需的配置,关系完整性。因此,你有责任攀登学习曲线。

否则,请从您的问题中删除databaserelational-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列区分基本类型。

    • 如果您想了解有关子类型的更多信息,请参阅this document
  • 除了一个ID列外,所有列都已消失,当然,并没有试图摆脱它们。对于player_id剩下的只有一个,因为player.name可能太宽。如果player.name是不是他们的真实姓名,如果是user_name(例如CHAR(12))),那么将player_id更改为user_name,整个结构会更好。请指教,我将改进模型。

现在我们有了一个关系数据库的基础。我确实将它标记为初稿,我预计会有问题,也许会有微小的变化。我没想到会覆盖记录归档系统和关系数据库之间的巨大差距。随意提问,我可能会建议为那些需要详细答案的人提出新问题。