2011-09-04 8 views
127

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

+0

कार्यान्वयन आरडीबीएमएस लक्ष्य के आधार पर अलग-अलग होता है तो आप किस विक्रेता को लक्षित कर रहे हैं? – billinkc

+0

कि एक होमवर्क सवाल नहीं है ... !! मैं एक साक्षात्कार की तैयारी कर रहा हूं .. तो यहां पूछने के लिए सोचा ... मैंने गुगल करने की कोशिश की लेकिन मुझे कोई अच्छा लेख नहीं मिला जहां मुझे ये सब एक समझाया गया ... !! – ferhan

+0

मैं ऑरैकल डेटाबेस को लक्षित कर रहा हूं .. !! – ferhan

उत्तर

257

एक-से-एक:

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 

एक-से-कई: संदर्भित तालिका के लिए एक विदेशी कुंजी का उपयोग करें रिश्ते को वापस जोड़ने के कई पक्ष पर एक विदेशी कुंजी का उपयोग करें "एक" की ओर:

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

कई-से-अनेक:

: एक जंक्शन तालिका ( example) का उपयोग करें
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

एक-से-एक संबंध में "लिंक बैक" उपयोगी होने का एक अच्छा उदाहरण क्या है? स्पष्ट और संक्षिप्त उत्तर के लिए धन्यवाद। –

+0

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

+0

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

12

उदाहरण थोड़ा मेरे लिए अजीब है। तो, एक छात्र के पास कई पते नहीं हो सकते हैं? हकीकत में यह कर सकते हैं। मैं एक असली दुनिया उदाहरण लगता है, रिश्ते के तीन प्रकार के लिए, लेख मैंने लिखा के अनुसार, इस प्रकार है:

1: 1

एक रिश्ता एक यदि और केवल यदि एक रिकॉर्ड करने के लिए एक है से तालिका A एक मेज बी में एक रिकॉर्ड की एक अधिकतम से संबंधित है

एक एक के बाद एक के लिए संबंध, टेबल बी (कोई अनाथ रिकॉर्ड के साथ) की प्राथमिक कुंजी स्थापित करने के लिए माध्यमिक कुंजी होना चाहिए तालिका ए (ऑर्फ़ के साथ एक रिकार्ड)

उदाहरण:

Create table Gov(GID number(6) primary key, 
Name varchar2(25), Address VarCHAR2(30), 
Term_begin date,Term_end Date); 


Create table State(SID number(3) primary key, 
State_name varchar2(15), Population number(10), 
SGID Number(4) references GOV(GID), 
CONSTRAINT GOV_SDID UNIQUE (SGID)); 

insert into gov(GID, Name, Address, term_begin) 
values(110, 'Bob', '123 any st', '1-Jan-2009'); 

insert into state values(111, 'Virginia', 
2000000, 110); 

1: M

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

कई रिश्ते में एक स्थापित करने के लिए, तालिका ए (एक तालिका) की प्राथमिक कुंजी तालिका बी (कई टैब) की माध्यमिक कुंजी होना चाहिए।

create table vendor1 (vendor_no number(4) primary key, 
name varchar2(20), address varchar2(20), city  varchar2(15), st varchar2(2), zip varchar2(10), contact varchar2(16), phone_no varchar2(12), status varchar2(8), 
stamp_date  date); 

create table inventory1 (item varchar2(6) primary key, 
description varchar2(30), quantity_on_hand number(4) not null, 
vendor_no number(2) references vendor1(vendor_no), 
reorder_qty number(3) not null); 

एक रिश्ता कई करने के लिए कई है अगर और तालिका A से एक रिकॉर्ड एक या अधिक रिकॉर्ड से संबंधित है ही अगर में एक टेबल बी और उपाध्यक्ष प्रतिकूल।

कई रिश्ते के लिए कई स्थापित करने के लिए, एक तिहाई तालिका बुलाया "संबंध" जो दोनों टेबल्स एक के प्राथमिक कुंजी और बी

Create table Class (ClsID varchar2(10) primary Key, 
    title Varchar2(30), 
    Instructor Varchar2(30), 
    Day Varchar2(15), 
    time Varchar2(10)); 

Create table Student (StudID varchar2(15) primary Key, 
    Name Varchar2(35), 
    Major Varchar2(35), 
    Classyr Varchar2(10), 
    Status Varchar2(10)); 

Create table Stud_class (studid Varchar2 (15) not null, 
ClsId varchar2 (14) not null, 
Foreign key (Studid) references Student(Studid), 
Foreign key (ClsId) references Class(ClsID), 
UNIQUE (Studid,ClsID)); 
2

एक के लिए एक होगा बनाएँ (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 
) 
+2

यदि आपने प्राथमिक कुंजी और विदेशी कुंजी बाधाओं को भी जोड़ा है तो बेहतर और अधिक स्पष्ट होगा। –

संबंधित मुद्दे