2011-09-16 36 views
1

这是一个数据结构/映射问题。我正在使用MSSQL,与.NET和EF(和MVC,如果这很重要)。我有一张表,代表一副扑克牌。卡片的状态是:数据结构 - 卡的表示形式

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

...可以有X个球员。我有一张表格,代表球员,并拥有自己独特的关键。假设每个玩家都在一场比赛中,并且一副牌是在一场比赛中。

起初,我以为会有玩家和卡之间的一个一对多的关系,通过在数据库中的外键执行。玩家1P具有牌1C,2C和4C,所以牌1C,2C,4C和玩家ID下的“1P”。然后有一个字段来表示卡片是面朝上还是面朝下。该工程为国家3和国家4

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

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

想法?提前致谢。

+0

什么用点1的问题?该关系将是EF支持的玩家和卡之间的0..1对多关系(卡有*可选*玩家)。第1点与第4点相结合对我来说看起来很合理。 – Slauma

+0

你知道,我最初尝试过并遇到问题。但现在运行,它看起来像它的作品。 – bryanjonker

回答

0

你可以尝试的模式是这样的:

enter image description here

的表格PLAYERCARD,并DECK是希望非常清楚。

LOCATION_TYPE是种可能适用的位置的列表。这包括诸如“在玩家手中”,“在玩家面前”,“在甲板上面朝下”和“丢弃堆”之类的东西。您可以使用物理表LOCATION_TYPE或者您可以使用枚举。一个表的好处是,你可以包括一些业务规则是否一样的位置类型要求PLAYER FK在CARD_LOCATION以及是否该卡是可见或不可见(面朝上/下)。因此

CARD_LOCATION是,告诉你每个卡是在任何特定时间的交集。您的Player.Cards导航属性将与您的Card.Location导航属性一样运作良好。值得注意的是,从FK到CARD_LOCATIONPLAYER可选是很重要的。