একাধিক পারস্পরিক একচেটিয়া একের সাথে সম্পর্ক স্থাপন করা কি খারাপ অভ্যাস?


38

বলুন, একটা টেবিল carসারণীগুলিতে একের সাথে এক সম্পর্ক রয়েছে electric_car, gas_carএবং hybrid_car। যদি এটি carহয় তবে electric_carএটি আর প্রদর্শিত হবে না gas_carবা ক hybrid_car, ইত্যাদি can

এই ধরনের নকশায় কিছু ভুল আছে? কিছু সমস্যা যা রাস্তায় নেমে আসতে পারে?

উত্তর:


59

বিভিন্ন ধরণের গাড়ি হ'ল এমন একটি সাধারণ সমস্যার উদাহরণ যা ডেটা মডেলিংয়ে বারবার উপচে পড়ে। একে ইআর মডেলিংয়ে "জেনারালাইজেশন / স্পেশালাইজেশন" এবং অবজেক্ট মডেলিংয়ে "সুপারক্লাস / সাবক্লাস" বলা হয়।

কোনও বস্তু মডেলার সমস্যাটি সহজেই সমাধান করতে অবজেক্ট মডেলটিতে নির্মিত উত্তরাধিকার বৈশিষ্ট্যগুলি ব্যবহার করে। সাবক্লাসগুলি কেবল সুপারক্লাসটি প্রসারিত করে।

আপেক্ষিক মডেলর একটি সমস্যার মুখোমুখি। টেবিলগুলি কীভাবে ডিজাইন করবেন যাতে উত্তরাধিকার থেকে যে উপকারগুলি পাওয়া যায় তা অনুকরণ করতে পারে?

সবচেয়ে সহজ কৌশলটিকে একক টেবিলের উত্তরাধিকার বলা হয় । সমস্ত ধরণের গাড়ি সম্পর্কিত ডেটা গাড়ির একক টেবিলের মধ্যে বিভক্ত করা হয়। একটি কলাম, কার_ টাইপ রয়েছে যা একটি একক ধরণের সমস্ত গাড়ি একসাথে ভাগ করে দেয়। কোনও গাড়ি একাধিক ধরণের হতে পারে না। একটি কলাম অপ্রাসঙ্গিক তাহলে, বলে, বৈদ্যুতিক গাড়ি, এটা ছেড়ে দেওয়া হবে শূন্য সারি যে বৈদ্যুতিক গাড়ি অধিকারে থাকা হবে।

এই সহজ সমাধানটি ছোট এবং সাধারণ ক্ষেত্রে ভাল কাজ করে। প্রচুর NULL এর উপস্থিতি স্টোরেজ ওভারহেডে একটি সামান্য বিট যোগ করে এবং ওভারহেড পুনরুদ্ধার করতে কিছুটা। বুলিয়ান পরীক্ষা নালামযোগ্য কলামগুলিতে করা হলে বিকাশকারীকে এসকিউএল ত্রি-মূল্যবান যুক্তি শিখতে হতে পারে । এটি প্রথমে চমকে উঠতে পারে তবে এটির সাথে অভ্যস্ত হয়ে যায়।

ক্লাস টেবিলের উত্তরাধিকার নামে আরও একটি কৌশল রয়েছে । এই নকশায় গ্যাস_কার, ইলেকট্রিক_কার এবং হাইব্রিড_কারের জন্য আলাদা আলাদা টেবিল রয়েছে, তাদের সবার জন্য একটি সংযুক্ত টেবিল, গাড়ি ছাড়াও। আপনি যখন নির্দিষ্ট ধরণের গাড়ি সম্পর্কে সমস্ত তথ্য চান, আপনি উপযুক্ত বিশেষায়িত টেবিলের সাথে গাড়ির টেবিলে যোগ দিন। এই নকশায় কম NUL রয়েছে, তবে আপনি আরও যোগদান করতে। এই কৌশলটি বৃহত্তর এবং আরও জটিল ক্ষেত্রে আরও ভাল কাজ করে।

একটি তৃতীয় কৌশল রয়েছে যা ভাগ করে নেওয়া প্রাথমিক কী বলে। ক্লাস টেবিলের উত্তরাধিকারের সাথে একযোগে এই কৌশলটি ব্যবহৃত হয়। সাবক্লাসগুলির জন্য বিশেষায়িত টেবিলগুলিতে, তাদের প্রাথমিক কী হিসাবে, গাড়ির টেবিলে সংশ্লিষ্ট প্রবেশের প্রাথমিক কীটির একটি অনুলিপি রয়েছে। এই আইডি কলামটি প্রাথমিক কী এবং বিদেশী কী উভয় হিসাবে ঘোষিত হতে পারে।

এতে নতুন গাড়ি যুক্ত করার সময় কিছুটা অতিরিক্ত প্রোগ্রামিং জড়িত থাকে, তবে এটি যোগদান করে সহজ, সহজ এবং দ্রুত।

আসল বিশ্বে সুপারক্লাস এবং সাবক্লাসগুলি সর্বদা ঘটে। ভয় পাবেন না। পারফরম্যান্সের জন্য আপনার প্রাথমিক নকশা পরীক্ষা করুন। যদি আপনার প্রথম প্রচেষ্টাটি সহজ এবং সাবলীল হয়, আপনি এটির গতি বাড়ানোর জন্য এটি টুইট করতে সক্ষম হবেন।


3
ওহ! ধন্যবাদ! আমি যেটা বের করার চেষ্টা করছিলাম তা সেই জায়গা। ক্লাস টেবিলের উত্তরাধিকার যথাযথভাবে আমার যা প্রয়োজন তা মনে হচ্ছে। আমি এটির আমার গ্রহণযোগ্য উত্তরটি ভবিষ্যতের পাঠকদের জন্য পরিবর্তন করেছি কারণ আমি মনে করি এটি কেবল আমার ক্ষেত্রে নয়, পুরোপুরি প্রশ্নটি coversেকে রাখে।
আর্থার তারাসভ

6
এখানে দুর্দান্ত উত্তর। একটি টিপ: এই নকশা সংক্রান্ত সিদ্ধান্তগুলি পুরোপুরি নথিভুক্ত করুন। আপনি যে কোনও রুটই ধরেন না কেন, যখন কেউ ডাটাবেস কাঠামোটি পরীক্ষা করছেন তখন তা স্পষ্ট হবে না । কিছু পোস্টের মতো ডেটাবেস আপনাকে আপনার কলাম, টেবিল এবং এর মেটা-ডেটা বরাবর একটি মন্তব্য বাঁধতে সক্ষম করে
বেসিল Bourque

আপনি হাইব্রিড গাড়ি হওয়া থেকে বৈদ্যুতিন গাড়ি রাখার ক্ষেত্রে নিষেধাজ্ঞার সমাধান করেন না। তার জন্য আপনার পৃথক টেবিলের প্রয়োজন।
jmoreno

2
তুমি ঠিক. আপনি যদি কারের টেবিলে একটি car_type ক্ষেত্র যোগ করেন, তবে আপনি সম্পূর্ণ সাধারণীকরণ থেকে বিচ্যুত হওয়ার ব্যয়ে গাড়িগুলিকে কেবলমাত্র এক প্রকারের মধ্যে সীমাবদ্ধ করতে পারেন। একটি ভাল ডিবিএমএস আপনাকে একটি চেক সীমাবদ্ধতা সংজ্ঞায়িত করতে দেয় যা একটির অধিক বিশেষায়িত টেবিলে গাড়ি প্রবেশ করতে বাধা দেয়। এটিতে কিছু ওভারহেড রয়েছে, আপনি নতুন গাড়ি যুক্ত করতে যান।
ওয়াল্টার মিট্টি

@ ওয়াল্টারমিটি কিন্তু car_typeক্ষেত্র ছাড়াই আপনি কীভাবে জানতে পারবেন যে তথ্য পুনরুদ্ধার করার জন্য কোন টেবিলটি বিশদ সন্ধান করতে হবে? নির্দিষ্ট carরেকর্ড সম্পর্কে কোনটির ডেটা রয়েছে তা দেখতে আপনাকে কি তিনটি টেবিলটি পড়তে হবে ?
জোশ পার্ট

12

আপনার মডেলটিতে যতটা সত্তা সাব-টাইপ রয়েছে ততটুকু থাকার মতো কোনও সমস্যা নেই যা আপনি মডেল করার চেষ্টা করছেন এমন ডেটার বাস্তবতা প্রতিফলিত করতে। উপ-প্রকারগুলি একটি খারাপ অভ্যাস কিনা তা প্রশ্ন নয়। বিষয়টি হতে পারে এটি একটি ভাল মডেল ?

উদাহরণস্বরূপ, আপনার উদাহরণের অধীনে আপনি অডি এ 4 ইট্রন - যা প্লাগ-ইন হাইব্রিড জাতীয় কিছু দিয়ে কী করবেন? এটি কি একটি "বৈদ্যুতিক গাড়ি" বা এটি একটি "হাইব্রিড গাড়ি"?

আপনার নিজের কাছে অন্য প্রশ্নটি জিজ্ঞাসা করতে হবে আপনি কেন একেবারে উপ-টাইপ করছেন? আপনার উপ-প্রকারে আপনার কতটি স্বতন্ত্র পূর্বাভাস রয়েছে? এই পূর্বাভাসগুলির মধ্যে কি সাব-টাইপের মধ্যে ভাগ করা আছে? পরিস্থিতি জটিল হতে পারে।

শ্রেণিবিন্যাসের জন্য উপ-টাইপিং ডেটাবেস ডিজাইনে ব্যবহৃত হয় না। আপনি কোডগুলি, কোড সারণীর বিদেশী কীগুলি বা পতাকা সহ শ্রেণিবদ্ধকরণ করতে পারেন। সাব-টাইপিং বিভিন্ন ধরণের আগ্রহের জিনিসগুলির জন্য স্বতন্ত্র প্রিকিকেট সেটগুলি মডেল করতে ব্যবহৃত হয়। আপনি যদি কেবল শ্রেণিবিন্যাসের জন্য উপ-প্রকারগুলি ব্যবহার করেন তবে এটি একটি খারাপ অভ্যাস।

আপনার উপ-প্রকারগুলি যদি আপনার ডাটাবেসের যত্ন নেওয়া জিনিসগুলির জন্য স্পষ্টভাবে এবং দ্ব্যর্থহীনভাবে বিভিন্ন প্রাকটিক সেট সেট করে, তবে আপনার কতগুলি উপ-প্রকারের প্রয়োজন তা বিবেচনা না করেই এটি একেবারে ভাল অভ্যাস।


ধন্যবাদ, আমি ভীত ছিলাম আমি নিজের জন্য কোনও ধরণের ফাঁদ স্থাপন করছিলাম। আমার সমস্যাটি হ'ল প্রতিটি উপ-প্রকারের প্রচুর কলাম থাকবে। কিছু ওভারল্যাপ করবে এবং আমি এগুলিকে একটি carটেবিলের মধ্যে রাখব , তবে অনেকেই সাব-টাইপ টেবিলের মধ্যে রাখবেন না এবং রাখবেন। উদাহরণস্বরূপ, এটি গাড়ির ধরণের প্রাথমিক অংশগুলি সঞ্চয় করার মতো কিছু হবে। বৈদ্যুতিন গাড়ির ইঞ্জিনে 100 টি অংশ, গ্যাস গাড়ির ইঞ্জিন 75 অংশ এবং একটি সংকর 125 অংশ থাকতে পারে। 50 যন্ত্রাংশ সাধারণ এবং সংরক্ষিত হবে cars, যখন 50, 25, এবং 75 হবে electric_car, gas_carএবং hybrid_carটেবিল
আর্থার Tarasov
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.