Saya akan sedikit tidak setuju dengan semua orang dan mengatakan bahwa pendekatan relasional masuk akal di sini. Yang menarik di sini adalah item dapat memiliki banyak peran. Masalah utama adalah bahwa pemetaan antara tata letak relasional ini dan tata letak OO dalam kode tidak akan terasa "alami", tapi saya pikir di sisi database banyak peran dapat diekspresikan dengan bersih (tanpa pengkodean atau redundansi yang aneh, hanya bergabung) .
Hal pertama yang harus diputuskan adalah berapa banyak data spesifik item dan berapa banyak dibagi oleh semua item dari jenis tertentu.
Inilah yang akan saya lakukan jika semua data spesifik untuk item:
// 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 | ...
Dalam desain ini, setiap item ada di tabel Item, bersama dengan atribut yang dimiliki semua (atau sebagian besar) item. Setiap peran tambahan yang dapat dimainkan item adalah tabel terpisah.
Jika Anda ingin menggunakannya sebagai senjata, Anda akan mencarinya di tabel Senjata. Jika itu ada, maka itu dapat digunakan sebagai senjata. Jika tidak ada di sana, maka itu tidak dapat digunakan sebagai senjata. Keberadaan catatan memberi tahu Anda apakah itu senjata. Dan jika itu ada di sana, semua atribut spesifik senjata disimpan di sana. Karena atribut tersebut disimpan secara langsung alih-alih dalam bentuk yang disandikan, Anda dapat melakukan kueri / filter dengannya. (Misalnya, untuk halaman metrik game Anda, Anda mungkin ingin mengagregasi pemain berdasarkan jenis kerusakan senjata, dan Anda dapat melakukannya dengan beberapa gabungan dan grup-by damage_type.)
Item dapat memiliki beberapa peran, dan ada di lebih dari satu tabel peran-spesifik (dalam contoh ini, baik senjata maupun pencahayaan).
Jika itu hanya boolean seperti "apakah ini bisa dipegang", saya akan memasukkannya ke dalam tabel Item. Mungkin layak untuk di-cache "apakah ini senjata" dll di sana sehingga Anda tidak perlu melakukan pencarian pada Senjata dan tabel peran lainnya. Namun, itu menambah redundansi sehingga Anda harus berhati-hati untuk tetap menyinkronkannya.
Rekomendasi Ari untuk memiliki tabel tambahan per jenis juga dapat digunakan dengan pendekatan ini jika beberapa data tidak akan bervariasi per item. Misalnya, jika kerusakan senjata tidak bervariasi per item, tetapi perannya masih bervariasi per item, Anda dapat memasukkan faktor atribut senjata bersama ke dalam tabel:
// 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
Pendekatan lain adalah jika peran yang dimainkan oleh item tidak bervariasi berdasarkan item, tetapi hanya berdasarkan jenis item. Dalam hal ini Anda akan meletakkan item_type ke dalam tabel Items, dan dapat menyimpan properti seperti "apakah itu senjata" dan "apakah itu dapat ditampung" dan "apakah itu cahaya" di tabel ItemTypes? Dalam contoh ini saya juga membuat nama item tidak berbeda per item:
// 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
Kemungkinan itemtypes dan weaponontypes tidak berubah selama permainan, jadi Anda bisa memuat tabel-tabel itu ke dalam memori satu kali, dan mencari atribut-atribut itu di tabel hash alih-alih dengan penggabungan basis data.