如何为卡片和套牌游戏设计数据库

时间:2013-05-10 19:00:19

标签: java database hibernate database-design playing-cards

我正在为纸牌游戏创建一个基于Java的服务器,客户可以通过它连接进行“游戏”。每个“游戏”(Java级)拥有一副104张牌(普通牌组两张)。所以我得到的基本课程是:游戏,甲板,卡片。游戏将有一个甲板,甲板最多将有104个卡。我已经使用Hibernate和PostgreSQL数据库为服务器创建了基本结构。我的问题是如何建模数据库。

由于只有52张不同的牌,所以每张牌组中的52张牌都没有意义。但是,甲板需要洗牌。我想有一些聪明的方法可以做到这一点,但数据库建模不是我的强项。

在我的头顶,我想我可以有一张表“卡”,52行,每张卡一行。然后是另一个表“Deck”,它将在每次创建游戏时创建一行并且包含一个数字列表(104个数字),这些数字在Card-table中引用每个Card的ID两次。这听起来是个好主意吗?我如何使用Java和Hibernate实现这一目标?

还是有其他方法可以做到这一点吗?由于有许多纸牌游戏,我猜这之前已经完成了一百万次,并且有一些解决这个问题的最佳实践,但我找不到它。我很感激有关此事的任何意见。提前谢谢!

编辑:我是否过度思考问题并且应该使用Hibernate将数据库插入数据库并让数据库负责其余部分?

2 个答案:

答案 0 :(得分:0)

我没有看到在数据库中存储卡的重点,它只会使事情过于复杂。 我要做的只是在名为CardDistribution的Java应用程序中创建另一个类,其中包含102个元素的数组。为每个元素提供其持有的卡的ID。

如果要保存游戏,请将CardDistribution对象序列化为JSON并将其保留在Game表的列中。

当您从数据库中读取时,只需将CardDistribution JSON反序列化为java对象并使用它。

答案 1 :(得分:0)

一般来说RDBMS的一个关键问题(基本上每个JPA提供者都会抱怨,如果你不这样做),你通常希望为表提供某种唯一键(即使它最终成为每一列) )。
另外,SQL有一个'保证',如果没有显式请求顺序,返回的行将是'random'(这是为了允许优化器采取它们可以使用的任何快捷方式,这意味着排序可能会意外地改变)。

考虑到这一点,Deck最好设置为:

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

整行包含唯一键。

至于将行添加到卡片组中......您可能会发现将所有卡片添加到数组并将其随机播放到Java中是最简单的(并且“正确随机”) - 随机排序是非常困难的。