Qualcuno può spiegare come implementare relazioni uno a uno, uno a molti e molti a molti mentre si progettano tabelle con alcuni esempi?
Qualcuno può spiegare come implementare relazioni uno a uno, uno a molti e molti a molti mentre si progettano tabelle con alcuni esempi?
Risposte:
One-to-one: utilizzare una chiave esterna per la tabella di riferimento:
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
È inoltre necessario inserire un vincolo univoco nella colonna chiave esterna ( addess.student_id
) per evitare che più righe nella tabella figlio ( address
) siano correlate alla stessa riga nella tabella referenziata ( student
).
Uno-a-molti : usa una chiave esterna sul lato multiplo della relazione che ricollega al lato "uno":
teachers: teacher_id, first_name, last_name # the "one" side
classes: class_id, class_name, teacher_id # the "many" side
Many-to-many : utilizzare una tabella di giunzione ( esempio ):
student: student_id, first_name, last_name
classes: class_id, name, teacher_id
student_classes: class_id, student_id # the junction table
Query di esempio:
-- 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
student
dato address
.
student_classes
riga dovrebbe avere solo una relazione uno a uno. Se studentA
è in classA
e classB
, allora dovrebbero esserci due righe student_classes
, una per la quale relazione.
Ecco alcuni esempi reali dei tipi di relazioni:
Una relazione è uno a uno se e solo se un record della tabella A è correlato ad un massimo di un record nella tabella B.
Per stabilire una relazione uno a uno, la chiave primaria della tabella B (senza record orfani) deve essere la chiave secondaria della tabella A (con record orfani).
Per esempio:
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);
Una relazione è uno-a-molti se e solo se un record della tabella A è correlato a uno o più record della tabella B. Tuttavia, un record nella tabella B non può essere correlato a più di un record nella tabella A.
Per stabilire una relazione uno-a-molti, la chiave primaria della tabella A (la tabella "one") deve essere la chiave secondaria della tabella B (la tabella "many").
Per esempio:
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
);
Una relazione è molti-a-molti se e solo se un record della tabella A è correlato a uno o più record della tabella B e viceversa.
Per stabilire una relazione molti-a-molti, creare una terza tabella denominata "ClassStudentRelation" che avrà le chiavi primarie sia della tabella A che della tabella B.
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)
);
Questa è una domanda molto comune, quindi ho deciso di trasformare questa risposta in un articolo .
La relazione della tabella uno-a-molti ha il seguente aspetto:
In un sistema di database relazionale, una relazione da una a molte tabelle collega due tabelle basate su una Foreign Key
colonna nel figlio che fa riferimento alla Primary Key
riga della tabella padre.
Nel diagramma della tabella sopra, la post_id
colonna nella post_comment
tabella ha una Foreign Key
relazione con la colonna post
ID tabella Primary Key
:
ALTER TABLE
post_comment
ADD CONSTRAINT
fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
La relazione della tabella uno a uno ha il seguente aspetto:
In un sistema di database relazionale, una relazione di tabella uno a uno collega due tabelle basate su una Primary Key
colonna nel figlio che fa anche Foreign Key
riferimento alla Primary Key
riga della tabella padre.
Pertanto, possiamo dire che la tabella figlio condivide la Primary Key
con la tabella padre.
Nel diagramma della tabella sopra, la id
colonna nella post_details
tabella ha anche una Foreign Key
relazione con la colonna della post
tabella id
Primary Key
:
ALTER TABLE
post_details
ADD CONSTRAINT
fk_post_details_id
FOREIGN KEY (id) REFERENCES post
La relazione della tabella molti-a si presenta come segue:
In un sistema di database relazionale, una relazione di tabella molti-a-molti collega due tabelle padre tramite una tabella figlio che contiene due Foreign Key
colonne che fanno riferimento alle Primary Key
colonne delle due tabelle padre.
Nel diagramma della tabella sopra, la post_id
colonna nella post_tag
tabella ha anche una Foreign Key
relazione con la colonna post
ID tabella Primary Key
:
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_post_id
FOREIGN KEY (post_id) REFERENCES post
E, la tag_id
colonna nella post_tag
tabella ha una Foreign Key
relazione con la colonna tag
ID tabella Primary Key
:
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_tag_id
FOREIGN KEY (tag_id) REFERENCES tag
Relazione uno a uno (1-1): questa è la relazione tra chiave primaria ed esterna (chiave primaria relativa alla chiave esterna solo un record). questa è una relazione uno a uno.
Relazione uno-a-molti (1-M): questa è anche una relazione tra relazioni di chiavi primarie ed esterne, ma qui la chiave primaria relativa a più record (ovvero la tabella A contiene informazioni sul libro e la tabella B ha più editori di un libro).
Many to Many (MM): Many to many include due dimensioni, spiegate completamente come di seguito con un campione.
-- 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
)