위클리 페이퍼 18주차 정리

코드잇
이 글은 읽는데 약 4분이 걸립니다.

Q1. 1:1 관계를 만드는 방법에 대해 SQL 문법으로 설명해 주세요.

개념

1:1 관계는 테이블 A의 레코드 하나가 테이블 B의 레코드 하나와만 정확히 매칭되는 관계다. (예: UserUserProfile)

가장 일반적인 구현 방법은 두 테이블이 동일한 기본 키(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_idUsers 테이블의 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)
    );

    핵심: UserProfilesuser_idPRIMARY KEY이므로 반드시 고유(Unique)해야 한다. 동시에 Users 테이블을 참조하는 FOREIGN KEY이기도 하므로, Users 테이블에 존재하는 user_id만 가질 수 있다. 이 두 가지 제약 조건이 결합되어 1:1 관계가 완성된다.


    Q2. M:N 관계를 만드는 방법에 대해 SQL 문법으로 설명해 주세요.

    개념

    M:N 관계는 테이블 A의 레코드 하나가 테이블 B의 여러 레코드와 관계를 맺을 수 있고, 그 반대도 마찬가지인 관계다. (예: StudentsCourses)

    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 레코드를 가질 수 있다. (여러 학생이 수강)