Hoe implementeer je één-op-één, één-op-veel en veel-op-veel relaties tijdens het ontwerpen van tabellen?

Kan iemand uitleggen hoe je één-op-één, één-op-veel en veel-op-veel relaties implementeert tijdens het ontwerpen van tabellen met enkele voorbeelden?


Antwoord 1, autoriteit 100%

Een-op-een:gebruik een externe sleutel voor de tabel waarnaar wordt verwezen:

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

U moet ook een unieke beperking op de externe sleutelkolom (addess.student_id) plaatsen om te voorkomen dat meerdere rijen in de onderliggende tabel (address) betrekking hebben op hetzelfde rij in de tabel waarnaar wordt verwezen (student).

Een-op-veel: gebruik een externe sleutel aan de veelkant van de relatie die teruglinkt naar de “één”-kant:

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

Veel-op-veel: gebruik een verbindingstabel (voorbeeld):

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

Voorbeeldvragen:

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


Antwoord 2, Autoriteit 21%

Hier zijn enkele real-world voorbeelden van de soorten relaties:

één-op-één (1: 1)

Een relatie is een-op-één indien en alleen als een record van tabel A gerelateerd is aan een maximum van één record in tabel b.

Om een ​​een-op-één relatie tot stand te brengen, moet de primaire sleutel van tabel B (zonder weesrecord) de secundaire sleutel van tabel A (met weesrecords) zijn.

Bijvoorbeeld:

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

één-op-velen (1: m)

Een relatie is één-op-veel als en alleen als een record van tafel A is
gerelateerd aan een of meer records in tabel B. Een record in tabel B kan echter niet gerelateerd zijn aan meer dan één record in tabel a.

Om een ​​een-op-veel-relatie tot stand te brengen, moet de primaire sleutel van de tabel A (de “één” tabel) de secundaire sleutel van tabel B (de “vele” tabel) zijn.

Bijvoorbeeld:

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

Veel-op-veel (M: M)

Een relatie is veel-op-velen als en alleen als een record van tabel A gerelateerd is aan een of meer records in tabel B en vice-versa.

Maak een derde tabel met een derde tabel met de naam “ClassStudentrelation” die de primaire toetsen van zowel tafel A als tabel b.

heeft

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

Antwoord 3, Autoriteit 5%

één-op-veel

De een-op-vele tabelrelatie ziet er als volgt uit:

In een relationeel databasesysteem koppelt een one-to-vele tabelrelatie twee tabellen op basis van een Foreign Keykolom in het kind die verwijst naar de Primary Keyvan de ouder tafel rij.

In het bovenstaande tabeldiagram heeft de kolom post_idin de tabel post_commenteen Foreign Key-relatie met de posttabel id Primary Keykolom:

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

Eén-op-één

De één-op-één tabelrelatie ziet er als volgt uit:

In een relationeel databasesysteem koppelt een één-op-één tabelrelatie twee tabellen op basis van een Primary Key-kolom in de onderliggende kolom, die ook een Foreign Key-verwijzing is de Primary Keyvan de bovenliggende tabelrij.

Daarom kunnen we zeggen dat de onderliggende tabel de Primary Keydeelt met de bovenliggende tabel.

In het bovenstaande tabeldiagram heeft de kolom idin de tabel post_detailsook een Foreign Key-relatie met de posttabel idPrimary Keykolom:

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

Veel-op-veel

De veel-op-veel tabelrelatie ziet er als volgt uit:

In een relationeel databasesysteem verbindt een veel-op-veel-tabelrelatie twee bovenliggende tabellen via een onderliggende tabel die twee Foreign Key-kolommen bevat die verwijzen naar de Primary Key-kolommen van de twee bovenliggende tabellen.

In het bovenstaande tabeldiagram heeft de kolom post_idin de tabel post_tagook een Foreign Key-relatie met de posttabel id Primary Keykolom:

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

En de kolom tag_idin de tabel post_tagheeft een Foreign Key-relatie met de tabel-ID tagKolom Primary Key:

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

Antwoord 4

Een-op-een (1-1) relatie:
Dit is de relatie tussen primaire & externe sleutel (primaire sleutel die betrekking heeft op externe sleutel slechts één record). dit is een een-op-een relatie.

Een-op-veel (1-M) relatie:
Dit is ook de relatie tussen primaire & relaties met externe sleutels, maar hier primaire sleutel met betrekking tot meerdere records (d.w.z. Tabel A heeft boekinfo en Tabel B heeft meerdere uitgevers van één boek).

Veel tot veel (M-M):Veel tot veel omvat twee dimensies, volledig uitgelegd zoals hieronder met voorbeeld.

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

Other episodes