最も自然なことは、カード用のテーブルを作成し、デッキ内のカードごとに 1 つのレコードを作成し、次にハンド用のレコードを作成して、ハンド内のカードごとに 1 つのレコードを作成することだと思います。ハンド全体に関するデータがある場合、プレイヤーの名前は? 彼はテーブルのどこに座っていますか?彼は何枚のチップを持っていますか? 何でも - ハンドのカードとは対照的に、ハンド用に別のテーブルが必要になります。スーツ用のルックアップ テーブルも作成します。
(ここで合成キーと自然キーの使用について議論することもできますが、それは別の問題です。)
card (cardid, suitid, rank)
suit (suitid, suitname)
hand (handid, playername, whatever)
handcard (handcardid, handid, cardid)
私の最初の衝動は、「ランク」を 1 から 13 までの数字にし、出力時に 1 を「エース」に、11 から 13 を「ジャック」、「クイーン」、および「キング」に変換することです。それらをテキストとして保存することはできますが、ランクを比較する必要がある場合、ランクを比較することは困難です。つまり、13>10 がデータベースにとって簡単かどうかを判断します。King>10、それほどでもない。
ピリオドや固定長のIDなどで区切られているかどうかにかかわらず、複数のカードの識別を単一のフィールドに詰め込もうとは絶対にしません。これを行うには、データベースが必要なデータを取得するだけでなく、必要なデータを取得するためにこのフィールドを分解するコードがプログラムに必要になります。これがデータベースの目的です。
あなたがこれらのカード ハンドで何をしたいのかはわかりませんが、私が説明しているような構造でやりたいと思うことのほとんどはかなり簡単ですが、カードのリストを 1 つのカードに詰め込むとかなり難しいです。分野。「スペードのキングを持っているのは誰?」簡単:
select playername
from hand
join handcard using (handid)
join card using (cardid)
join suit using (suitid)
where suit.name='Spades' and card.rank=13
または、「各プレイヤーは何枚の顔カードを持っていますか?」
select playername, count(*)
from hand
join handcard using (handid)
join card using (cardid)
where card.rank between 11 and 13
もちろん、「プレイヤー #3 が持っているカードは何ですか?」も簡単です:
select rank, suitname
from handcard
join card using (cardid)
join suit using (suitid)
where handid=3
パックされた形式でこれらのクエリを実行するには、トリッキーな文字列抽出呼び出しが必要になります。そして、文字列操作は常に面倒です。いつものように、テキストで 2 を検索している場合、'12' の一部である 2 を除外するにはどうすればよいですか? 等