관계 차수란? - 15

목차

    관계 차수란?  - 15

    1.  관계 차수란? 

    관계 차수(Relation Degree)는 관계형 데이터베이스에서 사용되는 용어로 테이블 간의 관계를 설명할 때는 '일대일', '일대다', '다대다' 같은 관계를 설명하는 용어이다.

     

    혼동하지 말자.

    1. 테이블 차수 - 테이블 내의 컬럼 수.
    2. 관계 차수 - 두 테이블 간의 관계의 복잡성(예: 일대일, 일대다, 다대다).

    2. 테이블 간 관계의 유형

    1:1 관계 (One-to-One Relationship)

    • 두 개의 테이블에서 각각 하나의 레코드가 서로 직접 매칭되는 관계이다.
    • 이 관계는 보통 서로 다른 테이블의 기본키와 외래키를 사용하여 연결한다.
    • 예: 사용자 테이블과 사용자 상세 정보 테이블, 여기서 각 사용자는 상세 정보와 정확히 하나씩 연결된다.
    • 예: 사람과 여권, 사람을 나타내는 Persons 테이블과 여권 정보를 나타내는 Passports 테이블이 있다.

    1:N 관계 (One-to-Many Relationship)

    • 한 테이블의 하나의 레코드가 다른 테이블의 여러 레코드와 매칭된다.
    • 이 관계는 주로 한 테이블의 기본키가 다른 테이블의 외래키로 사용되어 연결된다.
    • 예: 고객 테이블의 각 고객이 여러 주문 레코드와 연결되는 경우 (고객이 여러 주문을 가짐).

    N:1 관계 (Many-to-One Relationship)

    • 다수의 레코드가 한 테이블의 단일 레코드와 매칭되는 관계.
    • 이는 1:N 관계의 반대 개념이며, 구현 방식은 동일.
    • 예: 여러 주문이 하나의 고객에게 속하는 경우.

    N:M 관계 (Many-to-Many Relationship)

    • 두 테이블 간에 다수의 레코드가 서로 매칭된다.
    • 이 관계를 구현하기 위해 보통 중간 연결 테이블을 사용하여 각 테이블의 레코드를 연결한다.
    • 연결 테이블은 각 테이블의 기본키를 외래키로 포함하며, 이들 외래키의 조합이 중간 테이블의 기본키가 되기도 한다.
    • 예: 학생과 수업 테이블, 여기서 한 학생이 여러 수업을 듣고, 하나의 수업에 여러 학생이 등록될 수 있다.

    3. 1:1 예제

    사용자 테이블(tb_user)과 사용자 상세 정보 테이블(tb_user_details)의 구조 만들어 보기

     

    tb_user

    컬럼명 데이터 타입 설명
    user_id INT 사용자의 고유 식별자, 기본키
    username VARCHAR(50) 사용자명
    password VARCHAR(50) 비밀번호

     

    tb_user_details

    컬럼명 데이터  타입 설명
    details_id INT 상세 정보의 고유 식별자, 기본키
    user_id INT 사용자 ID, 외래키
    address VARCHAR(100) 주소
    phone_number VARCHAR(15) 전화번호
    email VARCHAR(50) 이메일

    샘플 데이터

    tb_user

    +---------+----------+----------+
    | user_id | username | password |
    +---------+----------+----------+
    | 1       | 김영희   | pass123  |
    | 2       | 이철수   | pass456  |
    +---------+----------+----------+

    tb_user_details

    +------------+---------+----------------+--------------+-----------------------+
    | details_id | user_id | address        | phone_number | email                 |
    +------------+---------+----------------+--------------+-----------------------+
    | 1          | 1       | 서울시 강남구   | 010-1234-5678| younghee@example.com  |
    | 2          | 2       | 부산시 해운대구 | 010-8765-4321| cheolsu@example.com   |
    +------------+---------+----------------+--------------+------------------------+

    테이블 생성 쿼리 ( 기본키와 외래키 설정)

    create table TB_USER(
    	user_id int auto_increment,
        username varchar(50) not null,
        password varchar(50) not null,
        primary key(user_id)
    );
    
    create table tb_user_details(
    	details_id int auto_increment,
        user_id int unique,
    	address varchar(100),
        phone_number varchar(15),
        email varchar(50),
        primary key(details_id),
        foreign key(user_id) references tb_user(user_id)
    );

    4. N : 1 예제

    야구 선수와 야구팀에 관계 차수은 어떻게 될까?
    야구 선수 테이블과 야구팀에 테이블에 관계는?

     

    tb_team 테이블 구조

    컬럼명 데이터 타입 설명
    team_id INT 팀의 고유 식별자, 기본키
    team_name VARCHAR 팀의 이름
    home_city VARCHAR 팀의 홈 도시
    established_year YEAR 팀의 창단 연도

     

    tb_player 테이블 구조

    컬럼명  데이터  타입 설명
    player_id INT 선수의 고유 식별자, 기본키
    player_name VARCHAR 선수의 이름
    position VARCHAR 선수의 포지션
    birth_date DATE 선수의 생년월일
    team_id INT 선수가 속한 팀의 ID, 외래키
    관계 차수 
    외래키는 누가 가지고 있어야 할까???   
    
           N                     :                1
         야구 선수                            야구 팀 
    1  / 홍 / 30 / 롯데                1 /  롯데  / 창립 년도 
    2  / 김 / 21 / 롯데                2 /  해태  / 창립 년도 
    3  / 나 / 29 / 해태                3 /  기아  / 창립 년도 
    4  / 박 / 25 / 넥센                4 /  넥센  / 창립 년도  
    5  / 이 / 19 / 기아 
    6  / 최 / 27 / 넥센

     

    관계의 방향성을 명확히 하기

    • 한 팀은 여러명의 선수를 가질 수 있다, 한 선수는 한 팀에만 속할 수 있다.
    • 한 팀은 여러명의 선수 → 1 : N,     팀 : 선수 == 1 : N
    • 한 선수는 하나의 팀 → N : 1,        선수 : 팀 == N : 1

    tb_team

    +---------+--------------+-----------+----------------+
    | team_id | team_name    | home_city | established_year|
    +---------+--------------+-----------+----------------+
    | 1       | 서울 타이거즈 | 서울       | 1982           |
    | 2       | 부산 베어스   | 부산       | 1976           |
    +---------+--------------+-----------+----------------+

     

    tb_player

    +-----------+--------------+-----------+------------+---------+
    | player_id | player_name  | position  | birth_date | team_id |
    +-----------+--------------+-----------+------------+---------+
    | 1         | 김민          | 투수       | 1990-05-15 | 1       |
    | 2         | 이진          | 포수       | 1988-08-25 | 1       |
    | 3         | 최영          | 외야수     | 1992-03-30 | 2       |
    +-----------+--------------+-----------+------------+---------+

    5. N : N 예제

    학생과 수업 테이블은 관계 차수가 어떻게 될까?
    학생과 수업테이블은 하나의 학생이 여러개 수업을 들을 수 있다. 하나의 수업에 여러명에 학생이 등록 될 수 있다.

    N:M 관계가 형성이 된다.

    N:M 관계는 각 엔티티의 인스턴스가 다수의 인스턴스와 연결이 될 수 있기 때문에, 두 엔티티 간에 직접적인 링크를 만들거나 표현하기는 거의 불가능하다.

    해결 방법은 - 중간 테이블 설계해서 관계를 표현할 수 있다.

     

    tb_student

    컬럼명  데이터 타입 설명
    student_id int 학생의 고유 식별자, 기본키
    student_name VARCHAR(100) 학생의 이름

     

    tb_class

    컬럼명  데이터 타입 설명
    class_id INT 수업에 고유 식별자, 기본키
    class_name VARCHAR(100) 수업에 이름
    teacher VARCHAR(100) 강사의 이름

     

    수강등록

    tb_registration

    컬럼명  데이터 타입 설명
    student_id INT 학생 ID, 외래키
    class_id INT 수업 ID, 외래키
    date DATE 등록 날짜

    테이블 생성 쿼리

    create database mydb2;
    use mydb2;
    
    create table tb_student(
    	student_id int auto_increment primary key,
        student_name varchar(100) not null
    );
    
    create table tb_class(
    	class_id int auto_increment,
        class_name varchar(100) not null,
        teacher varchar(20) not null,
        primary key(class_id)
    );
    
    -- 학생과 수업 테이블 N:M 관계가 형성된다.
    -- 중간 테이블 설계 (수강등록 테이블)
    
    create table tb_registration(
    	student_id int,
        class_id int,
        registration_date date,
        primary key(student_id, class_id),
        foreign key(student_id) references tb_student(student_id),
        foreign key(class_id) references tb_class(class_id)
    );
    desc tb_registration;

    MySQL 기본 목차로 돌아가기

     

    'MySQL > 정리' 카테고리의 다른 글

    테이블 복사 및 데이터 추가 - 17  (0) 2024.06.05
    MySQL JOIN - 16  (1) 2024.06.05
    연습 문제 1 - 14  (0) 2024.06.04
    MySQL에서 인덱스(index)란 - 13  (0) 2024.06.04
    UNIQUE 제약의 이해 - 12  (0) 2024.06.04