【问题标题】:Data Structure -- representation of cards数据结构——卡片的表示
【发布时间】:2011-09-16 12:41:46
【问题描述】:

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

  1. 在甲板上面朝下
  2. 在甲板上正面朝上(丢弃)
  3. 在玩家面前
  4. 在玩家手中

...可以有 X 个玩家。我有一个代表玩家的表格,有他们自己的唯一键。假设每个玩家都在一个游戏中,并且一副牌在一个游戏中。

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

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

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

想法?提前致谢。

【问题讨论】:

  • 第 1 点有什么问题? EF 支持的玩家和卡片之间的关系将是 0..1 对多(卡片有可选玩家)。第 1 点与第 4 点相结合在我看来是合理的。
  • 你知道,我最初尝试过,但遇到了问题。但是现在运行它,看起来它可以工作了。

标签: entity-framework database-design


【解决方案1】:

您可以尝试这样的架构:

PLAYERCARDDECK 表希望非常清晰。

LOCATION_TYPE 是可能适用的位置类型列表。这将包括诸如“在玩家手中”、“在玩家面前”、“面朝下在牌堆中”和“弃牌堆”之类的内容。您可以为LOCATION_TYPE 使用物理表,也可以使用枚举。表格的优点是您可以包含一些业务规则,例如位置类型是否需要 CARD_LOCATION 中的 PLAYER FK 以及卡片是可见还是不可见(面朝上/朝下)。

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

【讨论】:

    猜你喜欢
    • 2014-05-25
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2012-03-20
    • 2011-05-31
    • 2012-10-09
    • 2011-01-01
    • 2023-03-29
    相关资源
    最近更新 更多