টেবিলগুলি ডিজাইন করার সময় কীভাবে একের মধ্যে এক, একের মধ্যে অনেকগুলি এবং বহু থেকে বহু সম্পর্ককে কার্যকর করা যায়?


281

কেউ উদাহরণস্বরূপ টেবিলগুলি ডিজাইনের সময় কীভাবে ওয়ান-টু-ওয়ান, এক-থেকে-বহু এবং বহু-বহু সম্পর্কের বাস্তবায়ন করবেন তা ব্যাখ্যা করতে পারেন?


বাস্তবায়ন লক্ষ্য আরডিবিএমএসের ভিত্তিতে পরিবর্তিত হতে থাকে তাই আপনি কোন বিক্রেতাকে টার্গেট করছেন?
বিলিংক

1
এটা কোনও হোমওয়ার্কের প্রশ্ন নয় ... !! আমি একটি সাক্ষাত্কারের জন্য প্রস্তুতি নিচ্ছি .. তাই এখানে জিজ্ঞাসা করার জন্য ভেবেছিলাম ... আমি গুগল করার চেষ্টা করেছি তবে কোনও ভাল নিবন্ধ পাইনি যেখানে এই সমস্তগুলিকে একটিতে ব্যাখ্যা করা হয়েছে ... !!
অস্ত্রাগার

আমি ওরাকল ডাটাবেসকে টার্গেট করছি .. !!
অস্ত্রাগার

আপনি এই পোস্টটিও পড়তে চাইতে পারেন .... স্টিভেনক্যালাইজ.ওয়ার্ডপ্রেস /২০১০ / ০৯ / ২০১১ / ২ আমি পয়েন্ট 2 এবং 3 এর দিকে গভীর মনোযোগ
দেব

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

উত্তর:


478

এক-এক: রেফারেন্স টেবিলের জন্য একটি বিদেশী কী ব্যবহার করুন:

student: student_id, first_name, last_name, address_id
address: address_id, address, city, zipcode, student_id # you can have a
                                                        # "link back" if you need

রেফারেন্স সারণিতে ( ) সারণীতে একই সারির সাথে addess.student_idএকাধিক সারি বাধা দেওয়ার জন্য আপনাকে বিদেশী কী কলামে ( ) বিদেশী কী কলামে ( ) addressচাপাতে হবে student

এক-একাধিক : "এক" পাশের সাথে সংযুক্ত সম্পর্কের অনেক দিকে বিদেশী কী ব্যবহার করুন:

teachers: teacher_id, first_name, last_name # the "one" side
classes:  class_id, class_name, teacher_id  # the "many" side

অনেকগুলি থেকে বহু : একটি জংশন সারণী ব্যবহার করুন ( উদাহরণস্বরূপ ):

student: student_id, first_name, last_name
classes: class_id, name, teacher_id
student_classes: class_id, student_id     # the junction table

উদাহরণ কোয়েরি:

 -- Getting all students for a class:

    SELECT s.student_id, last_name
      FROM student_classes sc 
INNER JOIN students s ON s.student_id = sc.student_id
     WHERE sc.class_id = X

 -- Getting all classes for a student: 

    SELECT c.class_id, name
      FROM student_classes sc 
INNER JOIN classes c ON c.class_id = sc.class_id
     WHERE sc.student_id = Y


1
ওয়ান-টু-ওয়ান সম্পর্কের ক্ষেত্রে "লিঙ্ক ব্যাক" কার্যকর হলে এর উত্তম উদাহরণ কী? পরিষ্কার এবং সংক্ষিপ্ত উত্তরের জন্য ধন্যবাদ।
ডেভ_ফিড

1
@ দেব_ফিড ডেটাবেস ডিজাইনের ক্ষেত্রে আমি লিঙ্কটি পিছনে উপকারী হতে দেখছি না, তবে উপরে লিঙ্কটির উপরের উদাহরণটি ব্যবহার করা একটি studentপ্রদত্ত একটি সন্ধান সহজতর করতে পারে address

@ নল ইউজারএক্সেপশন-এর অনেকগুলি-বহু সম্পর্কের জন্য আমাদের অবশ্যই 3 টি টেবিলের প্রয়োজন .c এটি বহু টু-বহু সম্পর্কের দুটি টেবিলের মাধ্যমে করা সম্ভব নয়।

1
@ কোডি প্রতিটি student_classesসারিতে কেবলমাত্র এক-এক-এক সম্পর্ক থাকা উচিত। যদি studentAথাকে classAএবং classBতবে তারপরে দুটি সারি থাকা উচিত student_classes, একটি সম্পর্কের জন্য।
নাল ইউজারএক্সেপশন

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

70

সম্পর্কের ধরণের কয়েকটি বাস্তব-বিশ্বের উদাহরণ এখানে রয়েছে:

এক-থেকে-এক (1: 1)

টেবিল এ থেকে একটি রেকর্ড সারণী বিতে সর্বাধিক এক রেকর্ডের সাথে সম্পর্কিত হলে কেবল একটি সম্পর্ক একের সাথে এক হয় and

এক থেকে একের সম্পর্ক স্থাপন করতে, টেবিল বিয়ের প্রাথমিক কীটি (অনাথ রেকর্ডবিহীন) অবশ্যই টেবিল এ-এর মাধ্যমিক কী (এতিম রেকর্ড সহ) হতে হবে।

উদাহরণ স্বরূপ:

CREATE TABLE Gov(
    GID number(6) PRIMARY KEY, 
    Name varchar2(25), 
    Address varchar2(30), 
    TermBegin date,
    TermEnd date
); 

CREATE TABLE State(
    SID number(3) PRIMARY KEY,
    StateName varchar2(15),
    Population number(10),
    SGID Number(4) REFERENCES Gov(GID), 
    CONSTRAINT GOV_SDID UNIQUE (SGID)
);

INSERT INTO gov(GID, Name, Address, TermBegin) 
values(110, 'Bob', '123 Any St', '1-Jan-2009');

INSERT INTO STATE values(111, 'Virginia', 2000000, 110);

এক-থেকে-বহু (1: এম)

টেবিল এ থেকে একটি রেকর্ড যদি টেবিল বিতে এক বা একাধিক রেকর্ডের সাথে সম্পর্কিত হয় তবে কেবল একের সাথে একের বেশি সম্পর্ক থাকে তবে, টেবিল বিতে একটি রেকর্ড সারণী এ এর ​​একাধিক রেকর্ডের সাথে সম্পর্কিত হতে পারে না table

এক থেকে বহু সম্পর্ক স্থাপনের জন্য, টেবিল এ এর ​​প্রাথমিক কীটি ("একটি" টেবিল) অবশ্যই টেবিল বিয়ের "দ্বিতীয়" টেবিলের মাধ্যমিক কী হতে হবে।

উদাহরণ স্বরূপ:

CREATE TABLE Vendor(
    VendorNumber number(4) PRIMARY KEY,
    Name varchar2(20),
    Address varchar2(20),
    City varchar2(15),
    Street varchar2(2),
    ZipCode varchar2(10),
    Contact varchar2(16),
    PhoneNumber varchar2(12),
    Status varchar2(8),
    StampDate date
);

CREATE TABLE Inventory(
    Item varchar2(6) PRIMARY KEY,
    Description varchar2(30),
    CurrentQuantity number(4) NOT NULL,
    VendorNumber number(2) REFERENCES Vendor(VendorNumber),
    ReorderQuantity number(3) NOT NULL
);

বহু-থেকে-বহু (এম: এম)

টেবিল এ থেকে একটি রেকর্ড যদি টেবিল বি এবং তদ্বিপরীত বিপরীতে এক বা একাধিক রেকর্ডের সাথে সম্পর্কিত হয় তবে কেবল একটি সম্পর্ক অনেকগুলি থেকে বেশি।

অনেকগুলি থেকে অনেকের সম্পর্ক স্থাপনের জন্য, "ClassStudentRelation" নামে একটি তৃতীয় সারণী তৈরি করুন যার টেবিল A ​​এবং টেবিল বি উভয়ের প্রাথমিক কী থাকবে

CREATE TABLE Class(
    ClassID varchar2(10) PRIMARY KEY, 
    Title varchar2(30),
    Instructor varchar2(30), 
    Day varchar2(15), 
    Time varchar2(10)
);

CREATE TABLE Student(
    StudentID varchar2(15) PRIMARY KEY, 
    Name varchar2(35),
    Major varchar2(35), 
    ClassYear varchar2(10), 
    Status varchar2(10)
);  

CREATE TABLE ClassStudentRelation(
    StudentID varchar2(15) NOT NULL,
    ClassID varchar2(14) NOT NULL,
    FOREIGN KEY (StudentID) REFERENCES Student(StudentID), 
    FOREIGN KEY (ClassID) REFERENCES Class(ClassID),
    UNIQUE (StudentID, ClassID)
);

1 ম উদাহরণ: জিআইডি নম্বর (6) এবং এসজিআইডি নম্বর (4), কেন? এসজিআইডিও হওয়া উচিত নয় (6)? এবং ২ য় উদাহরণ নম্বর (4) এবং সংখ্যা (2) ...
obeliksz

@obeliksz নালাগুলি হতে পারে?
moo

এম: এন শেষে আপনি কেন ইউনিক (স্টুডেন্টআইডি, ক্লাসআইডি) ব্যবহার করবেন?
strix25

1
@ স্ট্রাইক 25 একই ক্লাসস্টুডেন্টলেশন সারিটি একাধিকবার তৈরি করার ক্ষেত্রে পুনরাবৃত্তি এড়াতে বাধ্য করা, কারণ আপনি যদি নিশ্চিত করেন না যে স্টুডেন্টআইডি এবং ক্লাসআইডি উভয়ই কী একই স্টুডেন্টআইডি এবং ক্লাসআইডি দিয়ে একটি নতুন সারি তৈরি করা বন্ধ করে দেয়? কারণ তারা উপরের কোডটিতে অনন্য নয়। সুতরাং আপনি হয় উপরের কোডের মতো এটি বাস্তবায়ন করুন, বা ক্লাস স্টুডেন্টরিলেশনে একই সারি তৈরির পুনরাবৃত্তি এড়াতে স্টুডেন্টআইডি এবং ক্লাসআইডি উভয়কেই অন্তর্ভুক্ত করে এমন একটি প্রাথমিক কী যুক্ত করুন।
ফুয়াদ বাউক্রেডাইন

1
ডাটাবেসে @ ওয়ালিক ডেটা বিদ্যমান ডাটাগুলিকে উল্লেখ করে এবং একাধিকবার একই টুকরো ডেটা তৈরি না করে কাজ করে কেন আপনি তা করবেন? অবশ্যই আপনার দরকার নেই, অন্যথায় এটি দক্ষ নয়। এই বিষয়টি মাথায় রেখে, আসুন আপনার উদাহরণে ফিরে আসুন (জেমসের জীববিজ্ঞান রয়েছে এবং জীববিদ্যায় জেমস রয়েছে), অবশ্যই আপনি পারেন, তবে ইতিমধ্যে ডাটাবেসে থাকা অন্য একটি টুকরো ডেটা তৈরি না করেই পারেন। আপনাকে যা করতে হবে তা হ'ল যখনই আপনি কোনও সম্পর্ক তৈরি করতে চান কেবল ইতিমধ্যে বিদ্যমানটিকে উল্লেখ করুন। আমি আশা করি এটি সাহায্য করে :)
ফুয়াদ বোকারডাইন

8

এটি একটি খুব সাধারণ প্রশ্ন, তাই আমি এই উত্তরটি একটি নিবন্ধে পরিণত করার সিদ্ধান্ত নিয়েছি ।

এক থেকে অনেক

একের সাথে একাধিক টেবিলের সম্পর্কটি নীচে দেখায়:

এক থেকে অনেক

একটি রিলেশনাল ডাটাবেস সিস্টেমে, এক-একাধিক টেবিলের সম্পর্কটি Foreign Keyসন্তানের কলামের উপর ভিত্তি করে দুটি টেবিলের লিঙ্ক করে যা উল্লেখ করেPrimary Key পিতামাতার সারণির সারিটির ।

উপরের টেবিলের চিত্রটিতে, টেবিলের post_idকলামটির সাথে টেবিল আইডি কলামের post_commentএকটি Foreign Keyসম্পর্ক রয়েছে :postPrimary Key

ALTER TABLE
    post_comment
ADD CONSTRAINT
    fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post

একের পর এক

একের সাথে এক টেবিলের সম্পর্কটি নীচে দেখায়:

একের পর এক

একটি রিলেশনাল ডাটাবেস সিস্টেমে, এক-এক-এক টেবিলের সম্পর্ক Primary Keyসন্তানের কলামের উপর ভিত্তি করে দুটি টেবিলের সাথে লিঙ্ক করে যা এটিও একটি Foreign Keyরেফারেন্সিংPrimary Key পিতামাতার সারণির সারিটির ।

অতএব, আমরা বলতে পারি যে শিশু টেবিলটি ভাগ করে দেয় Primary Key পিতামাতার টেবিলে ।

উপরে টেবিল ডায়াগ্রাম সালে idকলাম post_detailsটেবিল একটি হয়েছে Foreign Keyসঙ্গে সম্পর্ক postটেবিল id Primary Keyকলাম:

ALTER TABLE
    post_details
ADD CONSTRAINT
    fk_post_details_id
FOREIGN KEY (id) REFERENCES post

অনেক সাথে অধিকের

বহু থেকে বহু টেবিলের সম্পর্কটি নীচের মত দেখাচ্ছে:

অনেক সাথে অধিকের

রিলেশনাল ডেটাবেস সিস্টেমে, অনেকগুলি টু টেবিলের সম্পর্কটি একটি শিশু টেবিলের মাধ্যমে দুটি প্যারেন্ট টেবিলের সাথে লিঙ্ক করে যা দুটি পিতামাতার সারণীর Foreign Keyকলামগুলিকে উল্লেখ করে দুটি কলাম ধারণ Primary Keyকরে।

উপরের টেবিলের চিত্রটিতে, টেবিলের post_idকলামটির সাথে টেবিল আইডি কলামেরও post_tagএকটি Foreign Keyসম্পর্ক রয়েছে :postPrimary Key

ALTER TABLE
    post_tag
ADD CONSTRAINT
    fk_post_tag_post_id
FOREIGN KEY (post_id) REFERENCES post

এবং, tag_idকলাম post_tagটেবিল একটি হয়েছে Foreign Keyসঙ্গে সম্পর্ক tagটেবিল আইডি Primary Keyকলাম:

ALTER TABLE
    post_tag
ADD CONSTRAINT
    fk_post_tag_tag_id
FOREIGN KEY (tag_id) REFERENCES tag

3

এক থেকে এক (1-1) সম্পর্ক: এটি প্রাথমিক এবং বিদেশী কী (বিদেশী কী কেবল একটি রেকর্ড সম্পর্কিত প্রাথমিক কী ) এর মধ্যে সম্পর্ক । এটি এক সম্পর্ক।

একের সাথে অনেকের (1-এম) সম্পর্ক: এটি প্রাথমিক ও বিদেশী কীগুলির সম্পর্কের মধ্যেও সম্পর্ক তবে এখানে একাধিক রেকর্ড সম্পর্কিত প্রাথমিক কী (যেমন টেবিল এ-তে বইয়ের তথ্য রয়েছে এবং সারণী বিতে একটি বইয়ের একাধিক প্রকাশক রয়েছে)।

অনেকের মধ্যে অনেকের (এমএম): অনেকের মধ্যে দুটি মাত্রা অন্তর্ভুক্ত থাকে, যা নমুনা সহ নীচে পুরোপুরি ব্যাখ্যা করা হয়।

-- This table will hold our phone calls.
CREATE TABLE dbo.PhoneCalls
(
   ID INT IDENTITY(1, 1) NOT NULL,
   CallTime DATETIME NOT NULL DEFAULT GETDATE(),
   CallerPhoneNumber CHAR(10) NOT NULL
)
-- This table will hold our "tickets" (or cases).
CREATE TABLE dbo.Tickets
(
   ID INT IDENTITY(1, 1) NOT NULL,
   CreatedTime DATETIME NOT NULL DEFAULT GETDATE(),
   Subject VARCHAR(250) NOT NULL,
   Notes VARCHAR(8000) NOT NULL,
   Completed BIT NOT NULL DEFAULT 0
)
-- This table will link a phone call with a ticket.
CREATE TABLE dbo.PhoneCalls_Tickets
(
   PhoneCallID INT NOT NULL,
   TicketID INT NOT NULL
)

8
আপনি যদি প্রাথমিক কী এবং বিদেশী কী বাধাও যুক্ত করে থাকেন তবে আরও ভাল এবং আরও পরিষ্কার হত।
আশীষ কে গুপ্ত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.