1

次のテーブルがあります。

プレイヤー

  • ID
  • プレーヤの名前

兵器

  • ID
  • タイプ
  • その他のデータ

武器2プレイヤー

  • ID
  • プレーヤーID_リファレンス
  • WeaponID_reference

シンプルでよかったです。

今度は、前にotherData列にパックしたいくつかの特性に従って、 Weaponsテーブルから項目を選択する必要があります (クライアント側でのみ必要だったため)。問題は、タイプがさまざまな特性を持っていることですが、同様のデータもたくさんあります。

そのため、次の可能性について判断しようとしていますが、いずれにも長所と短所があります。

ソリューション A

Weapons テーブルを削除し、Weapon-Type ごとに新しいテーブルを作成します。

武器_剣

  • ID
  • 刃の種類
  • ダメージ
  • その他のデータ

武器_銃

  • ID
  • 正確さ
  • ダメージ
  • 弾薬の種類
  • その他のデータ

しかし、どうすればこれらをPlayersにリンクできますか?

  • 武器の種類ごとに Weapons_Swords2Players、Weapons_Guns2Playersを作成しますか? (プレーヤーにすべての武器をロードすると、より多くのJOINSが発生します...また、新しいプレーヤーを挿入するのもより複雑です)

また

  • WeaponsTypeTableという名前のWeapons2Playersに別の列を追加し、正しい Weapons サブテーブルをサブ選択します (簡単に思えますが、実際にはそうではありません。少し簡単に挿入できると思います)。

ソリューション B

Weapons テーブルを保持し、必要なすべてのフィールドを追加します。問題は、すべての武器タイプがすべてのフィールドを使用するわけではないため、NULLフィールドが存在することです (正しくない可能性があります)。

兵器

  • ID
  • タイプ
  • 正確さ
  • ダメージ
  • 弾薬の種類
  • 刃の種類
  • その他のデータ

これはかなり基本的なもののようですが、何が最善かを判断することはできません. または、正しいソリューション C はありますか?

4

3 に答える 3

2

1 つの解決策は、Weapons_Swords と Weapons_Guns が次のような外部キー参照を持つマスター武器テーブルを作成することです。

Create Table Weapons
{
    Id ...
    , ...
}

Create Table Weapons_Swords
{
    Id...
    , ...
    , Constraint FK_Weapons_Swords_Weapons
        Foreign Key ( Id )
        References Weapons( Id )
}
Create Table Weapons_Guns
{
    Id...
    , ...
    , Constraint FK_Weapons_Guns_Weapons
        Foreign Key ( Id )
        References Weapons( Id )
}

次に、標準の PlayerWeapons テーブルを作成します。

Create Table PlayerWeapons
{
    PlayerId ..
    , WeaponId ..
    , Constraint FK_PlayerWeapons_Players
        Foreign Key ( PlayerId )
        References Players( Id )
    , Constraint FK_PlayerWeapons_Weapons
        Foreign Key ( WeaponId )
        References Weapons( Id )
}

このアプローチの欠点は、特定のタイプを指していない武器を持つことができ、追加の結合があることです。利点は、すべての武器に共通の属性を武器テーブルに追加できることです。

ソリューション b には、Weapons テーブルの非正規化が含まれます。利点は、データを取得し、武器が何も指していないことを確認することが非常に簡単になることです。

さまざまな武器タイプの属性が大幅に異なる場合は、マスター武器テーブルを作成することをお勧めします。類似点が多い場合は、非正規化ソリューションを検討できます。どのくらいの分散が得られるかわからなかった場合は、できるだけ正規化して、マスターの武器テーブルを使用する傾向があります。

于 2010-04-18T03:47:49.347 に答える
0

最新のデータベースは、スパースデータの処理に非常に優れています。空白の列をいくつか追加しても、データ型が小さいか可変幅である限り、問題は発生しません。これにより、テーブル構造を複雑にすることなく、一部の情報を抽出できます。

もう1つのメカニズムは、武器テーブルやキャラクター読み込みコードを変更せずに検索できるように、武器のインデックステーブルを追加することです。実行している検索の種類に応じて、その情報は簡単に計算、保存、および更新できる必要があります。

クリーンで真にスケーラブルなアプローチを実現するには、正規化されたテーブル@Thomasを使用する必要があります。もう少し先に進む必要がある場合は、上記のアプローチのいずれかまたは両方が役立つ可能性があります。

于 2010-04-18T04:19:35.173 に答える
0

私はあなたの2つのアプローチのハイブリッドを取ります。一般的な統計 (id、type、damage、otherData) の武器テーブルを保持します。次に、武器の ID にリンクし、残りのデータ部分を持つ gun_stats (weapon_id、accuracy、ammoType) および sword_stats (weapon_id、bladeType) テーブルを作成します。プレーヤーの両方のタイプのすべての武器を取得するために必要なクエリは 2 つだけで、データの重複はありません。

于 2010-04-18T03:43:45.093 に答える