Jak zaimplementować relacje jeden do jednego, jeden do wielu i wiele do wielu podczas projektowania tabel?
Czy ktoś może wyjaśnić jak zaimplementować relacje one-to-one, one-to-many I many-to-many przy projektowaniu tabel z przykładami?
3 answers
Jeden do jednego: Użyj klucza obcego do tabeli odniesienia:
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
Jeden do wielu: Użyj obcego klucza po wielu stronach relacji łączącej się z "jedną" stroną:
teachers: teacher_id, first_name, last_name # the "one" side
classes: class_id, class_name, teacher_id # the "many" side
Wiele do wielu : Użyj tabeli połączeń (przykład):
student: student_id, first_name, last_name
classes: class_id, name, teacher_id
student_classes: class_id, student_id # the junction table
Przykładowe zapytania:
-- 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-20 01:56:48
Oto kilka rzeczywistych przykładów dla typów relacji:
1:1
Relacja jest jedna do drugiej wtedy i tylko wtedy, gdy jeden rekord z tabeli a jest powiązany z maksymalnie jeden rekord w tabeli B.
Aby ustanowić relację jeden do jednego, klucz główny tabeli B (bez rekordu osieroconego) musi być kluczem wtórnym tabeli A (z rekordami osieroconymi).
Na przykład:
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:M
Związek jest jeden do wielu, jeśli i tylko wtedy, gdy jeden rekord z tabeli A jest odnosi się do jednego lub więcej rekordów w tabeli B. Jednak jeden rekord w tabeli B nie może być powiązany z Więcej jednym rekordem w tabeli A.
Aby ustanowić relację jeden do wielu, klucz podstawowy tabeli A (tabeli" jeden") musi być kluczem wtórnym tabeli B (tabeli" wiele").
Na przykład:
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
);
M: N
Relacja jest wiele do wielu wtedy i tylko wtedy, gdy jeden rekord z tabeli a jest powiązany z jednym lub większą liczbą rekordów w tabeli B i vice-versa.
Aby utworzyć relację wiele do wielu, Utwórz trzecią tabelę o nazwie " ClassStudentRelation" który będzie miał podstawowe klucze tabeli a i tabeli 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),
Statusvarchar2(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)
);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-28 04:25:47
Relacja jeden do jednego (1-1): Jest to relacja między kluczem podstawowym i obcym (klucz podstawowy odnoszący się do klucza obcego tylko jeden rekord). to jest związek jeden do jednego.
Relacja jeden do wielu (1-M): Jest to również relacja między kluczami podstawowymi i obcymi, ale tutaj klucz podstawowy odnoszący się do wielu rekordów (np. Tabela A ma informacje o książce, a Tabela B ma wielu wydawców jednej książki).
Many to Many (M-M): Many to many obejmuje dwa wymiary, wyjaśnione w pełni jak poniżej z próbką.
-- 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
)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-16 10:41:01