0

我使用 JDBC/Derby 来存储我正在编写的益智游戏的高分数据。由于游戏的性质,能够根据过滤器查看高分数据将很有用(即显示我在此级别上的最高分,显示我在这台计算机上的最高分等)

该游戏还具有“战役”模式,玩家朝着目标努力并解锁成就。

目前,活动数据存储在一个可序列化的 java 文件中,我将其写入磁盘。

但是,由于高分数据存储在数据库中,并且由于高分表中的 PlayerID 将链接到活动文件,所以感觉我也应该将活动数据存储在数据库中。

我面临的问题是我根本无法分解数据。在我看来,“玩家”表将有一百多个宽,每一列代表一个目标或成就的状态。

我不是数据库专家。我不知道这是否是糟糕的设计。我已阅读有关正常表格 1-5 的内容,并且我相信我遵守了每个表格,但我怀疑我做错了什么。

我真的想要数据库中的高分,它们非常适合。然而,作为副作用,我感到强烈推动将竞选布尔值/其他信息也存储在数据库中。将一些数据写入文件,而将其他数据写入数据库,感觉很奇怪,尤其是当这两个东西相互引用时。

难道我做错了什么?只要它实际上遵守正常形式,就可以有一个有一百或两列的表吗?

4

1 回答 1

2

如果 Player 表中的大多数列表示目标或成就的状态,您可以考虑重复数据并将其建模在子表中。

Player Table
PlayerId (primary key)
PlayerName

Goals Table
GoalId (primary key)
GoalName

PlayerGoals Table
GoalId (primary key, foreign key to Goal)
PlayerId (primary key, foreign key to Player)

Goals表是一个主列表,您在编写游戏时设置一次。当玩家取得成就时,您将一行插入PlayerGoals.

您应该根据预期的用例对数据进行建模。以这种方式建模(与多Players列表相比)将使这些类型的查询更容易编写:-

  • 列出球员以及他们完成了多少目标
  • 哪个目标完成的玩家最多?
  • 一般处理目标的任何其他查询

It would be easier to add a goal because it becomes a matter of inserting a row into the Goals table rather than adding a column. However, maybe you need to write a bunch of code anyway and this is of no significance.

On the other hand, these types of queries will be easier if you have one big flat Player table with many columns:-

  • Get me everything about a particular Player
  • List every player that has completed Goal X
  • List every player that has completed Goal X and not Goal Y

In the end, you need to choose if you want to make the concept of Goals something that you model explicitly in the database or not. What is right and wrong depends on your priorities.

于 2013-01-24T23:01:13.947 回答