Herkese hafifçe katılmayacağım ve ilişkisel yaklaşımın burada makul olduğunu söyleyeceğim. Burada ilginç olan, öğelerin birden fazla rolü olabileceğidir. Asıl mesele, bu ilişkisel düzen ile koddaki bir OO düzeni arasındaki eşlemenin "doğal" hissetmeyeceği, ancak veritabanı tarafında birden fazla rolün (garip kodlamalar veya artıklık olmadan, sadece birleşimler olmadan) temiz bir şekilde ifade edilebileceğini düşünüyorum. .
Karar verilecek ilk şey, verilerin ne kadarının öğeye özel olduğu ve belirli bir türdeki tüm öğeler tarafından ne kadarının paylaşıldığıdır.
Tüm veriler öğeye özgü ise ne yapmalıyım :
// 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 | ...
Bu tasarımda, her öğe tüm (veya çoğu) öğenin sahip olduğu özelliklerle birlikte Öğeler tablosundadır. Bir öğenin oynayabileceği her ek rol ayrı bir tablodur.
Silah olarak kullanmak isterseniz, Silahlar tablosuna bakarsınız. Eğer oradaysa, o zaman bir silah olarak kullanılabilir. Eğer orada değilse, o zaman bir silah olarak kullanılamaz. Kaydın varlığı size silah olup olmadığını söyler. Ve eğer oradaysa, silaha özgü tüm özellikleri orada saklanır. Bu öznitelikler bazı kodlanmış formlar yerine doğrudan depolandığından, bunlarla sorgu / filtre gerçekleştirebileceksiniz. (Örneğin, oyununuzun metrikleri sayfası için oyuncuları silah hasarı türüne göre toplamak isteyebilirsiniz ve bunu bazı birleşimler ve gruplandırma hasarı_türü ile yapabilirsiniz.)
Bir öğenin birden fazla rolü olabilir ve birden fazla role özgü tabloda bulunabilir (bu örnekte hem silah hem de aydınlatma).
"Bu katlanabilir" gibi bir boolean ise, Öğeler tablosuna koyardım. Silahlar ve diğer rol tablolarında bir arama yapmak zorunda kalmamanız için orada "bu bir silah" vb. Ancak, yedeklilik ekler, bu nedenle senkronize kalmaya dikkat etmelisiniz.
Ari'nin tür başına ek tabloya sahip olması önerisi, bazı veriler öğe başına değişmezse bu yaklaşımla da kullanılabilir. Örneğin, silah hasarı her eşyaya göre değişmese de roller her eşyaya göre değişiyorsa, paylaşılan silah özelliklerini bir tabloya dahil edebilirsiniz:
// 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
Başka bir yaklaşım, öğelerin oynadığı rollerin öğeye göre değil, yalnızca öğe türüne göre değişmesi olabilir. Bu durumda item_type öğesini Öğeler tablosuna koyarsınız ve bir ItemTypes tablosunda "bu bir silah mı" ve "katlanabilir mi" ve "hafif mi" gibi özellikleri depolayabilirsiniz. Bu örnekte, öğe adlarının her öğe için farklı olmamasını sağlarım:
// 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
Büyük olasılıkla eşya türleri ve silah tipleri oyun sırasında değişmez, bu nedenle bu tabloları bir kez belleğe yükleyebilir ve bu nitelikleri veritabanı birleştirmesi yerine karma tabloya bakabilirsiniz.