둘셋 개발!

[RDBMS] 1:M 테이블 설계 시 고려할 점 (정의, 고려할 점, 재귀적 관계) 본문

데이터베이스

[RDBMS] 1:M 테이블 설계 시 고려할 점 (정의, 고려할 점, 재귀적 관계)

23 2023. 3. 19. 14:01

우선 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인 관계 테이블이 무한정으로 늘어날 수 있다.

그림으로 보면 

 

1:m 재귀적 관계

이렇게 무한정으로 늘어지는 테이블이 그려진다.

부속 부서가 생길 때마다 테이블을 만들 수도 없는 노릇이다.

이럴 때 재귀적인 관계 테이블을 만들면 문제를 해결 할 수 있다.

 

재귀란 어떤 것을 정의할 때 자기 자신을 참조한다는 뜻이다.

따라서 재귀적인 테이블을 설계한다는 말은 테이블 안에서 pk를 참조하는 fk가 같이 들어 있다는 말이다.

재귀적인 관계 예시

이렇게 만들게 되면 '부서'테이블을 하나만 만들어도 괜찮다!