আমি সবার সাথে মৃদুভাবে একমত নই এবং বলতে চাই যে এখানে আপেক্ষিক পদ্ধতিটি যুক্তিযুক্ত। আকর্ষণীয় এখানে আইটেম একাধিক ভূমিকা থাকতে পারে। মূল সমস্যাটি হ'ল এই সম্পর্কের লেআউট এবং কোডের একটি ওও লেআউটের মধ্যে থাকা ম্যাপিংটি "প্রাকৃতিক" বোধ করবে না, তবে আমি মনে করি ডাটাবেসের পক্ষের একাধিক ভূমিকা পরিষ্কারভাবে প্রকাশ করা যেতে পারে (অদ্ভুত এনকোডিংগুলি বা অপ্রয়োজনীয়তা ছাড়াই, কেবল যোগ দেয়) ।
প্রথমে সিদ্ধান্ত নেওয়ার বিষয়টি হ'ল তথ্যটি নির্দিষ্ট পরিমাণে নির্দিষ্ট পরিমাণ এবং প্রদত্ত প্রকারের সমস্ত আইটেম দ্বারা কত ভাগ করে নেওয়া হয়।
সমস্ত ডেটা আইটেম নির্দিষ্ট থাকলে আমি এখানে যা করব :
// 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
আইটেম দ্বারা চালিত ভূমিকা আইটেম অনুসারে পরিবর্তিত হয় না, তবে শুধুমাত্র আইটেম টাইপ দ্বারা অন্য একটি পদ্ধতির হতে হবে। সেক্ষেত্রে আপনি আইটেম_প্রকারটি আইটেম টেবিলের মধ্যে রেখে দিতে পারেন এবং "আইটেম টাইপস টেবিলের" এটি একটি অস্ত্র "এবং" এটি হোল্ডেবল "এবং" এটি কি হালকা "এর মতো বৈশিষ্ট্যগুলি সংরক্ষণ করতে পারেন। এই উদাহরণে আমি আইটেমের নাম আইটেম প্রতি পৃথক নয়:
// 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
সম্ভবত খেলাটির সময় আইটেম টাইপ এবং অস্ত্রের ধরণগুলি পরিবর্তিত হয় না, সুতরাং আপনি কেবলমাত্র সেই টেবিলগুলিকে একবারেই মেমরিতে লোড করতে পারেন এবং ডাটাবেস যোগদানের পরিবর্তে হ্যাশ টেবিলের মধ্যে এই বৈশিষ্ট্যগুলি সন্ধান করতে পারেন।