এই দৃশ্যের যথাযথ কাঠামো একটি সাবক্লাস / উত্তরাধিকারী মডেল, এবং আমি এই উত্তরে প্রস্তাবিত ধারণার সাথে প্রায় একই রকম: ভিন্ন ভিন্ন আদেশের মূল্যের তালিকা ।
এই প্রশ্নের প্রস্তাবিত মডেলটি আসলে খুব কাছাকাছি যে Animal
সত্তায় টাইপ (ie race
) এবং সমস্ত ধরণের জুড়ে সাধারণ বৈশিষ্ট্য রয়েছে। যাইহোক, দুটি ছোটখাট পরিবর্তন প্রয়োজন যা:
ক্যাট_আইডি এবং কুকুর_আইডি ক্ষেত্রগুলি তাদের নিজ নিজ সত্তা থেকে সরান:
এখানে মূল ধারণা যে সবকিছু একটি হল Animal
, নির্বিশেষে race
: Cat
, Dog
, Elephant
, ইত্যাদি। সেই সূচনা পয়েন্টটি দেওয়া, যে কোনও বিশেষের race
জন্য Animal
সত্যিকার অর্থে পৃথক পরিচয়কারীর প্রয়োজন নেই:
Animal_ID
অনন্য
Cat
, Dog
, এবং অন্য কোনও অতিরিক্ত race
সত্ত্বা ভবিষ্যতে যোগ নিজেরাই, সম্পূর্ণরূপে কোন বিশেষ প্রতিনিধিত্ব করে না Animal
; প্যারেন্ট সত্তায় থাকা তথ্যের সংমিশ্রণে কেবল তখনই তাদের অর্থ হয় Animal
,।
তাই, Animal_ID
সম্পত্তি Cat
, Dog
ইত্যাদি সত্ত্বা উভয় পি কে এবং এফ কে ফিরে এসেছে Animal
সত্তা।
এর প্রকারের মধ্যে পার্থক্য breed
:
কেবলমাত্র দুটি বৈশিষ্ট্য একই নাম ভাগ করে নেওয়ার কারণে অপরিহার্যভাবে এই বৈশিষ্ট্যগুলি একই নয়, এমনকি নাম একইরকম সম্পর্কের বোঝায় । এই ক্ষেত্রে, আপনার কাছে যা আছে তা আসলে CatBreed
এবং DogBreed
পৃথক "প্রকার" হিসাবে
প্রাথমিক নোট
- এসকিউএলটি মাইক্রোসফ্ট এসকিউএল সার্ভারের সাথে নির্দিষ্ট (যেমন টি-এসকিউএল) specific অর্থ, ডেটাটাইপগুলি সম্পর্কে সাবধান থাকুন কারণ সমস্ত আরডিবিএমএস-এ সেগুলি এক নয়। উদাহরণস্বরূপ, আমি ব্যবহার করছি
VARCHAR
তবে আপনি যদি স্ট্যান্ডার্ড এএসসিআইআই সেট এর বাইরে কোনও কিছু সঞ্চয় করতে চান তবে আপনার সত্যই ব্যবহার করা উচিত NVARCHAR
।
- "টাইপ" টেবিলগুলির আইডি ক্ষেত্রগুলি (
Race
, CatBreed
এবং DogBreed
) স্বয়ংক্রিয়ভাবে বর্ধনকারী নয় (যেমন টি-এসকিউএলের ক্ষেত্রে আইডেন্টিটি) কারণ তারা অ্যাপ্লিকেশন ধ্রুবক (যেমন তারা অ্যাপ্লিকেশনটির অংশ) যা স্থির দৃষ্টিকোণ মানগুলি ডাটাবেস এবং enum
সি # (অথবা অন্যান্য ভাষা) এর হিসাবে প্রতিনিধিত্ব করা হয় । যদি মানগুলি যুক্ত করা হয় তবে সেগুলি নিয়ন্ত্রিত পরিস্থিতিতে যুক্ত করা হয়। আমি অ্যাপ্লিকেশন মাধ্যমে আসা ব্যবহারকারীর ডেটা জন্য স্বয়ংক্রিয় বৃদ্ধি ক্ষেত্রের ব্যবহার সংরক্ষণ করি।
- আমি যে নামকরণ কনভেনশনটি ব্যবহার করি তা হ'ল প্রতিটি সাবক্লাস টেবিলের নামটি মূল শ্রেণীর নাম দিয়ে শুরু করা হবে যার পরে সাবক্লাসের নাম থাকবে। এটি টেবিলগুলি সংগঠিত করতে পাশাপাশি পরিষ্কারভাবে (এফকেগুলিকে না দেখিয়ে) সাবক্লাস টেবিলের মূল সত্তার টেবিলের সম্পর্ককে নির্দেশ করে।
- দর্শন সম্পর্কিত একটি নোটের জন্য দয়া করে শেষে "চূড়ান্ত সম্পাদনা" বিভাগটি দেখুন।
"জাতি" হিসাবে "রেস" -স্পেসিফিক অ্যাপ্রোচ
টেবিলগুলির এই প্রথম সেটটি হ'ল লুকিং / প্রকারের সারণী:
CREATE TABLE Race
(
RaceID INT NOT NULL PRIMARY KEY
RaceName VARCHAR(50) NOT NULL
);
CREATE TABLE CatBreed
(
CatBreedID INT NOT NULL PRIMARY KEY,
BreedName VARCHAR(50),
CatBreedAttribute1 INT,
CatBreedAttribute2 VARCHAR(10)
-- other "CatBreed"-specific properties as needed
);
CREATE TABLE DogBreed
(
DogBreedID INT NOT NULL PRIMARY KEY,
BreedName VARCHAR(50),
DogBreedAttribute1 TINYINT
-- other "DogBreed"-specific properties as needed
);
এই দ্বিতীয় তালিকাটি হ'ল প্রধান "প্রাণী" সত্তা:
CREATE TABLE Animal
(
AnimalID INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
RaceID INT NOT NULL, -- FK to Race
Name VARCHAR(50)
-- other "Animal" properties that are shared across "Race" types
);
ALTER TABLE Animal
ADD CONSTRAINT [FK_Animal_Race]
FOREIGN KEY (RaceID)
REFERENCES Race (RaceID);
টেবিল এই তৃতীয় সেট প্রশংসাসূচক উপ-বর্গ সত্ত্বা প্রতিটি সংজ্ঞার সম্পন্ন হয় Race
এর Animal
:
CREATE TABLE AnimalCat
(
AnimalID INT NOT NULL PRIMARY KEY, -- FK to Animal
CatBreedID INT NOT NULL, -- FK to CatBreed
HairColor VARCHAR(50) NOT NULL
-- other "Cat"-specific properties as needed
);
ALTER TABLE AnimalCat
ADD CONSTRAINT [FK_AnimalCat_CatBreed]
FOREIGN KEY (CatBreedID)
REFERENCES CatBreed (CatBreedID);
ALTER TABLE AnimalCat
ADD CONSTRAINT [FK_AnimalCat_Animal]
FOREIGN KEY (AnimalID)
REFERENCES Animal (AnimalID);
CREATE TABLE AnimalDog
(
AnimalID INT NOT NULL PRIMARY KEY, -- FK to Animal
DogBreedID INT NOT NULL, -- FK to DogBreed
HairColor VARCHAR(50) NOT NULL
-- other "Dog"-specific properties as needed
);
ALTER TABLE AnimalDog
ADD CONSTRAINT [FK_AnimalDog_DogBreed]
FOREIGN KEY (DogBreedID)
REFERENCES DogBreed (DogBreedID);
ALTER TABLE AnimalDog
ADD CONSTRAINT [FK_AnimalDog_Animal]
FOREIGN KEY (AnimalID)
REFERENCES Animal (AnimalID);
একটি ভাগ করা breed
প্রকার ব্যবহার করে মডেলটি "অতিরিক্ত নোট" বিভাগের পরে দেখানো হয়।
অতিরিক্ত নোট
- ধারণাটি
breed
বিভ্রান্তির কেন্দ্রবিন্দু বলে মনে হচ্ছে। এটি jcolebrand দ্বারা প্রস্তাব করা হয়েছিল (প্রশ্নের মন্তব্যে) যা breed
বিভিন্ন সম্পত্তি জুড়ে ভাগ করা সম্পত্তি race
, এবং অন্য দুটি উত্তর এটি যেমন তাদের মডেলগুলিতে সংহত করেছে। এটি একটি ভুল, তবে এর মানগুলি breed
বিভিন্ন মানগুলির মধ্যে ভাগ হয় না race
। হ্যাঁ, আমি সচেতন যে আরও দুটি প্রস্তাবিত মডেল race
একটি পিতামাতা তৈরি করে এই সমস্যাটি সমাধান করার চেষ্টা করেছেন breed
। যদিও এটি প্রযুক্তিগতভাবে সম্পর্কের সমস্যার সমাধান করে, অ-সাধারণ বৈশিষ্ট্যগুলি সম্পর্কে কী করা উচিত এবং কীভাবে একটি race
নেই তার পরিচালনা কীভাবে করা যায় তার সামগ্রিক মডেলিংয়ের প্রশ্নটি সমাধান করতে এটি সহায়তা করে না breed
। তবে, এই ক্ষেত্রে যে এই জাতীয় সম্পত্তি সবার মধ্যে বিদ্যমান থাকার গ্যারান্টিযুক্ত ছিলAnimal
s, আমি সেই জন্য একটি বিকল্পও অন্তর্ভুক্ত করব (নীচে)।
- বিজয়প এবং ডেভিডএন প্রস্তাবিত মডেলগুলি (যা দেখতে দেখতে অভিন্ন বলে মনে হচ্ছে) কাজ করে না কারণ:
- তারা হয়
- অ-সাধারণ সম্পত্তিগুলি সংরক্ষণ করার অনুমতি দেবেন না (কমপক্ষে কোনও ব্যক্তির স্বতন্ত্র উদাহরণের জন্য নয়
Animal
), বা
- সকলের জন্য সমস্ত সম্পত্তি সত্তায়
race
সংরক্ষণ করা দরকার Animal
যা এই ডেটা উপস্থাপনের জন্য খুব সমতল (এবং প্রায় অ-সম্পর্কযুক্ত) উপায়। হ্যাঁ, লোকেরা এই সময়টি সব সময় করে তবে তার অর্থ হল সেই বৈশিষ্ট্যের জন্য সারিতে প্রতি অনেকগুলি নূতন ক্ষেত্র রয়েছে এবং সেই সারণীর নির্দিষ্ট race
ক্ষেত্রগুলির সাথে সারি প্রতি কোন ক্ষেত্র যুক্ত race
knowing
- তারা একটি যোগ করার জন্য অনুমতি দেয় না
race
এর Animal
ভবিষ্যৎ নেই যে breed
একটি সম্পত্তি হিসেবে। এবং সমস্ত এমনকি যদি Animal
গুলি একটি আছে breed
, যে কি পূর্বে সম্পর্কে উল্লেখ করা হয়েছে কারণে কাঠামো পরিবর্তন করবে না breed
যে: breed
উপর নির্ভরশীল race
(অর্থাত breed
জন্য Cat
হিসাবে একই জিনিস না breed
জন্য Dog
)।
প্রচলিত / ভাগ করা - সম্পত্তি পদ্ধতির হিসাবে "ব্রিড"
দয়া করে নোট করুন:
নীচের এসকিউএল উপরে উপস্থাপিত মডেল হিসাবে একই ডাটাবেস চালানো যেতে পারে:
Race
টেবিল একই
Breed
টেবিল নতুন
- তিনটি
Animal
টেবিল a এর সাথে সংযুক্ত করা হয়েছে2
- এমনকি
Breed
এখন একটি সাধারণ সম্পত্তি হওয়ার পরেও Race
মূল / পিতামাতার সত্তায় এটি উল্লেখ করা ঠিক হবে না (যদিও এটি প্রযুক্তিগতভাবে সম্পর্কযুক্ত সঠিক)। সুতরাং, উভয় RaceID
এবং BreedID
প্রতিনিধিত্ব করা হয় Animal2
। অর্ডার মধ্যে একটি মেলেনি প্রতিরোধ করার জন্য RaceID
উল্লেখ করা Animal2
হবে এবং একটি BreedID
একটি ভিন্ন হয় যে RaceID
, আমি উভয় একটি এফ কে যোগ করেছেন RaceID, BreedID
যে রেফারেন্স সেই ক্ষেত্র একটি অনন্য বাধ্যতা Breed
টেবিল। আমি সাধারণত একটি অনন্য চুক্তির দিকে এফকে নির্দেশ করা তুচ্ছ করি, তবে এটি করার কয়েকটি বৈধ কারণের মধ্যে এখানে একটি। একটি অনন্য চুক্তিটি যুক্তিযুক্তভাবে একটি "বিকল্প কী", যা এটিকে ব্যবহারের জন্য বৈধ করে তোলে। দয়া করে নোট করুন যে Breed
টেবিলটিতে এখনও ঠিক একটি পিকে রয়েছে BreedID
।
- সম্মিলিত ক্ষেত্রগুলিতে কেবলমাত্র একজন পিকে সঙ্গে না যাওয়ার কারণ এবং কোনও অনন্য চুক্তিটি হ'ল এটি একই
BreedID
সাথে বিভিন্ন মানকে পুনরাবৃত্তি করার অনুমতি দেয় RaceID
।
- যে চারদিকে পিকে এবং ইউনিক কনট্রন্টটি স্যুইচ না করার কারণ হ'ল এটিই কেবল ব্যবহারের জন্য না হতে পারে
BreedID
, তাই এটি উপলব্ধ Breed
না করেই কোনও নির্দিষ্ট মান উল্লেখ করা সম্ভব RaceID
।
- নিম্নলিখিত মডেলটি কাজ করার সময় এটিতে একটি ভাগ করে নেওয়া ধারণা সম্পর্কে দুটি সম্ভাব্য ত্রুটি রয়েছে
Breed
(এবং এজন্যেই আমি- Race
বিশিষ্ট Breed
সারণীগুলিই বেশি পছন্দ করি )।
- একটি অন্তর্নিহিত অনুমান যে সমস্ত মানের মান
Breed
একই বৈশিষ্ট্য আছে। Dog
"বংশবৃদ্ধি" এবং Elephant
"শাবক" এর মধ্যে পৃথক বৈশিষ্ট্য থাকার এই মডেলের কোনও সহজ উপায় নেই । তবে এটি করার এখনও একটি উপায় রয়েছে যা "চূড়ান্ত সম্পাদনা" বিভাগে উল্লিখিত হয়েছে।
Breed
একের অধিক জাতিকে ভাগ করে নেওয়ার কোনও উপায় নেই । আমি নিশ্চিত নই যে এটি করতে ইচ্ছুক কিনা (বা সম্ভবত প্রাণী ধারণায় নয় তবে সম্ভবত অন্যান্য পরিস্থিতিতে এই ধরণের মডেল ব্যবহার করা হবে) তবে এটি এখানে সম্ভব নয়।
CREATE TABLE Race
(
RaceID INT NOT NULL PRIMARY KEY,
RaceName VARCHAR(50) NOT NULL
);
CREATE TABLE Breed
(
BreedID INT NOT NULL PRIMARY KEY,
RaceID INT NOT NULL, -- FK to Race
BreedName VARCHAR(50)
);
ALTER TABLE Breed
ADD CONSTRAINT [UQ_Breed]
UNIQUE (RaceID, BreedID);
ALTER TABLE Breed
ADD CONSTRAINT [FK_Breed_Race]
FOREIGN KEY (RaceID)
REFERENCES Race (RaceID);
CREATE TABLE Animal2
(
AnimalID INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
RaceID INT NOT NULL, -- FK to Race, FK to Breed
BreedID INT NOT NULL, -- FK to Breed
Name VARCHAR(50)
-- other properties common to all "Animal" types
);
ALTER TABLE Animal2
ADD CONSTRAINT [FK_Animal2_Race]
FOREIGN KEY (RaceID)
REFERENCES Race (RaceID);
-- This FK points to the UNIQUE CONSTRAINT on Breed, _not_ to the PK!
ALTER TABLE Animal2
ADD CONSTRAINT [FK_Animal2_Breed]
FOREIGN KEY (RaceID, BreedID)
REFERENCES Breed (RaceID, BreedID);
CREATE TABLE AnimalCat2
(
AnimalID INT NOT NULL PRIMARY KEY, -- FK to Animal
HairColor VARCHAR(50) NOT NULL
);
ALTER TABLE AnimalCat2
ADD CONSTRAINT [FK_AnimalCat2_Animal2]
FOREIGN KEY (AnimalID)
REFERENCES Animal2 (AnimalID);
CREATE TABLE AnimalDog2
(
AnimalID INT NOT NULL PRIMARY KEY,
HairColor VARCHAR(50) NOT NULL
);
ALTER TABLE AnimalDog2
ADD CONSTRAINT [FK_AnimalDog2_Animal2]
FOREIGN KEY (AnimalID)
REFERENCES Animal2 (AnimalID);
চূড়ান্ত সম্পাদনা (আশা করি ;-)
- ধরনের মধ্যে অসম বৈশিষ্ট্য পরিচালনার সম্ভাবনা (এবং তারপর অসুবিধা) সংক্রান্ত
Breed
, এটা হল একই উপশ্রেণী / উত্তরাধিকার ধারণা কিন্তু চাকরী সম্ভব Breed
প্রধান সত্তা হিসেবে। এই সেট-আপে Breed
টেবিল বৈশিষ্ট্য সব ধরনের সাধারণ হবে Breed
(ঠিক মত Animal
টেবিল) এবং RaceID
ধরণ উপস্থাপনের Breed
(একই যেমন মধ্যে আছে Animal
টেবিল)। তারপরে আপনার কাছে সাবক্লাস টেবিল থাকবে যেমন BreedCat
, BreedDog
ইত্যাদি। ছোট প্রকল্পগুলির জন্য এটিকে "ওভার ইঞ্জিনিয়ারিং" হিসাবে বিবেচনা করা যেতে পারে তবে এটির দ্বারা উপকৃত হওয়া পরিস্থিতিগুলির বিকল্প হিসাবে এটি উল্লেখ করা হচ্ছে।
উভয় পদ্ধতির জন্য, এটি কখনও কখনও সম্পূর্ণ সংস্থাগুলির শর্ট-কাট হিসাবে ভিউ তৈরি করতে সহায়তা করে। উদাহরণস্বরূপ, বিবেচনা করুন:
CREATE VIEW Cats AS
SELECT an.AnimalID,
an.RaceID,
an.Name,
-- other "Animal" properties that are shared across "Race" types
cat.CatBreedID,
cat.HairColor
-- other "Cat"-specific properties as needed
FROM Animal an
INNER JOIN AnimalCat cat
ON cat.AnimalID = an.AnimalID
-- maybe add in JOIN(s) and field(s) for "Race" and/or "Breed"
- লজিক্যাল সত্তাগুলির অংশ না হয়েও, কমপক্ষে রেকর্ডগুলি সন্নিবেশ করা ও আপডেট করা হয় তখন তা কমপক্ষে উপলব্ধি করার জন্য টেবিলগুলিতে নিরীক্ষণের ক্ষেত্রগুলি রাখা মোটামুটি সাধারণ। ব্যবহারিক ক্ষেত্রে তাই:
- টেবিলে একটি
CreatedDate
ক্ষেত্র যুক্ত করা হবে Animal
। AnimalCat
উভয় টেবিলের জন্য সারি সন্নিবেশ করা হওয়ায় একটি লেনদেনের মধ্যে একই সময় করা উচিত বলে এই ক্ষেত্রটি কোনও সাবক্লাস টেবিলের (যেমন ) কোনও প্রয়োজন নেই ।
- একটি
LastModifiedDate
ক্ষেত্র Animal
টেবিল এবং সমস্ত সাবক্লাসের টেবিলগুলিতে যুক্ত হবে। এই ক্ষেত্রটি কেবলমাত্র সেই নির্দিষ্ট টেবিলটি আপডেট হলেই আপডেট হয়: যদি কোনও আপডেটের মধ্যে উপস্থিত হয় AnimalCat
তবে Animal
কোনও নির্দিষ্টটির জন্য না থাকে AnimalID
তবে কেবলমাত্র LastModifiedDate
ক্ষেত্রটি AnimalCat
সেট করা হবে।