2011-09-16 37 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可選是很重要的。