관계 차수
관계 차수(Relation Degree)는 관계형 데이터베이스에서 사용되는 용어로 테이블 간의 관계를 설명할 때는 '일대일', '일대다', '다대다' 같은 관계를 설명하는 용어입니다.
혼동하지 말자.
- 테이블 차수 - 테이블 내의 컬럼 수를 나타냅니다.
- 관계 차수 - 두 테이블 간의 관계의 복잡성(예: 일대일, 일대다, 다대다)을 나타냅니다.
테이블 간의 관계 정의 방식
💡 테이블 간의 관계를 정의하는 방식에는 주로 네 가지 유형이 있습니다.1:1 관계 (One-to-One Relationship)
1:N 관계 (One-to-Many Relationship)
N:1 관계 (Many-to-One Relationship)
N:M 관계 (Many-to-Many Relationship)
|
사용자 테이블(tb_user)과 사용자 상세 정보 테이블(tb_user_details)의 구조 만들어 보기
1. 테이블 구조 설계
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) | 전화번호 |
VARCHAR(50) | 이메일 |
2. 샘플 데이터
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 |
+------------+---------+----------------+--------------+------------------------+
3. 테이블 생성 쿼리 ( 기본키와 외래키 설정)
drop table tb_user;
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, 외래키 |
관계 차수
외래키는 누가 가지고 있어야 할까???
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 |
+-----------+--------------+-----------+------------+---------+
학생과 수업 테이블은 관계 차수가 어떻게 될까?
- 학생과 수업테이블은 하나의 학생이 여러개 수업을 들을 수 있다. 하나의 수업에 여러명에 학생이 등록 될 수 있다.
- 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 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;
실습
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(50) 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_class;
desc tb_student;
desc tb_registration;
insert into tb_student(student_name)
values
('김남철'),
('박태현'),
('서치원'),
('압둘아자바 하드 몰트'),
('오효정');
insert into tb_class(class_name, teacher)
values
('마법', '덤블도어'),
('총기의 이해', '존윅'),
('해부학', '한니발 렉터');
insert into tb_registration(student_id, class_id, registration_date)
values
(1,1,'2024-06-04'),
(2,1,'2024-06-04'),
(3,2,'2022-02-25'),
(4,2,'2015-07-15'),
(5,3,'2024-01-08');
-- drop table tb_registration;
-- drop table tb_student;
-- drop table tb_class;
select * from tb_student;
select * from tb_class;
select * from tb_registration
'MySQL > MySQL 기본' 카테고리의 다른 글
테이블 복사 및 데이터 추가 - 16 (0) | 2024.06.07 |
---|---|
MySQL JOIN - 15 (1) | 2024.06.07 |
연습 문제 - 13 (1) | 2024.06.04 |
MySQL에서 인덱스(index)란 - 12 (0) | 2024.06.04 |
UNIQUE 제약에 이해 - 11 (0) | 2024.06.04 |