私はデータベース設計に不慣れで、格闘ゲーム用のPostgreSQLデータベースの設計に多くの問題を抱えています。
このゲームでは、プレイヤーは彼らの間で戦い、より良い武器や鎧を購入するためのリソースを獲得します。戦闘は将来のレビューのために記録され、戦闘の数は急速に増加すると予想されます。たとえば、1,000ラウンドで戦う1,000人のプレーヤーは500kの記録を生成します。
ゲームの双方向性は、戦闘機の装備と能力をアップグレードするためにポイントを使うように減らされます。戦闘はマシンによって解決されます。
詳細:
- 特定の種類の武器または鎧は、各戦闘機が1回だけ所有できます。
- 戦闘機はほぼ独占的にによって検索され
id
ます。 - 特定の戦闘機が所有している装備(武器や鎧)を検索する必要があることがよくありますが、特定の種類の武器を所有している戦闘機を検索することは期待していません。
winner
戦闘はしばしばまたはによって検索されloser
ます。- 与えられた2つ
fighters
は、異なる日付に複数回戦う可能性があるため、タプルはテーブル上で一意ではありませwinner
んloser
combats
fighters
テーブルには、同時に取得されることが多い多くの列が含まれています(戦闘が始まるたびに、関連するすべての情報を含むクラス「Fighter」の2つのオブジェクトを作成します)
これは私の現在のデザインです:
CREATE TABLE IF NOT EXISTS weapons (
id serial PRIMARY KEY,
*** Game stuff ***
);
CREATE TABLE IF NOT EXISTS armors (
id serial PRIMARY KEY,
*** Game stuff ***
);
CREATE TABLE IF NOT EXISTS fighters (
id serial PRIMARY KEY,
preferred_weapon INT references weapons(id),
preferred_armor INT references armors(id),
*** Game stuff ***
);
CREATE TABLE IF NOT EXISTS combats (
id serial PRIMARY KEY,
winner INT references fighters(id),
loser INT references fighters(id),
*** Game stuff ***
);
CREATE TABLE IF NOT EXISTS fighters_weapons (
fighter INT NOT NULL references fighters(id),
weapon INT NOT NULL references weapons(id),
PRIMARY KEY(fighter, weapon)
);
CREATE TABLE IF NOT EXISTS fighters_armors (
fighter INT NOT NULL references fighters(id),
armor INT NOT NULL references armors(id),
PRIMARY KEY(fighter, armor)
);
私の質問は次のとおりです。
- 私のデザインはとても適していると思いますか?
id
すべてのテーブルの主キーとして列を含むデータベースの例をたくさん見てきました。その理由はありますか?私が使用している複数列の主キーの代わりにそれを行う必要がfighters_weapons
ありfighters_armors
ますか?- PostgreSQLは主キーごとにインデックスを自動的に作成しますが、それで検索することを期待していないテーブルがいくつかあります(つまり
combats
)。パフォーマンスのためにインデックスを削除する必要がありますか?PostgreSQLは既存の制約について文句を言います。 fighters_weapons
とを検索fighters_armors
するfighter
ので、これらのテーブルにこのすべての列のインデックスを作成する必要があると思いますか?combats
winner
loser
- パフォーマンス改善のアドバイスはありますか?最もよく使用される操作は、戦闘機の挿入と照会、特定の戦闘機の装備の照会、および戦闘の挿入です。
どうもありがとう :)