Q1. 1:1 관계를 만드는 방법에 대해 SQL 문법으로 설명해 주세요.
개념
1:1 관계는 테이블 A의 레코드 하나가 테이블 B의 레코드 하나와만 정확히 매칭되는 관계다. (예: User와 UserProfile)
가장 일반적인 구현 방법은 두 테이블이 동일한 기본 키(Primary Key)를 공유하도록 하거나, 한 테이블의 외래 키(Foreign Key)에 UNIQUE 제약 조건을 추가하는 것이다.
더 명확한 방법은 두 테이블이 동일한 PK를 공유하는 것이다.
예시: Users 테이블과 UserProfiles 테이블
1. 먼저, 기준이 되는 Users 테이블을 만든다.
CREATE TABLE Users (
user_id INT PRIMARY KEY,
username VARCHAR(100) NOT NULL UNIQUE
-- 기타 사용자 기본 정보
);
2. 다음으로, UserProfiles 테이블을 만들 때 user_id를 Users 테이블의 user_id를 참조하는 FOREIGN KEY이면서 동시에 UserProfiles 테이블의 PRIMARY KEY로 지정한다.
CREATE TABLE UserProfiles (
user_id INT PRIMARY KEY, -- 이 테이블의 PK이자
full_name VARCHAR(100),
bio TEXT,
-- Users 테이블의 user_id를 참조하는 FK 설정
FOREIGN KEY (user_id) REFERENCES Users(user_id)
);
핵심: UserProfiles의 user_id가 PRIMARY KEY이므로 반드시 고유(Unique)해야 한다. 동시에 Users 테이블을 참조하는 FOREIGN KEY이기도 하므로, Users 테이블에 존재하는 user_id만 가질 수 있다. 이 두 가지 제약 조건이 결합되어 1:1 관계가 완성된다.
Q2. M:N 관계를 만드는 방법에 대해 SQL 문법으로 설명해 주세요.
개념
M:N 관계는 테이블 A의 레코드 하나가 테이블 B의 여러 레코드와 관계를 맺을 수 있고, 그 반대도 마찬가지인 관계다. (예: Students와 Courses)
M:N 관계는 두 테이블만으로는 직접 구현할 수 없으며, 두 테이블을 연결하는 중간 테이블(Junction Table 또는 Mapping Table)이 반드시 필요하다.
예시: Students 테이블과 Courses 테이블
1. Students 테이블을 만든다.
CREATE TABLE Students (
student_id INT PRIMARY KEY,
student_name VARCHAR(100) NOT NULL
);
2. Courses 테이블을 만든다.
CREATE TABLE Courses (
course_id INT PRIMARY KEY,
course_name VARCHAR(100) NOT NULL
);
3. 두 테이블을 연결할 중간 테이블 Enrollments (수강신청)를 만든다. 이 테이블은 두 테이블의 PK를 각각 FK로 받는다.
CREATE TABLE Enrollments (
student_id INT,
course_id INT,
-- 두 컬럼을 조합하여 복합 기본 키(Composite Primary Key)로 설정
PRIMARY KEY (student_id, course_id),
-- Students 테이블을 참조하는 FK
FOREIGN KEY (student_id) REFERENCES Students(student_id),
-- Courses 테이블을 참조하는 FK
FOREIGN KEY (course_id) REFERENCES Courses(course_id)
);
핵심: Enrollments 테이블은 어떤 학생(student_id)이 어떤 과목(course_id)을 수강하는지 매핑한다. (student_id, course_id) 조합 자체가 PRIMARY KEY이므로 “한 학생이 동일한 과목을 여러 번” 등록하는 중복을 방지한다.
- 한 학생(Student)은 여러
Enrollments레코드를 가질 수 있다. (여러 과목 수강) - 한 과목(Course)도 여러
Enrollments레코드를 가질 수 있다. (여러 학생이 수강)
