본문으로 바로가기

관계 차수란?

category MySQL 2024. 6. 7. 17:46

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

 

혼동하지 말자.

  1. 테이블 차수 - 테이블 내의 컬럼 수를 나타냅니다.
  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)

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

 

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) 이메일
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)
);

 

 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, 외래키

 

create table tb_team(
	team_id int primary key auto_increment,
    team_name varchar(10),
    home_city varchar(10),
    established_year year(10)

);

create table tb_player(
player_id int primary key,
player_name varchar(10),
position varchar(10),
birth_date date,
foreign key(team_id) references tb_team(team_id)


);

 

학생과 수업 테이블은 관계 차수가 어떻게 될까?

학생과 수업테이블은 하나의 학생이 여러개 수업을 들을 수 있다. 하나의 수업에 여러명에 학생이 등록 될 수 있다.

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, 외래키
registration_date DATE 등록 날짜

 

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;
select * from tb_student;

insert into tb_student(student_name)
values('차무식'),('송원석'),('아무개');
select * from tb_student;
insert into tb_class(class_name, teacher)
values('자바마스터','김근호'),('깃허브','이상혁'),('jsp','최우제');
select * from tb_class;
insert into tb_registration(student_id,class_id,registration_date)
values(1,2,20240604),(1,3,20231225),(2,2,20231009);
select * from tb_registration;

delete from tb_registration;

 

'MySQL' 카테고리의 다른 글

테이블 복사 및 데이터 추가  (0) 2024.06.12
MySQL JOIN  (2) 2024.06.12
movie 테이블 설계 후 검증  (0) 2024.06.07
MySQL에서 인덱스(index)란  (0) 2024.06.05
UNIQUE 제약에 이해  (0) 2024.06.05