- entity -> table
- attribute -> column
- relationship -> PK, FK
:하나의 레코드가 다른 테이블의 레코드 한 개와 연결된 경우(자주 사용하지 않음)
: 하나의 레코드가 서로 다른 여러 개의 레코드와 연결된 경우
: 여러 개의 레코드가 다른 테이블의 여러 개의 레코드와 관계가 있는 경우
데이터의 중복성을 제거하여, 이상 현상(Anomaly)을 방지하고, 데이터의 일고나성과 정확성을 유지하기 위해 무손실 분해를 하는 과정
이상현상(Anomaly)
데이터의 중복성으로 인해 릴레이션을 조작할 때 발생하는 비합리적 현상
- 삽입 이상 : 정보 저장 시 해당 정보의 불필요한 세부정보를 입력해야 하는 경우
- 삭제 이상 : 정보 삭제 시 원치 않는 다른 정보가 같이 삭제되는 경우
- 갱신 이상 : 중복 데이터 중에서 특정 부분만 수정되어 중복된 값이 모순을 일으키는 경우
위의 비정규형 테이블에서 product
와 tag
를 따로 쪼개서 보면 N:M
의 관계를 가지므로 product_tag_relation
이라는 관계 테이블을 생성하여 연결해주어야 한다.
위의 제1정규형 테이블을 보면 name
컬럼에 부분적으로 종속된 부분이 있다. product
테이블에 부분 종속된 부분만 가져오면 중복된 행을 제거하여 두 행 중 한 행만 남는다.
name
, type
컬럼에 의존하는 price
컬럼을 가져와 product_type
이라는 테이블을 만들면 된다.
이로써 부분 종속된 부분을 없애 제2정규화의 조건을 만족시킬 수 있다.
제2정규화를 거친 테이블을 보면 product
테이블의 seller_id
는 name
컬럼에 종속되어 있고 seller_name
은 seller_id
컬럼에 종속되어 있다. 이러한 관계를 이행적 종속성이라고 한다.
제3정규형 테이블에서는 seller
테이블을 생성하여 product
테이블에서의 이행적 종속성을 제거하였다.
https://velog.io/@sominpark/DB-Schema%EC%99%80-Query-Design%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EA%B4%80%EA%B3%84%ED%98%95-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%84%A4%EA%B3%84#%EA%B4%80%EA%B3%84%ED%98%95-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%84%A4%EA%B3%84
https://velog.io/@rg970604/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-6.-%EA%B4%80%EA%B3%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-qsf0cscp