2013-05-10 108 views
0

我正在爲卡片遊戲創建一個基於Java的服務器,客戶端可以通過它連接到「玩」。每個「遊戲」(Java級)擁有一副104張牌(一張正常牌組成兩倍)。所以我得到的基本課程是:遊戲,卡組,卡片。一場比賽將有一個甲板,一個甲板最多有104個牌。我用Hibernate和PostgreSQL數據庫爲服務器製作了基礎結構。我的問題在於如何建模數據庫。如何使用卡片和卡片設計遊戲數據庫

由於只有52張不同的卡牌,所以沒有必要爲每張製作52張卡牌「卡座」表格中的甲板。但是,甲板需要洗牌。我想這樣做有一些聰明的方法,但數據庫建模不是我的強項。

在我的頭頂,我想我可以有一個表「卡」有52行,每一行對應一個卡。然後,另一個桌面「Deck」將在每次創建遊戲時創建一行,並保存一張數字列表(104個數字),該列表在Card-Table中引用每個卡片ID兩次。這聽起來像是個好主意嗎?我怎麼用Java和Hibernate來完成這個任務?

或者是否有其他方式應該這樣做?由於有很多紙牌遊戲,我猜這已經做過一百萬次了,並且有一些解決此問題的最佳實踐,但是我一直無法找到它。我很感謝有關此事的任何投入。提前,謝謝!

編輯:我是否已經解決了這個問題,並且應該使用Hibernate插入一個Deck到數據庫並讓其他數據庫處理?

回答

0

我沒有看到在存儲卡在數據庫中的一個點,它只是使事情太複雜。 我會做的只是在名爲CardDistribution的java應用程序中創建另一個類,其中包含102個元素的數組。給每個元素一個它所持有的卡的ID。

當你想保存遊戲,系列化你CardDistribution對象轉換爲JSON並在您的遊戲表中的列堅持它。

而當你從數據庫中讀取剛反序列化的CardDistribution JSON成一個Java對象,並使用它。

0

關於RDBMS的一個關鍵問題(基本上每個JPA提供者都會抱怨,如果你不這樣做的話)是,你通常希望爲表提供某種唯一鍵(即使它最終每一個柱)。
此外,SQL有一個「保證」,即如果沒有訂單明確要求,返回的行會「隨機」(這是使優化採取任何快捷鍵就可以了,這意味着排序可能會意外更改)。

考慮到這一點,Deck可能是最好設置爲:

Deck 
----------------- 
gameId -- fk reference to Game.id 
cardId -- fk reference to Card.id 
deckOrder -- order of card in deck for this game 

整個行包括唯一鍵。

,作爲添加行到甲板上......你會發現它最簡單的(和「正確隨機」),以所有卡添加到一個數組和隨機它在Java中 - 隨機訂購的東西是相當困難的。