मैं हर किसी से असहमत होने जा रहा हूं और कहता हूं कि संबंधपरक दृष्टिकोण यहां उचित है। यहां दिलचस्प बात यह है कि आइटम में कई भूमिकाएं हो सकती हैं। मुख्य मुद्दा यह होगा कि इस संबंधपरक लेआउट और कोड में एक 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 | ...
इस डिज़ाइन में, प्रत्येक आइटम आइटम तालिका में है, विशेषताओं के साथ जो सभी (या अधिकांश) आइटम हैं। प्रत्येक अतिरिक्त भूमिका जो एक आइटम निभा सकता है, एक अलग तालिका है।
यदि आप इसे एक हथियार के रूप में उपयोग करना चाहते हैं, तो आप इसे हथियार तालिका में देखेंगे। यदि यह वहां है, तो यह एक हथियार के रूप में उपयोग करने योग्य है। अगर यह नहीं है, तो इसे एक हथियार के रूप में इस्तेमाल नहीं किया जा सकता है। रिकॉर्ड का अस्तित्व आपको बताता है कि क्या यह एक हथियार है। और अगर यह वहां है, तो इसके सभी हथियार-विशिष्ट गुण वहां संग्रहीत हैं। चूंकि उन विशेषताओं को कुछ एन्कोडेड फ़ॉर्म के बजाय सीधे संग्रहीत किया जाता है, आप उनके साथ प्रश्न / फ़िल्टर करने में सक्षम होंगे। (उदाहरण के लिए, अपने गेम के मेट्रिक्स पेज के लिए आप खिलाड़ियों को हथियार क्षति प्रकार से एकत्रित कर सकते हैं, और आप ऐसा कुछ जोड़ और समूह-द्वारा नुकसान_प्रकार के साथ कर पाएंगे।)
एक आइटम में कई भूमिकाएँ हो सकती हैं, और एक से अधिक भूमिका-विशिष्ट तालिका (इस उदाहरण में, दोनों हथियार और प्रकाश व्यवस्था) में मौजूद हैं।
अगर यह सिर्फ एक बूलियन है जैसे "यह धारण करने योग्य है", तो मैं इसे आइटम तालिका में डालूंगा। यह कैशिंग "यह एक हथियार है" आदि के लायक हो सकता है ताकि आपको हथियार और अन्य भूमिका तालिकाओं पर एक लुकअप प्रदर्शन न करना पड़े। हालांकि, यह अतिरेक जोड़ता है इसलिए आपको इसे सिंक में रखने के लिए सावधान रहना होगा।
यदि प्रति डेटा कुछ आइटम अलग-अलग नहीं होंगे, तो अरी की प्रति प्रकार एक अतिरिक्त तालिका होने की सिफारिश भी इस दृष्टिकोण के साथ की जा सकती है। उदाहरण के लिए, यदि हथियार की क्षति प्रति आइटम में भिन्न नहीं होती है, लेकिन भूमिकाएं अभी भी प्रति आइटम में भिन्न होती हैं, तो आप हथियार की विशेषताओं को एक तालिका में साझा कर सकते हैं:
// 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 को आइटम तालिका में डालेंगे, और "इसे एक हथियार है" और "यह एक धारण योग्य है" जैसे गुणों को संग्रहीत कर सकते हैं और 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
यह संभावना है कि गेम के दौरान आइटमटाइप्स और वेन्टोनिपेस नहीं बदलते हैं, इसलिए आप बस उन तालिकाओं को एक बार मेमोरी में लोड कर सकते हैं, और डेटाबेस में शामिल होने के बजाय हैश तालिका में उन विशेषताओं को देख सकते हैं।