0

私は JDBC/Derby を使用して、作成中のパズル ゲームのハイスコア データを保存しています。ゲームの性質上、フィルターに基づいてハイスコア データを表示できると便利です (つまり、このレベルでの最高スコアを表示したり、このコンピューターでの最高スコアを表示したりします)。

このゲームには「キャンペーン」モードもあり、プレイヤーは目標に向かって取り組み、実績をアンロックします。

現在、キャンペーン データは、ディスクに書き出すシリアル化可能な Java ファイルに保存されています。

ただし、ハイスコア データはデータベースに保存され、ハイスコア テーブルの PlayerID はキャンペーン ファイルにリンクされるため、キャンペーン データもデータベースに保存する必要があるように感じます。

私が直面している問題は、データをまったく分解できないことです。「プレーヤー」テーブルは、各列が目標または達成のステータスを表す 100 以上の幅になるように思われます。

私はデータベースの専門家ではありません。これがひどいデザインかどうかはわかりません。私は通常のフォーム 1 ~ 5 について読み、各フォームに準拠していると信じていますが、何か間違ったことをしているのではないかと疑っています。

データベースのハイスコアが本当に欲しいのですが、それらは完全に適合しています。ただし、副作用として、キャンペーンのブール値やその他の情報もデータベースに保存するよう強く求められています。一部のデータがファイルに書き込まれ、他のデータがデータベースに書き込まれるのは奇妙に感じます。特に 2 つのものが相互に参照している場合はそうです。

私は何か間違ったことをしていますか?実際に通常の形式に従っている限り、100 列または 2 列のテーブルを使用しても問題ありませんか?

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テーブルと比較して)、これらのタイプのクエリをより簡単に記述できるようになります:-

  • 達成した目標の数とともに選手を一覧表示する
  • 最も多くのプレイヤーが達成した目標は?
  • ゴールを一般的に扱うその他のクエリ

Goals列を追加するのではなく、テーブルに行を挿入する問題になるため、目標を追加する方が簡単です。ただし、とにかく大量のコードを記述する必要があるかもしれませんが、これは重要ではありません。

一方、これらのタイプのクエリは、多くの列を持つ 1 つの大きくフラットな Player テーブルがある場合に簡単になります。

  • 特定のプレーヤーに関するすべてを取得する
  • 目標 X を達成したすべてのプレーヤーをリストする
  • 目標 X を完了し、目標 Y を完了していないすべてのプレーヤーをリストします。

Goals最後に、データベースで明示的にモデル化するものの概念を作成するかどうかを選択する必要があります。何が正しくて何が間違っているかは、優先順位によって異なります。

于 2013-01-24T23:01:13.947 に答える