MySQL

관계 차수 - 1:1(일대일), 1:N(일대다), N:M(다대다)

jiyoon12 2025. 5. 13. 17:22

1. 관계차수

  • 관계형 데이터베이스에서 두 테이블 간의 관계 복잡성을 나타낸다.
  • 관계 테이블 간의 데이터 연결 방식을 정의하며 주로 1:1(일대일), 1:N(일대다),  N:M(다대다) 로 나뉜다.
  •  

1-1. 1:1(일대일) 관계

  • 한 테이블의 레코드가 다른 테이블의 다른 테이블의 단 하나의 레코드와 연결되는 관계이다.
  • 특정 테이블 속성을 분리하거나 선택적 데이터를 별도로 관리할 때 사용된다.
  • 예를 들어,  한 사람은 하나의 여권만 가질 수 있고 여권도 오직 한 사람의 것이므로 사람과 여권은 1:1로 볼 수 있다.
-- 관계 차수에 대한 개념을 알아보자.
-- 사람과 여권의 관계차수는 1:1이다. 

create table tb_person(
	person_id int auto_increment,
    name varchar(50) not null,
    primary key(person_id)
);

create table tb_passport(
	passport_id int auto_increment,
    passport_number varchar(20) not null,
    person_id int unique,
    primary key(passport_id),
    foreign key(person_id) references tb_person(person_id)
);

insert into tb_person(name) values ('홍길동'),('김영희'),('이철수');

insert into tb_passport(passport_number,person_id)
values('p1234',1),('p2222',2),('p3333',3);

select * from tb_passport;

 

  • 1:1 관계의 예시
-- 회사
-- 직원, 사원증

-- 대학교
-- 학생, 학적 정보

-- 상품, 보증

-- 병원
-- 환자, 의료 기록

 

 

1-2. 1:N(일대다) 관계

  • 한 레코드가 다른 테이블의 여러 레코드와 연결되는 관계이다.
  • 예를 들어, 한 명의 고객은 여러개의 주문을 할 수 있으므로 고객과 주문은 1:N으로 볼 수 있다.
create table tb_customer(
	customer_id int auto_increment,
    name varchar(50) not null,
    primary key(customer_id)
);

create table tb_order(
	order_id int auto_increment,
    product_name varchar(50) not null,
    customer_id int,
    primary key(order_id),
    foreign key(customer_id) references tb_customer(customer_id)
);

 

  • 1:N 관계 예시
-- 게시판
-- 회원가입, 게시물

-- 야구팀과 야구선수

 

 

1-3. N:M(다대다) 관계

  • 한 테이블의 레코드가 다른 테이블의 여러 레코드와 연결되고, 반대로 한 레코드도 여러 테이블과 연결되는 관계이다.
  • 예를 들어, 한명의 학생은 여러 개의 수업을 들을 수 있고 하나의 수업도 여러 명의 학생이 수강 할 수 있으므로 N:M으로 볼 수 있다. 
  • N:M관계를 테이블 2개만으로 표현은 불가능하기 때문에 보통 수강과 같은 중간 테이블이 필요하다. 
  • 중간 테이블은 두 테이블의 기본 키를 외래 키로 포함하며, 두 테이블 간의 관계를 매핑한다.

※ 중간 테이블 이름 짓기 권장 사항※

  • 일반적으로 두 테이블의 이름을 조합해서 만든다. (예: student_course, user_role, author_book)
  • 선택적으로 업무 용어에 따라 의미 있는 이름을 줄 수도 있다.(예: enrollment (student + course 관계 = 수강), subscription (user + newsletter 관계 = 구독), assignment (employee + task 관계 = 할당)

  • 중간 테이블의 기본키는 두 외래키의 조합으로 설정하기
  • 외래 키 제약 조건으로 데이터 무결성 보장하기
create table tb_student(
    student_id int auto_increment,
    name varchar(50) not null,
    primary key(student_id)
);

create table tb_course(
    course_id int auto_increment,
    title varchar(50) not null,
    primary key(course_id)
);

create table tb_student_course(
    student_id int,
    course_id int,
    primary key(student_id, course_id), 
    foreign key(student_id) references tb_student (student_id),
    foreign key (course_id) references tb_course(course_id)
);

insert into tb_student(name) values
('홍길동'),
('김영희');

insert into tb_course(course_id, title) values
(101,'자바'),
(102, '데이터베이스');

insert into tb_student_course (student_id, course_id) values
(1, 101),
(1, 102),
(2, 102);