ডেটাবেসগুলিতে উত্তরাধিকারের মডেলিংয়ের জন্য সেরা অনুশীলনগুলি কী কী?
ট্রেড-অফগুলি কী কী (যেমন উত্সাহ)?
(আমি এসকিউএল সার্ভার এবং। নেট সম্পর্কে সর্বাধিক আগ্রহী, তবে অন্যান্য প্ল্যাটফর্মগুলি কীভাবে এই সমস্যাটিকে সম্বোধন করে তাও আমি বুঝতে চাই))
ডেটাবেসগুলিতে উত্তরাধিকারের মডেলিংয়ের জন্য সেরা অনুশীলনগুলি কী কী?
ট্রেড-অফগুলি কী কী (যেমন উত্সাহ)?
(আমি এসকিউএল সার্ভার এবং। নেট সম্পর্কে সর্বাধিক আগ্রহী, তবে অন্যান্য প্ল্যাটফর্মগুলি কীভাবে এই সমস্যাটিকে সম্বোধন করে তাও আমি বুঝতে চাই))
উত্তর:
ডাটাবেসে উত্তরাধিকারের মডেল করার বিভিন্ন উপায় রয়েছে। যা আপনি চয়ন আপনার প্রয়োজনের উপর নির্ভর করে। এখানে কয়েকটি বিকল্প রয়েছে:
সারণী-প্রতি-প্রকার (টিপিটি)
প্রতিটি শ্রেণীর নিজস্ব টেবিল থাকে। বেস শ্রেণীর সমস্ত বেস শ্রেণীর উপাদান রয়েছে এবং এটি থেকে প্রাপ্ত প্রতিটি শ্রেণীর নিজস্ব টেবিল রয়েছে, এটি একটি প্রাথমিক কী যা বেস ক্লাসের টেবিলে একটি বিদেশী কীও রয়েছে; উত্পন্ন টেবিলের শ্রেণিতে কেবলমাত্র বিভিন্ন উপাদান রয়েছে।
উদাহরণস্বরূপ:
class Person {
public int ID;
public string FirstName;
public string LastName;
}
class Employee : Person {
public DateTime StartDate;
}
সারণীর ফলাফল যেমন:
table Person
------------
int id (PK)
string firstname
string lastname
table Employee
--------------
int id (PK, FK)
datetime startdate
টেবিল-প্রতি-হায়ারার্কি (টিপিএইচ)
একটি একক টেবিল রয়েছে যা সমস্ত উত্তরাধিকারের স্তরক্রমকে উপস্থাপন করে, যার অর্থ বেশ কয়েকটি কলাম বিচ্ছিন্ন হবে। একটি বৈষম্যমূলক কলাম যুক্ত করা হয়েছে যা সিস্টেমটি জানায় এটি কী ধরণের সারি।
উপরের ক্লাসগুলি দেওয়া, আপনি এই টেবিলটি দিয়ে শেষ করবেন:
table Person
------------
int id (PK)
int rowtype (0 = "Person", 1 = "Employee")
string firstname
string lastname
datetime startdate
যে কোনও সারির জন্য সারি টাইপ 0 (ব্যক্তি), প্রারম্ভকালীন সর্বদা শূন্য থাকবে।
টেবিল-প্রতি-কংক্রিট (টিপিসি)
প্রতিটি শ্রেণীর নিজস্ব পূর্ণরূপে গঠিত টেবিল রয়েছে যা অন্য কোনও টেবিলের কোনও উল্লেখ নেই ferences
উপরের ক্লাসগুলি দেওয়া, আপনি এই টেবিলগুলি দিয়ে শেষ করবেন:
table Person
------------
int id (PK)
string firstname
string lastname
table Employee
--------------
int id (PK)
string firstname
string lastname
datetime startdate
সঠিক ডাটাবেস ডিজাইন সঠিক অবজেক্ট ডিজাইনের মতো কিছুই নয়।
আপনি যদি কেবলমাত্র আপনার অবজেক্টকে সিরিয়ালাইজ করা (যেমন রিপোর্ট, কোয়েরি, মাল্টি-অ্যাপ্লিকেশন ব্যবহার, ব্যবসায়িক বুদ্ধি ইত্যাদি) ব্যতীত অন্য কোনও কিছুর জন্য ডাটাবেস ব্যবহার করার পরিকল্পনা করছেন তবে আমি বস্তু থেকে টেবিলগুলিতে কোনও ধরণের সরল ম্যাপিংয়ের পরামর্শ দিচ্ছি না।
অনেক লোক একটি সত্তা হিসাবে একটি ডাটাবেস টেবিলের মধ্যে একটি সারি মনে করে (আমি এই শর্তাবলী চিন্তা করে অনেক বছর ব্যয় করেছি), তবে একটি সারি কোনও সত্তা নয়। এটি একটি প্রস্তাব। একটি ডাটাবেস সম্পর্ক (যেমন, টেবিল) বিশ্ব সম্পর্কে কিছু সত্য বিবৃতি উপস্থাপন করে। সারিটির উপস্থিতি সত্যকে ইঙ্গিত করে (এবং বিপরীতে, এর অনুপস্থিতি সত্যটি মিথ্যা নির্দেশ করে)।
এই বোঝার সাথে, আপনি দেখতে পাচ্ছেন যে কোনও অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামে একক ধরণের এক ডজন বিভিন্ন সম্পর্ক জুড়ে রাখা যেতে পারে। এবং বিভিন্ন ধরণের (উত্তরাধিকার, সংঘবদ্ধতা, একত্রিতকরণ বা সম্পূর্ণ অসমাপ্ত দ্বারা এক হয়ে) আংশিকভাবে একক সম্পর্কের মধ্যে সংরক্ষণ করা যেতে পারে।
নিজেকে জিজ্ঞাসা করা ভাল, আপনি কোন তথ্যগুলি সংরক্ষণ করতে চান, কোন প্রশ্নগুলির উত্তর চান, কোন প্রতিবেদন উত্পন্ন করতে চান।
একবার যথাযথ ডিবি ডিজাইন তৈরি হয়ে গেলে, তখন কোয়েরি / দৃষ্টিভঙ্গি তৈরি করা সহজ বিষয় যা আপনাকে সেই সম্পর্কগুলিতে আপনার অবজেক্টগুলিকে সিরিয়ালাইজ করতে দেয়।
উদাহরণ:
একটি হোটেল বুকিং সিস্টেমে আপনার জেন ডো এর সী ভিউ ইন-এর একটি কক্ষের জন্য 10-10 এপ্রিলের জন্য রিজার্ভেশন রয়েছে তা সত্য সংরক্ষণ করতে হবে। এটি কি গ্রাহক সত্তার একটি বৈশিষ্ট্য? এটি কি হোটেল সত্তার একটি বৈশিষ্ট্য? গ্রাহক এবং হোটেল অন্তর্ভুক্ত বৈশিষ্ট্য সহ এটি কি কোনও রিজার্ভেশন সত্তা? এটি কোনও অবজেক্ট অরিয়েন্টেড সিস্টেমের মধ্যে যে কোনও বা সমস্ত কিছু হতে পারে। একটি ডাটাবেসে, এটি things জিনিসগুলির মধ্যে কোনওটিই নয়। এটি কেবল একটি খালি সত্য।
পার্থক্যটি দেখতে, নিম্নলিখিত দুটি প্রশ্ন বিবেচনা করুন। (1) পরের বছর জেন ডো এর কতটা হোটেল রিজার্ভেশন রয়েছে? (২) সীভিউ ইন-এ 10 এপ্রিলের জন্য কতটি কক্ষ বুক করা আছে?
কোনও অবজেক্ট-ভিত্তিক সিস্টেমে ক্যোয়ারী (1) গ্রাহক সত্তার একটি বৈশিষ্ট্য, এবং ক্যোয়ারী (2) হোটেল সত্তার একটি বৈশিষ্ট্য। এগুলি হ'ল সেই বস্তু যা তাদের API এ এই বৈশিষ্ট্যগুলি প্রকাশ করবে। (যদিও, স্পষ্টতই অভ্যন্তরীণ প্রক্রিয়াগুলি যার মাধ্যমে এই মানগুলি প্রাপ্ত হয় সেগুলিতে অন্যান্য বস্তুর উল্লেখ জড়িত থাকতে পারে))
রিলেশনাল ডেটাবেস সিস্টেমে, উভয় প্রশ্নগুলি তাদের নম্বর পাওয়ার জন্য সংরক্ষণ সংক্রান্ত সম্পর্ক পরীক্ষা করবে এবং ধারণাগতভাবে অন্য কোনও "সত্তা" নিয়ে বিরক্ত করার প্রয়োজন নেই।
সুতরাং, এটি বিশ্ব সম্পর্কে তথ্য সংরক্ষণ করার চেষ্টা করে - বৈশিষ্ট্যের সাথে সত্তা সঞ্চার করার চেষ্টা করার পরিবর্তে - যে কোনও সঠিক সম্পর্কযুক্ত ডাটাবেস নির্মিত হয়। এবং একবার এটি যথাযথভাবে ডিজাইন করা হয়ে গেলে, সেই নকশার ধাপ চলাকালীন যেগুলি দরকারী অনাবৃত ছিল না সেগুলি সহজেই তৈরি করা যেতে পারে, যেহেতু এই প্রশ্নগুলি পূরণ করার জন্য প্রয়োজনীয় সমস্ত তথ্য তাদের যথাযথ জায়গায় রয়েছে।
Employment
টেবিল থাকা উচিত , যা সমস্ত কর্মসংস্থান তাদের প্রারম্ভের তারিখগুলি সহ সংগ্রহ করে। সুতরাং যদি বর্তমানের কর্মসংস্থান শুরুর তারিখটি জেনে Employer
রাখা গুরুত্বপূর্ণ, তবে এটি একটির জন্য যথাযথ ব্যবহারের ক্ষেত্রে হতে পারে View
, যার মধ্যে অনুসন্ধানের মাধ্যমে সেই সম্পত্তি অন্তর্ভুক্ত রয়েছে? (দ্রষ্টব্য: বলে মনে হচ্ছে '-' ঠিক আমার
সংক্ষিপ্ত উত্তর: আপনি না।
আপনার যদি আপনার অবজেক্টগুলিকে সিরিয়ালাইজ করার দরকার হয় তবে একটি ওআরএম ব্যবহার করুন, বা এ্যাকটিভেরকর্ড বা প্রপায়েন্সের মতো আরও ভাল কিছু।
আপনার যদি ডেটা সংরক্ষণের প্রয়োজন হয় তবে এটি কোনও সম্পর্কিত পদ্ধতিতে সঞ্চয় করুন (আপনি কী সংরক্ষণ করছেন তা সম্পর্কে যত্নবান হওয়া এবং জেফরি এল হুইটলেজি কী বলেছে সেদিকে মনোযোগ দিচ্ছে), আপনার অবজেক্টের নকশায় প্রভাবিত নয়।
ব্র্যাড উইলসন উল্লিখিত, আপনি যেভাবে যাচ্ছেন টিপিটি, টিপিএইচ এবং টিপিসি নিদর্শনগুলি। তবে কয়েকটি নোট:
বেস ক্লাস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত শিশু ক্লাসগুলিকে ডাটাবেসে বেস ক্লাস সংজ্ঞাতে দুর্বল সত্তা হিসাবে দেখা যেতে পারে, যার অর্থ তারা তাদের বেস-শ্রেণীর উপর নির্ভরশীল এবং এটি ছাড়া থাকতে পারে না। আমি বহুবার দেখেছি, সেই অনন্য আইডি প্রতিটি সন্তানের টেবিলে সংরক্ষণ করা হয় এবং এফকে প্যারেন্ট টেবিলে রাখার সময়। একটি এফকে কেবলমাত্র যথেষ্ট এবং অন-ডিলিট ক্যাসকেডটি শিশু এবং বেস টেবিলের মধ্যে এফকে-সম্পর্কের জন্য সক্ষম করা আরও ভাল।
টিপিটিতে, কেবল বেস টেবিলের রেকর্ডগুলি দেখে, আপনি কোন শিশু শ্রেণির রেকর্ড উপস্থাপন করছে তা খুঁজে পেতে সক্ষম নন। এটি কখনও কখনও প্রয়োজন হয়, যখন আপনি সমস্ত রেকর্ডের একটি তালিকা ( select
প্রতিটি সন্তানের টেবিলে না করে) লোড করতে চান । এটি পরিচালনা করার একটি উপায়, শিশু শ্রেণীর ধরণের প্রতিনিধিত্ব করে এমন একটি কলাম থাকা (টিপিএইচের সারি টাইপ ক্ষেত্রের অনুরূপ), তাই কোনওভাবে টিপিটি এবং টিপিএইচ মিশ্রণ করা।
বলুন যে আমরা একটি ডাটাবেস ডিজাইন করতে চাই যা নীচের আকারের শ্রেণীর চিত্রটি ধারণ করে:
public class Shape {
int id;
Color color;
Thickness thickness;
//other fields
}
public class Rectangle : Shape {
Point topLeft;
Point bottomRight;
}
public class Circle : Shape {
Point center;
int radius;
}
উপরের ক্লাসগুলির জন্য ডাটাবেস ডিজাইনটি এরকম হতে পারে:
table Shape
-----------
int id; (PK)
int color;
int thichkness;
int rowType; (0 = Rectangle, 1 = Circle, 2 = ...)
table Rectangle
----------
int ShapeID; (FK on delete cascade)
int topLeftX;
int topLeftY;
int bottomRightX;
int bottomRightY;
table Circle
----------
int ShapeID; (FK on delete cascade)
int centerX;
int center;
int radius;
আপনি ডিবিতে দুটি প্রধান ধরণের উত্তরাধিকার সেটআপ করতে পারেন, সত্তা প্রতি সারণী এবং প্রতি স্তরক্রমের টেবিল।
প্রতি সত্তা সারণী হ'ল যেখানে আপনার কাছে একটি বেস সত্তা টেবিল রয়েছে যা সমস্ত শিশু শ্রেণীর অংশীদারি করে properties তারপরে আপনার প্রতি শিশু ক্লাসের জন্য আরও একটি সারণী রয়েছে যাতে কেবল সেই শ্রেণীর জন্য প্রযোজ্য বৈশিষ্ট্য থাকে। তারা তাদের পিকে দ্বারা 1: 1 এ লিঙ্কযুক্ত
প্রতি শ্রেণিবিন্যাস সারণি যেখানে সমস্ত শ্রেণি একটি টেবিল ভাগ করে নিয়েছিল এবং alচ্ছিক বৈশিষ্ট্যগুলি হ্রাসযোগ্য। এগুলি একটি বৈষম্যমূলক ক্ষেত্র যা এটি এমন একটি সংখ্যা যা বর্তমানে রেকর্ডটি ধারণ করে
সেশনটাইপআইডি বৈষম্যমূলক
আপনার যোগদানের প্রয়োজন নেই (কেবলমাত্র বৈষম্যমূলক মান) এর জন্য অনুসন্ধানের জন্য হায়ারার্কির জন্য লক্ষ্যগুলি দ্রুততর হয়, তবে কোন ধরণের কিছু চিহ্নিত করার পাশাপাশি তার সমস্ত ডেটা পুনরুদ্ধার করার জন্য আপনাকে সত্তার প্রতি জটিল লক্ষ্য করতে হবে।
সম্পাদনা: আমি যে চিত্রগুলি এখানে দেখছি তা হ'ল আমি কাজ করছি এমন একটি প্রকল্পের স্ক্রিন শট। সম্পদ চিত্রটি সম্পূর্ণ নয়, সুতরাং এটির শূন্যতা, তবে এটি মূলত এটি দেখানো হয়েছিল যে এটির সেটআপ কীভাবে আপনার টেবিলের ভিতরে রাখবেন না। এটা তোমার উপর নির্ভর করে ;). সেশন টেবিলটিতে ভার্চুয়াল সহযোগিতার সেশন সম্পর্কিত তথ্য রয়েছে এবং কী ধরনের সহযোগিতা জড়িত তার উপর নির্ভর করে বিভিন্ন ধরণের সেশন হতে পারে।
আপনি আপনার ডাটাবেসকে সাধারণীকরণ করবেন এবং এটি আসলে আপনার উত্তরাধিকারকে মিরর করবে। এতে পারফরম্যান্সের অবক্ষয় থাকতে পারে, তবে এটি স্বাভাবিককরণের সাথেই হয়। ভারসাম্য খুঁজে পেতে আপনার সম্ভবত ভাল জ্ঞান ব্যবহার করতে হবে।
অনুরূপ থ্রেড উত্তর পুনরাবৃত্তি
OR ম্যাপিংয়ে, প্যারেন্ট টেবিলে উত্তরাধিকারের মানচিত্র যেখানে পিতামাতার এবং সন্তানের টেবিলগুলি একই শনাক্তকারী ব্যবহার করে
উদাহরণ স্বরূপ
create table Object (
Id int NOT NULL --primary key, auto-increment
Name varchar(32)
)
create table SubObject (
Id int NOT NULL --primary key and also foreign key to Object
Description varchar(32)
)
সাবজেক্টের সাথে অবজেক্টের একটি বিদেশী-কী সম্পর্ক রয়েছে। আপনি যখন সাবঅবজেক্ট সারি তৈরি করেন, আপনাকে অবশ্যই প্রথমে একটি অবজেক্ট সারি তৈরি করতে হবে এবং উভয় সারিতে আইডি ব্যবহার করতে হবে
সম্পাদনা করুন: আপনি যদি মডেল আচরণের দিকেও সন্ধান করেন, আপনার টাইপ টেবিলের দরকার হবে যা টেবিলের মধ্যে উত্তরাধিকারের সম্পর্ককে তালিকাভুক্ত করে, এবং সমাবেশ এবং শ্রেণীর নাম নির্দিষ্ট করে যা প্রতিটি টেবিলের আচরণকে বাস্তবায়িত করে
ওভারকিলের মতো মনে হচ্ছে, তবে এটি সমস্ত কিসের জন্য আপনি এটি ব্যবহার করতে চান তার উপর নির্ভর করে!
এসকিউএল আলকেমি (পাইথন ওআরএম) ব্যবহার করে আপনি দুটি ধরণের উত্তরাধিকার করতে পারেন।
আমার যে অভিজ্ঞতা হয়েছে সে হ'ল একটি সেজ-টেবিল ব্যবহার করা এবং একটি বৈষম্যমূলক কলাম থাকা having উদাহরণস্বরূপ, একটি ভেড়া ডেটাবেস (কোনও রসিকতা নয়!) সমস্ত মেষকে এক টেবিলের মধ্যে সংরক্ষণ করে এবং সেই টেবিলে র্যামস এবং ইয়েস একটি লিঙ্গ কলাম ব্যবহার করে পরিচালিত হয়েছিল।
সুতরাং, আপনি সমস্ত মেষের জন্য জিজ্ঞাসা করতে পারেন এবং সমস্ত মেষ পেতে পারেন। অথবা আপনি কেবল রামের দ্বারা জিজ্ঞাসা করতে পারেন, এবং এটি কেবল রামসই পাবে। আপনি এমন কিছু কাজ করতে পারেন যেমন একটি সম্পর্ক থাকতে পারে যা কেবল রাম হতে পারে (অর্থাত্, একটি ভেড়ার সায়ার), ইত্যাদি।
নোট করুন যে কিছু ডেটাবেস ইঞ্জিনগুলি ইতিমধ্যে পোস্টগ্রিসের মতো স্থানীয়ভাবে উত্তরাধিকার ব্যবস্থা সরবরাহ করে । তাকান ডকুমেন্টেশন ।
উদাহরণস্বরূপ, আপনি উপরের প্রতিক্রিয়াতে বর্ণিত ব্যক্তি / কর্মচারী সিস্টেমটিকে জিজ্ঞাসা করবেন:
/ * এটি সমস্ত ব্যক্তি বা কর্মচারীর প্রথম নাম দেখায় * / ব্যক্তি থেকে প্রথম নাম নির্বাচন করুন; / * এটি কেবলমাত্র সমস্ত কর্মচারীর শুরুর তারিখ দেখায় * / / কর্মচারী থেকে শুরু সূচনা;
এটি আপনার ডাটাবেসের পছন্দ, আপনার বিশেষ স্মার্ট হওয়ার দরকার নেই!