일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 티스토리챌린지
- JPA
- 런타임 상수
- m:n
- 백준
- 기본키 전략
- compgen
- spring
- 편향된 지수
- 오블완
- 리눅스
- 쿠키
- allocationSize
- 커밋 되돌리기
- JDBC
- 쉘 스크립트
- 프로그래머스
- BindingResult
- @Autowired
- 알고리즘
- intelij spring config
- Git
- 컴파일 타임 상수
- 파이썬
- @SubscribeMapping
- API
- application layer
- 무한정 대기
- DTO
- 은행원알고리즘
- Today
- Total
둘셋 개발!
[RDBMS] 1:M 테이블 설계 시 고려할 점 (정의, 고려할 점, 재귀적 관계) 본문
우선 1:m 테이블이 무엇인지 알아보자.
1:M 테이블이란?
: 한쪽이 관계를 맺는 쪽의 여러 객체를 갖는 것을 의미
가장 대표적인 예가 부모와 자식 관계라고 할 수 있다.
부모는 여러명의 자식과 관계를 맺을 수 있다. 하지만 자식은 여러명의 부모와 관계를 맺을 수 있다. 때문에 1:m 관계가 성립한다.
그림으로 보면 다음과 같다.
부모테이블의 id를 pk라고 하면, 자식테이블에 들어가 있는 부모 id는 fk로 설정하여 1:m관계를 형성한다.
이렇게 되면 가비지 데이터를 막을 수 있다.
이게 무슨말이야 하면, 만약 자식 테이블에 부모ID가 4인 데이터가 들어온다고 치자!!
하지만 현재 부모 테이블에는 id가 4인 데이터(가비지 데이터) 가 없다.
따라서 들어올 수 없는 데이터이기 때문에 insert할 수 없다. (부모 없는 자식은 생길 수 없다)
이렇게 이상하게 들어온 데이터를 막을 수 있다.
다음은 가비지 데이터를 insert하려고 했을 때 생기는 오류 메세지 이다.
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test2`.`child`, CONSTRAINT `child_FK` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`parent_id`))
고려해야 할 점
1. 1:m 관계에서 1쪽인 테이블(위의 예시로는 부모테이블)에 delete를 허용하면 안된다.
만약 위의 예시에서 부모테이블의 (1, "김길동")인 데이터를 삭제했다고 치자.
그렇게 되면 자식 테이블에 있는 (1,1,"김수빈")과 (1,2,"김범규") 데이터는 이미 사리진 데이터를 참조하는 상태가 되므로 이상해진다...!!
다음은 delete를 허용하지 않고, 부모테이블의 (1,"김길동") 데이터를 삭제 시도를 할 때 생기기는 오류 메세지 이다.
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test2`.`child`, CONSTRAINT `child_FK` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`parent_id`))
2. 1:m 관계에서 1쪽인 테이블(위의 예시로는 부모테이블)에 update를 허용하면 안된다.
delete와 같은 맥락으로 update도 허용하면 안된다. 만약 부모테이블의 (1,"김길동")에서 parent_id를 4로 update 한다고 하면
(1, 1, "김수빈")과 (1, 2, "김범규") 데이터는 parent_id가 1인 데이터를 참고하고 있었는데 parent_id가 1인 데이터가 사라진 셈이므로 이상해진다...!!
1:m 테이블 재귀적 관계 시
필요에 따라서 1:m테이블에서 재귀적인 관계를 맺여야 할 때가 있다.
대표적인 예시로 회사의 부서이 있다.
총무부 부서안에는 총무1과, 총무2과, 총무3과가 있을 수 있고 또 총무1과 안에는 총무1팀, 총무2팀, 총무3팀이 있을 수 있고
이렇게 1:m인 관계 테이블이 무한정으로 늘어날 수 있다.
그림으로 보면
이렇게 무한정으로 늘어지는 테이블이 그려진다.
부속 부서가 생길 때마다 테이블을 만들 수도 없는 노릇이다.
이럴 때 재귀적인 관계 테이블을 만들면 문제를 해결 할 수 있다.
재귀란 어떤 것을 정의할 때 자기 자신을 참조한다는 뜻이다.
따라서 재귀적인 테이블을 설계한다는 말은 테이블 안에서 pk를 참조하는 fk가 같이 들어 있다는 말이다.
이렇게 만들게 되면 '부서'테이블을 하나만 만들어도 괜찮다!
'데이터베이스' 카테고리의 다른 글
[RDBMS] m:n관계를 찾는 방법 (0) | 2023.03.19 |
---|---|
[RDBMS] M:N 테이블 설계 (특징, 예시, 테이블 설계 시 고려할 점) (0) | 2023.03.19 |
[RDBMS] Primary Key의 조건, Primary Key를 설정할 때 고민이 필요한 부분 (0) | 2023.01.16 |
database server 이해 (1) | 2021.11.08 |
관계형 데이터베이스란? (1) | 2021.11.03 |