टेबल डिजाइन करते समय एक-से-एक, एक-से-एक और कई-कई रिश्तों को कैसे लागू करें?


281

क्या कोई समझा सकता है कि कुछ उदाहरणों के साथ टेबल डिजाइन करते समय एक-से-एक, एक-से-एक और कई-कई रिश्तों को कैसे लागू किया जाए?


कार्यान्वयन लक्ष्य RDBMS के आधार पर अलग-अलग हो जाता है तो आप किस विक्रेता को लक्षित कर रहे हैं?
बिलिंक

1
यह एक होमवर्क सवाल नहीं है ... !! मैं एक साक्षात्कार की तैयारी कर रहा हूँ .. इसलिए यहाँ पूछने के लिए सोचा ... मैंने गुगली करने की कोशिश की, लेकिन किसी भी अच्छे लेख को नहीं ढूंढ पाया जहाँ मुझे ये सब एक में समझाया गया हो ... !!
शस्त्रागार

मैं oracle डेटाबेस को लक्षित कर रहा हूँ .. !!
शस्त्रागार

आप इस पोस्ट को भी पढ़ना चाह सकते हैं .... stevencalise.wordpress.com/2010/09/01/… मैं अंक 2 और 3 पर ध्यान देना चाहूँगा
tsells

3
@tsells कभी-कभी आपसे ऐसे प्रश्न पूछे जाते हैं जो आपके फिर से शुरू या सीधे नौकरी की आवश्यकताओं पर लागू नहीं होते हैं। मुझे उन लोगों की एक सूची दी गई थी जो मुझे एक कंपनी में साक्षात्कार देंगे, और एक एक डीबी विशेषज्ञ था। मेरे रिज्यूमे पर एसक्यूएल नहीं था, लेकिन मैंने कुछ सरल एसक्यूएल प्रश्नों पर ब्रश किया। इससे मदद मिली और मुझे काम मिल गया। मुझे बाद में पता चला, काम पर रखने वाले प्रबंधक चिंतित थे कि उम्मीदवार दबाव में कैसे प्रतिक्रिया देते हैं। क्या वे अपनी सीमा को स्वीकार करते हैं या अपने तरीके से नकली हैं? यदि वे अपनी सीमा स्वीकार करते हैं, तो क्या वे किसी भी तरह की कोशिश करते हैं या बहुत जल्द हार मान लेते हैं?
डग कथबरसन

जवाबों:


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
जब "लिंक बैक" वन-टू-वन रिलेशनशिप में उपयोगी हो, तो इसका अच्छा उदाहरण क्या है? स्पष्ट और संक्षिप्त उत्तर के लिए धन्यवाद।
dev_feed

1
@dev_feed डेटाबेस डिज़ाइन के संदर्भ में मुझे लाभकारी होने के लिए लिंक वापस दिखाई नहीं देता है, लेकिन लिंक के ऊपर के उदाहरण का उपयोग करके studentदिए गए a को खोजने में आसानी हो सकती है address
edhedges

@NullUserException हमें कई-कई-कई संबंधों के लिए 3 तालिकाओं की आवश्यकता है। यह दो-कई तालिकाओं द्वारा कई-कई संबंधों के लिए नहीं किया जाना चाहिए।

1
@ कोडी प्रत्येक student_classesपंक्ति में केवल एक-से-एक संबंध होना चाहिए। अगर studentAमें है classAऔर classB, फिर वहाँ में दो पंक्तियों होना चाहिए student_classes, जो रिश्ते के लिए एक।
NullUserException

11
एक से एक रिश्ते में, जुड़ने का क्षेत्र दोनों तालिकाओं में अद्वितीय होना चाहिए। यह एक मेज पर पीके की संभावना है जो विशिष्टता की गारंटी देता है, लेकिन इसे दूसरी तालिका पर एक अद्वितीय सूचकांक की आवश्यकता हो सकती है।
HLGEM

70

यहाँ रिश्तों के प्रकारों के कुछ वास्तविक दुनिया उदाहरण हैं:

एक-से-एक (1: 1)

एक संबंध एक-से-एक है अगर और केवल यदि तालिका ए से एक रिकॉर्ड तालिका बी में अधिकतम एक रिकॉर्ड से संबंधित है।

एक-से-एक संबंध स्थापित करने के लिए, तालिका B (अनाथ रिकॉर्ड के साथ) की प्राथमिक कुंजी तालिका A (अनाथ रिकॉर्ड के साथ) की द्वितीयक कुंजी होनी चाहिए।

उदाहरण के लिए:

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: एम)

एक संबंध एक-से-कई है यदि और केवल यदि तालिका ए से एक रिकॉर्ड तालिका बी में एक या अधिक रिकॉर्ड से संबंधित है। हालांकि, तालिका बी में एक रिकॉर्ड तालिका ए में एक से अधिक रिकॉर्ड से संबंधित नहीं हो सकता है।

एक-से-कई संबंध स्थापित करने के लिए, तालिका A की प्राथमिक कुंजी ("एक" तालिका) तालिका B ("कई" तालिका) की द्वितीयक कुंजी होनी चाहिए।

उदाहरण के लिए:

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" नामक एक तीसरी तालिका बनाएं जिसमें टेबल ए और टेबल बी दोनों की प्राथमिक कुंजी होगी।

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)
);

पहला उदाहरण: GID नंबर (6) और SGID नंबर (4), क्यों? SGID भी नहीं होना चाहिए (6)? और 2 उदाहरण संख्या (4) और संख्या (2) पर ...
obeliksz

@obeliksz नल हो सकते हैं?
मू गाय

आप M: N के अंत में UNIQUE (StudentID, ClassID) का उपयोग क्यों करेंगे?
स्ट्रिक्स २५

1
@ strix25 एक ही ClassStudentRelation पंक्ति बनाने में पुनरावृत्ति से बचने के लिए कई बार लागू करने के लिए, क्योंकि यदि आप यह सुनिश्चित नहीं करते हैं कि दोनों विदेशी कुंजी छात्र और ClassID अद्वितीय हैं, तो समान छात्र और ClassID के साथ एक नई पंक्ति बनाना बंद हो जाता है? जैसा कि वे ऊपर दिए गए कोड में अद्वितीय नहीं हैं। इसलिए आप इसे या तो ऊपर दिए गए कोड की तरह लागू करते हैं, या एक प्राथमिक कुंजी जोड़ते हैं जिसमें ClassStudentRelation में एक ही पंक्ति बनाने की पुनरावृत्ति से बचने के लिए छात्र और ClassID दोनों शामिल हैं।
फौड ब्यूक्रेडिन

1
डेटाबेस में @valik डेटा मौजूदा डेटा को संदर्भित करके काम करता है, और कई बार डेटा का एक ही टुकड़ा नहीं बना रहा है, आप ऐसा क्यों करेंगे? बेशक आपको नहीं करना है, अन्यथा यह कुशल नहीं है। इसे ध्यान में रखते हुए, आइए अपने उदाहरण पर वापस जाएं (जैम्स में जीव विज्ञान है और जीव विज्ञान के नाम हैं), निश्चित रूप से आप, डेटाबेस में पहले से मौजूद डेटा का एक और टुकड़ा बनाए बिना BUT कर सकते हैं। जब भी आप कोई संबंध बनाना चाहते हैं, तो आपको केवल पहले से मौजूद एक को संदर्भित करना होगा। मुझे आशा है कि मदद करता है :)
Fouad Boukredine

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का postतालिका आईडी Primary 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-M) संबंध: यह प्राथमिक और विदेशी कुंजी रिश्तों के बीच का संबंध भी है, लेकिन यहां कई अभिलेखों से संबंधित प्राथमिक कुंजी (यानी टेबल ए में पुस्तक की जानकारी है और टेबल बी में एक पुस्तक के कई प्रकाशक हैं)।

कई टू (एमएम): कई में कई में दो आयाम शामिल हैं, नमूने के साथ नीचे के रूप में पूरी तरह से समझाया गया है।

-- 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
बेहतर और अधिक स्पष्ट होता अगर आपने प्राथमिक कुंजी और विदेशी कुंजी बाधाओं को भी जोड़ा होता।
आशीष के गुप्ता
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.