【发布时间】:2011-09-16 12:41:46
【问题描述】:
这是一个数据结构/映射问题。我正在使用 MSSQL、.NET 和 EF(如果这很重要,还有 MVC)。我有一张代表一副纸牌的桌子。卡片的状态是:
- 在甲板上面朝下
- 在甲板上正面朝上(丢弃)
- 在玩家面前
- 在玩家手中
...可以有 X 个玩家。我有一个代表玩家的表格,有他们自己的唯一键。假设每个玩家都在一个游戏中,并且一副牌在一个游戏中。
起初,我认为玩家和卡片之间会有一对多的关系,由数据库中的外键强制执行。玩家 1P 有卡片 1C、2C 和 4C,因此在 PlayerID 下有卡片 1C、2C、4C 和“1P”。然后有一个位字段来表示卡片是面朝上还是面朝下。这适用于状态 3 和状态 4。
我应该如何处理状态 1 和 2?一些选项:
- 使卡片表上的 PlayerID 可以为空。当我使用 EF 时,我遇到了外键约束。 编辑:我遇到了外键约束,但是当我现在尝试时,它看起来就像人们期望的那样工作。
- 创建一个名为“Deck”的虚拟玩家,并将状态 1 和 2 的所有卡片分配给该玩家。但是,这看起来并不优雅。牌手有很多我不想处理的其他包袱,如果我开始做多场比赛,我需要多个牌手。
- 废弃数据库中的外键,并使 PlayerID 可以为空。在代码中强制执行约束。但是如果没有一些额外的扩展代码,我就不能做像 Player.Cards() 这样的事情。
- 还有两个位字段:“IsInDeck”和“IsDiscarded”(或表示多个状态的某些字段,例如 int,0:在甲板上;1:在手上;2:在玩家面前;3:丢弃)。这样一来,如果卡片处于“已丢弃”状态,我们就不会真正关心 PlayerID 是什么。
- 我没有想到的其他选项。
想法?提前致谢。
【问题讨论】:
-
第 1 点有什么问题? EF 支持的玩家和卡片之间的关系将是 0..1 对多(卡片有可选玩家)。第 1 点与第 4 点相结合在我看来是合理的。
-
你知道,我最初尝试过,但遇到了问题。但是现在运行它,看起来它可以工作了。
标签: entity-framework database-design