2011-09-16 15 views
1

これはデータ構造/マッピングの質問です。私はMSSQLを使用していますが、.NETとEF(そしてそれが重要であればMVCもあります)。私はカードのデッキを表すテーブルを持っています。カードの状態は、次のとおりです。データ構造 - カードの表現

  1. フェイスダウンデッキに
  2. (破棄)デッキで
  3. フェイスアッププレイヤーの手でプレーヤー
  4. の前で

... Xプレーヤーがいます。私は自分のユニークなキーで、選手を表すテーブルを持っています。各プレイヤーは1つのゲーム内にあり、1つのデッキは1つのゲーム内にあるものとします。

最初は、プレイヤーとカードの間に1対多の関係があり、データベースの外部キーによって強制されると考えました。プレイヤー1Pは、カード1C、2C、および4Cを持っているので、PlayerIDの下にカード1C、2C、4Cおよび1Pがあります。次に、カードがフェイスアップかフェイスダウンかを表すビットフィールドがあります。これは状態3と状態4で機能します。

状態1と状態2はどのように処理する必要がありますか?いくつかのオプション:

  1. カードテーブルのPlayerIDをヌルにします。私がEFを使用していたとき、私は外部キーの制約にぶち当たっていました。 編集:私は外部キーの制約に遭遇していましたが、今試したところ、期待通りに動作しているように見えます。
  2. 「デッキ」と呼ばれるダミープレーヤーを作成し、このプレーヤーに状態1と2のすべてのカードを割り当てます。しかし、これは優雅に見えませんでした。デッキプレイヤーには私が扱いたくない荷物がたくさんありました。複数のゲームをやり始めると、複数のデッキプレイヤーが必要になります。
  3. データベース内の外部キーをスクラップし、PlayerIDをヌル可能にします。コードに制約を適用します。しかし、私はPlayer.Cards()のようなものを特別な拡張コードなしで行うことはできません。
  4. "IsInDeck"と "IsDiscarded"(または複数の状態を表すいくつかのフィールド、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)が必要かどうか、カードが表示されているか表示されていない(face up/down)かなどのビジネスルールを含めることができることです。

CARD_LOCATIONは、各カードがいつどこにあるかを示す交差点です。あなたのPlayer.Cardsナビゲーションプロパティは、あなたのCard.Locationナビゲーションプロパティと同様に動作します。 CARD_LOCATIONからPLAYERまでのFKは、のオプションのであることに注意することが重要です。