박재성이라는 사용자가 같은 제목과 같은 내용의 게시글을 3개 작성했다고 가정하자. 겉으로만 봤을 땐 제목 컬럼에서도 데이터 중복이 발생한 것처럼 보이고, 내용 컬럼에서도 데이터 중복이 발생한 것처럼 보이고, 작성자 컬럼에서도 데이터 중복이 발생한 것처럼 보인다. 하지만 여기서 진짜 데이터 중복이 발생한 컬럼은 작성자 컬럼뿐이다.
가짜 중복인지 진짜 중복인지 어떻게 판단할 수 있을까?
가짜 중복인지 진짜 중복인지 판단하려면 이렇게 질문해보면 된다.
“실제 서비스에서 A 데이터의 값을 수정하면, B 데이터의 값도 같이 수정되어야 하는가?”
말로만 들으니까 어렵게 느껴진다. 바로 한 번 적용시켜보자.
posts (게시글)
id
제목
내용
작성자
1
[속보] 개발자 채용 확대
내용
박재성
2
[속보] 개발자 채용 확대
내용
박재성
3
[속보] 개발자 채용 확대
내용
박재성
1번 게시글의 작성자 이름을 수정하면, 2번 게시글의 작성자 이름도 같이 수정되어야 하는가?
→ Yes! (= 진짜 중복이다)
1번 게시글의 제목을 수정하면, 2번 게시글의 제목도 같이 수정되어야 하는가?
→ No! (= 가짜 중복이다)
1번 게시글의 내용을 수정하면, 2번 게시글의 내용도 같이 수정되어야 하는가?
→ No! (= 가짜 중복이다)
진짜 중복을 찾아냈다면 진짜 중복의 컬럼에 대해서만 테이블을 분리해야 한다.
posts (게시글)
id
제목
내용
작성자 id (FK)
1
[속보] 개발자 채용 확대
내용
1
2
[속보] 개발자 채용 확대
내용
1
3
[속보] 개발자 채용 확대
내용
1
users (사용자)
id
이름
1
박재성
예시를 하나만 보면 헷갈릴 수 있으니 한 가지 예시를 더 보자.
products (상품)
id
상품명
카테고리
1
락스
생활용품
2
락스
생활용품
3
락스
생활용품
1번 상품의 카테고리명을 수정하면, 2번 상품의 카테고리명도 수정되어야 하는가?
→ Yes! (= 진짜 중복이다)
1번 상품의 상품명을 수정하면, 2번 상품의 상품명도 수정되어야 하는가?
→ No! (= 가짜 중복이다)
[진짜 중복에 대해서만 테이블 분리]
products (상품)
id
상품명
카테고리 id (FK)
1
락스
1
2
락스
1
3
락스
1
categories (카테고리)
id
이름
1
생활용품
✅ 정리
가짜 중복이 발생한 컬럼은 테이블 분리를 하면 안 된다. 진짜 중복이 발생한 컬럼에 대해서만 테이블 분리를 해야 한다.