我覺得最自然不過的事情。將創建卡表,這將每張卡片有一張記錄,然後是手牌記錄,手中每張卡片都有一張記錄。如果有整個牌的數據 - 球員的名字?他坐在桌旁?他有多少籌碼?無論如何 - 那麼你需要一個單獨的桌子,而不是手中的牌。我也會創建一個西裝的查找表。
(我們可以辯論使用人工鍵與這裏的自然鍵,但這是另一個主題。)
card (cardid, suitid, rank)
suit (suitid, suitname)
hand (handid, playername, whatever)
handcard (handcardid, handid, cardid)
我第一個衝動是使「等級」一個從1數到13,並翻譯1到「Ace」,11到13到「Jack」,「Queen」和「King」。您可以將它們存儲爲文本,但如果需要這樣做,則難以比較排名。即確定13> 10是否容易用於數據庫;國王> 10,並非如此。
我絕對不會試圖把多張卡的識別放入單個字段中,不管是用句點還是固定長度的ID分開。這樣做需要你的程序有代碼將這個字段分開來獲取你想要的數據,而不是讓數據庫檢索你想要的數據,這是數據庫的用途。
我不知道你想用這些卡片手做什麼,但你可能想要做的大多數事情都很容易,就像我描述的結構一樣,如果你把一個列表卡成一個單一的領域。例如,「誰擁有黑桃王?「很簡單:
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名的文本,我怎麼排除2的那是 '12'的一部分?等
來源
2011-04-14 16:57:49
Jay
定義 「最好的」。您的意思是「存儲最少字節數的手的最佳方式」,還是「存儲手的最佳方式,使其易於人類閱讀」? – Davidann 2011-04-14 16:21:15
最後,手將被轉換爲應用程序可讀的人類,但更重要的是,我需要能夠根據其屬性進行分類和檢索。我不認爲字節數量應該是一個問題。 – Sinan 2011-04-14 16:30:29
爲什麼有必要在數據庫中存儲所有枚舉?爲什麼不根據需要生成它們? – Davidann 2011-04-14 16:31:32