私は皆に少し反対し、ここでは関係的アプローチは合理的であると言います。ここで興味深いのは、アイテムが複数の役割を持つことができることです。主な問題は、このリレーショナルレイアウトとコード内のOOレイアウトの間のマッピングが「自然」に感じられないことですが、データベース側では、複数のロールをきれいに表現できると思います(奇妙なエンコーディングや冗長性なしで、結合のみ) 。
最初に決定することは、どの程度のデータがアイテム固有であり、どの程度が特定のタイプのすべてのアイテムによって共有されるかです。
すべてのデータがアイテム固有である場合は、次のようにします。
// ITEMS table: attributes common to all items
item_id | name | owner | location | sprite_id | ...
1 | Light Saber | 14 (Tchalvek) | 381 (Tchalvek house) | 5663 | ...
// WEAPONS table: attributes for items that are weapons
item_id | damage | damage_type | durability | ...
1 | 5 | sharp | 13 | ...
// LIGHTING table: attributes for items that serve as lights
item_id | radius | brightness | duration | ...
1 | 3 meters | 50 | 8 hours | ...
このデザインでは、すべての(またはほとんどの)アイテムが持つ属性とともに、すべてのアイテムがItemsテーブルにあります。アイテムが実行できる追加の各役割は、個別のテーブルです。
武器として使用したい場合は、武器テーブルで調べます。そこにあれば、武器として使用できます。ない場合は、武器として使用できません。レコードの存在は、それが武器であるかどうかを教えてくれます。そして、そこにある場合、その武器固有の属性はすべてそこに格納されます。これらの属性はエンコードされた形式ではなく直接格納されるため、それらを使用してクエリ/フィルターを実行できます。(たとえば、ゲームのメトリクスページの場合、プレイヤーを武器の損傷タイプ別に集計することができますが、いくつかの結合とgroup-bydamage_typeでそれを行うことができます。)
アイテムは複数の役割を持つことができ、複数の役割固有のテーブルに存在します(この例では、武器と照明の両方)。
「これは保持可能ですか」のようなブール値の場合は、Itemsテーブルに入れます。武器やその他のロールテーブルでルックアップを実行する必要がないように、「これは武器です」などをキャッシュする価値があります。ただし、冗長性が追加されるため、同期を保つように注意する必要があります。
タイプごとにテーブルを追加するというアリの推奨事項も、一部のデータがアイテムごとに変化しない場合は、このアプローチで使用できます。たとえば、武器のダメージがアイテムごとに異なるわけではないが、役割がアイテムごとに異なる場合は、共有されている武器の属性を表にまとめることができます。
// WEAPONS table: attributes for items that are weapons
item_id | durability | weapon_type
1 | 13 | light_saber
// WEAPONTYPES table: attributes for classes of weapons
weapon_type_id | damage | damage_type
light_saber | 5 | energy
別のアプローチは、アイテムが果たす役割がアイテムによってではなく、アイテムの種類によってのみ変化する場合です。その場合は、item_typeをItemsテーブルに入れ、「武器である」、「保持可能である」、「ライトである」などのプロパティをItemTypesテーブルに格納できます。この例では、アイテム名もアイテムごとに異なるようにします。
// ITEMS table: attributes per item
item_id | item_type | owner | location
1 | light_saber | 14 (Tchalvek) | 381 (Tchalvek house)
// ITEMTYPES table: attributes shared by all items of a type
item_type | name | sprite_id | is_holdable | is_weapon | is_light
light_saber | Light Saber | 5663 | true | true | true
// WEAPONTYPES table: attributes for item types that are also weapons
item_type | damage | damage_type
light_saber | 5 | energy
アイテムタイプと武器タイプはゲーム中に変更されない可能性が高いため、これらのテーブルを一度メモリにロードし、データベース結合ではなくハッシュテーブルでそれらの属性を検索できます。