누구나 예제를 사용하여 테이블을 디자인하면서 일대일, 일대 다 및 다 대다 관계를 구현하는 방법을 설명 할 수 있습니까?
답변
일대일 : 참조 테이블에 외래 키를 사용하십시오.
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 : 1)
테이블 A의 하나의 레코드가 테이블 B의 최대 하나의 레코드와 관련되는 경우에만 관계가 일대일입니다.
일대일 관계를 설정하려면 테이블 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 : M)
테이블 A의 하나의 레코드가 테이블 B의 하나 이상의 레코드와 관련된 경우에만 관계가 일대 다입니다. 그러나 테이블 B의 하나의 레코드가 테이블 A의 하나 이상의 레코드와 관련 될 수는 없습니다.
일대 다 관계를 설정하려면 테이블 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
);
다 대다 (M : M)
테이블 A의 한 레코드가 테이블 B의 하나 이상의 레코드와 관련이 있고 그 반대의 경우에만 관계는 다 대다입니다.
다 대다 관계를 설정하려면 테이블 A와 테이블 B의 기본 키가있는 “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)
);
답변
이것은 매우 일반적인 질문이므로이 답변을 기사 로 전환하기로 결정했습니다 .
일대 다
일대 다 테이블 관계는 다음과 같습니다.
관계형 데이터베이스 시스템에서 일대 다 테이블 관계 는 부모 테이블 행 Foreign Key
을 참조하는 자식 의 열을 기준으로 두 테이블을 연결 Primary Key
합니다.
위 표 다이어그램에서 post_id
에서 열 post_comment
테이블이 갖는 Foreign Key
와 관계 post
테이블 아이디 Primary Key
칼럼 :
ALTER TABLE
post_comment
ADD CONSTRAINT
fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
1-1
일대일 테이블 관계는 다음과 같습니다.
관계형 데이터베이스 시스템에서 일대일 테이블 관계 는 상위 테이블 행 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
열 은 테이블 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
열 은 테이블 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
답변
일대일 관계 (1-1) :
기본 키와 외래 키 간의 관계입니다 (외래 키와 관련된 기본 키는 하나의 레코드 만). 이것은 일대일 관계입니다.
일대 다 (1-M) 관계 :
이것은 기본 키와 외래 키 관계 사이의 관계이지만 여기서는 여러 레코드와 관련된 기본 키입니다 (예 : 테이블 A에는 책 정보가 있고 테이블 B에는 한 권의 책이 여러 개 있습니다).
다 대다 (MM) : 다 대다 (2 대)에는 2 차원이 포함되어 있으며 샘플과 함께 아래에 자세히 설명되어 있습니다.
-- 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
)