数据结构 - 卡片的表示

时间:2011-09-16 12:41:47

标签: entity-framework database-design

这是一个数据结构/映射问题。我正在使用MSSQL,.NET和EF(以及MVC,如果这很重要)。我有一张桌子代表一副牌。卡的状态是:

  1. 在甲板上面朝下
  2. 在甲板上面朝上(丢弃)
  3. 在玩家面前
  4. 在玩家的手中
  5. ......并且可以有X个玩家。我有一张表代表玩家的桌子,有自己独特的钥匙。假设每个玩家都在一个游戏中,并且在一个游戏中有一副牌。

    起初,我认为玩家和卡之间存在一对多的关系,由数据库中的外键强制执行。播放器1P具有卡1C,2C和4C,因此卡1C,2C,4C和“1P”在PlayerID下。然后有一个位字段来表示卡是面朝上还是面朝下。这适用于州3和州4.

    我应该如何处理状态1和2?一些选择:

    1. 使Card表上的PlayerID可以为空。当我使用EF时,我遇到了外键约束。 编辑:我遇到了外键约束,但是当我现在尝试它时,看起来它正如人们期望的那样工作。
    2. 创建名为“Deck”的虚拟玩家,并将状态1和2中的所有牌分配给此玩家。但是,这似乎并不优雅; Deck玩家有很多其他的行李,我不想处理,如果我开始做多个游戏,我需要多个Deck玩家。
    3. 将外键废弃在数据库中,并使PlayerID可以为空。在代码中强制执行约束。但是,如果没有一些额外的扩展代码,我就无法做像Player.Cards()这样的事情。
    4. 还有两个位字段:“IsInDeck”和“IsDiscarded”(或者代表多个状态的某个字段,如0中的int:在牌组中; 1:在手中; 2:在玩家面前; 3:丢弃)。这样,如果卡处于“废弃”状态,我们并不关心PlayerID是什么。
    5. 我没有想过的其他一些选择。
    6. 想法?提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试这样的架构:

enter image description here

表格PLAYERCARDDECK希望非常清楚。

LOCATION_TYPE是可能适用的各种地点的列表。这包括诸如“在玩家的手中”,“在玩家面前”,“在牌组中面朝下”和“弃牌堆”之类的东西。您可以使用LOCATION_TYPE的物理表,也可以使用枚举。表格的优势在于您可以包含一些业务规则,例如位置类型是否需要PLAYERCARD_LOCATION FK以及该卡是可见还是不可见(面朝上/朝下)。

因此,

CARD_LOCATION是告诉您每张卡在任何给定时间的位置的交叉点。您的Player.Cards导航属性将与您的Card.Location导航属性一样正常。值得注意的是,CARD_LOCATIONPLAYER的FK 可选