ERD는 데이터베이스 설계를 시각화하는 도구입니다. 시스템 내 데이터 구조를 나타내며, 엔티티(Entity), 속성(Attribute), 관계(Relationship)
간의 연관성을 표현한다. ERD는 One-to-One(한 Entity가 다른 Entity에 고유하게 매칭) / One to Many(한 Entity가 여러 Entity에 연관) / Many to Many(여러 Entity가 여러 Entity에 연관)
ERD의 구성 요소
Entity (엔티티)
정의: 관리하려는 데이터의 객체를 나타낸다.
예: 사용자(User), 동영상(Video), 좋아요(Like).Attribute (속성)
정의: 엔티티가 가진 특성을 나타낸다.
예: 사용자 엔티티의 속성 → 이름, 이메일, 비밀번호.Relationship (관계)
정의: 엔티티 간의 연관성을 나타낸다.
예: 사용자가 동영상을 "좋아요" → User와 Video 간의 관계.
표현: 다이아몬드형으로 표시.
정규화(Normalization)는 데이터베이스 설계 과정에서 데이터 중복을 최소화하고, 데이터 무결성을 유지하며, 효율적인 데이터 구조를 만들기 위해 데이터를 여러 테이블로 분리하는 방법이다. 정규화는 중복된 데이터를 제거하고 데이터 무결성을 보장하며 효율적인 데이터를 관리하면서 데이터 베이스 향상시킨다.
모든 속성의 값이 원자값(Atomic Value)여야한다. 즉 각 column에는 하나의 값만 저장되어야만 한다.
비정규화
다가 속성(Multivalued Attributed) 하나의 엔티티(Entity)나 관계(Relationship)가 여러 개의 값을 가질 수 있는 속성을 말한다. 즉 한 Column에 여러 데이터가 존재하는 것을 의미한다. 이는 1NF의 위배된다.
주문번호 | 날짜 | 이름 | 나이 | 주문 상품 |
---|---|---|---|---|
P001 | 10/23 | 철수 | 13 | A001 레고 1개, A002 미니카 2개 |
P002 | 08/13 | 영희 | 15 | A003 인형 1개, A001 레고 2개 |
P003 | 09/07 | 훈이 | 12 | A003 인형 2개, A002 미니카 1개 |
다가 속성을 해결하기 위해 여러 데이터를 각각 row으로 나누었다.
주문번호 | 날짜 | 이름 | 나이 | 주문 상품 |
---|---|---|---|---|
P001 | 10/23 | 철수 | 13 | A001 레고 1개 |
P001 | 10/23 | 철수 | 13 | A002 미니카 2개 |
P002 | 08/13 | 영희 | 15 | A003 인형 1개 |
P002 | 08/13 | 영희 | 15 | A001 레고 2개 |
P003 | 09/07 | 훈이 | 12 | A003 인형 2개 |
P003 | 09/07 | 훈이 | 12 | A002 미니카 1개 |
복합 속성(Composite Attrubute) - 여러 하위 속성으로 구성된 속성을 말한다. 하나의 속성이 여러 구성 요소를 포함한다는 뜻이다. 현재 주문상품 Column을 보면 상품 번호(A001), 상품명(레고), 상품수량(1개)
이 주문 상품에 들어가 있는데 이는 여전히 1NF에 위배된다.
주문번호 | 날짜 | 이름 | 나이 | 상품번호 | 상품명 | 상품수량 |
---|---|---|---|---|---|---|
P001 | 10/23 | 철수 | 13 | A001 | 레고 | 1개 |
P001 | 10/23 | 철수 | 13 | A002 | 미니카 | 2개 |
P002 | 08/13 | 영희 | 15 | A003 | 인형 | 1개 |
P002 | 08/13 | 영희 | 15 | A001 | 레고 | 2개 |
P003 | 09/07 | 훈이 | 12 | A003 | 인형 | 2개 |
P003 | 09/07 | 훈이 | 12 | A002 | 미니카 | 1개 |
계속 분리하다보니 중복 데이터가 발생한 사실을 알 수 있다. 만약 이름을 변경할 경우가 발생하면 이는 대규모 공사가 될 것이다. 이를 해결 하기 위해 우리는 테이블을 2개로 분리해야한다.
[ 주문 ]
테이블주문번호 | 날짜 | 이름 | 나이 |
---|---|---|---|
P001 | 10/23 | 철수 | 13 |
P002 | 08/13 | 영희 | 15 |
P003 | 09/07 | 훈이 | 12 |
[ 주문_상품 ]
테이블주문번호 | 상품번호 | 상품명 | 상품수량 |
---|---|---|---|
P001 | A001 | 레고 | 1개 |
P001 | A002 | 미니카 | 2개 |
P002 | A003 | 인형 | 1개 |
P002 | A001 | 레고 | 2개 |
P003 | A003 | 인형 | 2개 |
P003 | A002 | 미니카 | 1개 |
Key
Primary Key (PK, 기본 키) - 테이블 내의 각 행(row)을 고유하게 식별할 수 있는 속성(컬럼) 또는 속성들의 조합으로 중복 불가하며, NULL 값을 허용하지 않으며 반드시 하나의 PK만 존재해야한다.Candidate Key (CK, 후보 키) - 테이블에서 PK로 선택될 수 있는 모든 속성 또는 속성 조합을 의미한다. PK이기 때문에 고유성(유일하게 식별 가능)과 최소성(불필요한 컬럼 포함하지 않음)을 만족해야한다.
Composite Key (복합 키) - 두 개 이상의 칼럼을 조합하여 고유성을 보장하는 기본 키 단일 칼럼만으로는 고유하지 않지만 컬럼 조합으로 유일하게 식별 가능하다. 주로 다대다 관계를 표현하는 중간 테이블에서 사용한다.
Foreign Key (FK, 외래 키) - 다른 테이블의 PK를 참조하는 속성으로 두 테이블 간의 관계를 정의하며 참조 무결성을 유지한다. FK 다른 테이블의 PK를 참조하여 관계를 형성하며 참조된 값이 삭제되거나 변경될 때, 조건(CASCADE / SET NULL)에 따라 동작한다. 주로 일대다 관계에서 사용된다.
Unique Key (UK, 유니크 키) - 테이블에서 유일성을 보장하는 속성으로써 PK와 다르게 NULL을 허용하며 하나의 테이블에는 여러 가지의 Unique Key가 존재할 수 있다.
Alternate Key (대체 키) - 후보 키(Candidate Key) 중에서 PK로 선택되지 않은 키로써 PK를 제외한 CK를 Alternate Key라고 부른다.
1NF를 만족하면서 부분 함수 종속성 제거(기본 키의 일부만으로 결정되는 컬럼이 없어야 한다)인 경우를 제 2 정규화라고 한다. 테이블의 모든 비기본속성(Non-Prime Attribute - 기본 키에 포함되지 않은 나머지 속성)이 PK의 모든 속성에 완전 함수 종속되어야 한다. 먼저 헷갈릴만한 용어부터 정리를 해보겠다. 부분 함수 종속성은 기본 키(PK)의 일부 속성에만 의존하는 비기본 속성을 의미한다.
예를 들어보겠다 위에 테이블을 기준으로 말하자면 주문번호(PK)와 상품명은 실질적으로 의존하지 않는다. 즉 상품명은 상품 번호에만 의존한다는 사실을 알 수 있을 것이다. 즉 2NF가 되기 위해서는 1NF를 만족하면서 비기본 속성이 PK의 전체에 의존하는 경우(완전 함수 종속성)를 의미한다. 주로 2NF는 PK가 복합키로 구성되어 있으며 PK의 일부에만 종속된 비기본속성이 있을 때 사용한다.
[ 주문 ]
테이블주문번호 | 날짜 | 이름 | 나이 |
---|---|---|---|
P001 | 10/23 | 철수 | 13 |
P002 | 08/13 | 영희 | 15 |
P003 | 09/07 | 훈이 | 12 |
[ 상품 ]
테이블상품번호 | 상품명 |
---|---|
A001 | 레고 |
A002 | 미니카 |
A003 | 인형 |
[ 주문_상품 ]
테이블실질적으로 상품 수량은 주문번호와 상품번호에 완전히 종속되어 있다. 하지만 상품 명 같은 경우 상품 번호만 종속되어 있기 때문에 테이블을 분리해야한다.
주문번호 | 상품번호 | 상품수량 |
---|---|---|
P001 | A001 | 1개 |
P001 | A002 | 2개 |
P002 | A003 | 1개 |
P002 | A001 | 2개 |
P003 | A003 | 2개 |
P003 | A002 | 1개 |
이렇게 되면 각 column에는 하나의 값만 존재하며, 완전 함수 종속성을 갖는 테이블 구조가 될 것이다.
2NF를 만족하면서 이행성 종속성(Transitive Dependency)를 제거한 상태를 말한다. 이행성 종속성(Transitive Dependency)란 비기본 속성(Non-Prime Attribute)이 다른 비기본 속성을 통해 기본 키에 종속되는 경우를 의미한다.
예를 들자면 주문 테이블에서 이름과 나이는 PK인 주문번호를 통해 종속되어 있지만, 사실상 고객이라는 데이터에 종속되어 있다. 즉, 이름과 나이는 고객 정보이며 주문 정보와 독립적이여야 한다.
주문번호 | 날짜 | 고객번호 |
---|---|---|
P001 | 10/23 | U001 |
P002 | 08/13 | U002 |
P003 | 09/07 | U003 |
고객번호 | 이름 | 나이 |
---|---|---|
U001 | 철수 | 13 |
U002 | 영희 | 15 |
U003 | 훈이 | 12 |
상품번호 | 상품명 |
---|---|
A001 | 레고 |
A002 | 미니카 |
A003 | 인형 |
주문번호 | 상품번호 | 상품수량 |
---|---|---|
P001 | A001 | 1개 |
P001 | A002 | 2개 |
P002 | A003 | 1개 |
P002 | A001 | 2개 |
P003 | A003 | 2개 |
P003 | A002 | 1개 |
표 |
---|
상품명 |
상품내용 |
상품가격 |
상품거래주소 |
상품거래상세주소 |
상품거래위도 |
상품거래경도 |
상품거래예정시각 |
상품판매여부 |
카테고리-도서 |
카테고리-의류 |
카테고리-가전 |
카테고리-기타 |
상품태그 |
상품판매자이름 |
상품판매자이메일 |
상품ID | 상품명 | 상품내용 | 상품가격 | 상품판매 여부 | 카테고리 | 상품태그 | 상품판매자 이름 | 상품판매자 이메일 | 상품거래주소 | 상품거래상세주소 | 상품거래위도 | 상품거래경도 | 상품거래예정시각 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
P001 | 마우스 | 좋은 마우스 | 1000 | FALSE | 가전 | 전자제품, 영등포마우스 | 철수 | chulsoo@naver.com | 영등포 | 영등포역 | 10.24 | 30.1 | 10시 |
P002 | 키보드 | 잘쳐지는 키보드 | 1500 | FALSE | 가전 | 굿키보드, 전자제품 | 영희 | hee@gmail.com | 잠실 | 잠실역 | 10.44 | 30.21 | 5시 |
P003 | 데이터베이스 | 데이터베이스책 | 2000 | FALSE | 도서 | 책 | 훈이 | hun@naver.com | 신도림 | 신도림역 | 10.33 | 30.66 | 7시 |
P004 | 운영체제 | 핵심운영체제 | 3000 | FALSE | 도서 | 책사랑 | 맹구 | mang@naver.com | 구로 | 구로역 | 10.37 | 30.99 | 3시 |
먼저 1NF 정규화를 해보겠다. 상품 태그 부분을 보면 한 column에 여러 값이 있는 것을 확인할 수 있다. 1FA에 위배되므로
상품ID | 상품명 | 상품내용 | 상품가격 | 상품판매여부 | 카테고리 | 상품태그 | 상품판매자 이름 | 상품판매자 이메일 | 상품거래주소 | 상품거래상세주소 | 상품거래위도 | 상품거래경도 | 상품거래예정시각 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
P001 | 마우스 | 좋은 마우스 | 1000 | FALSE | 가전 | 전자제품 | 철수 | chulsoo@naver.com | 영등포 | 영등포역 | 10.24 | 30.1 | 10시 |
P001 | 마우스 | 좋은 마우스 | 1000 | FALSE | 가전 | 영등포마우스 | 철수 | chulsoo@naver.com | 영등포 | 영등포역 | 10.24 | 30.1 | 10시 |
P002 | 키보드 | 잘쳐지는 키보드 | 1500 | FALSE | 가전 | 굿키보드 | 영희 | hee@gmail.com | 잠실 | 잠실역 | 10.44 | 30.21 | 5시 |
P002 | 키보드 | 잘쳐지는 키보드 | 1500 | FALSE | 가전 | 전자제품 | 영희 | hee@gmail.com | 잠실 | 잠실역 | 10.44 | 30.21 | 5시 |
P003 | 데이터베이스 | 데이터베이스책 | 2000 | FALSE | 도서 | 책 | 훈이 | hun@naver.com | 신도림 | 신도림역 | 10.33 | 30.66 | 7시 |
P004 | 운영체제 | 핵심운영체제 | 3000 | FALSE | 도서 | 책사랑 | 맹구 | mang@naver.com | 구로 | 구로역 | 10.37 | 30.99 | 3시 |
한 column에는 한 개의 데이터만 존재하도록 1FA로 변경하였지만 중복되는 데이터가 있다는 것을 확인할 수 있다.
[상품_상품태그] 테이블
상품ID | 상품태그 |
---|---|
P001 | 전자제품 |
P001 | 영등포마우스 |
P002 | 굿키보드 |
P002 | 전자제품 |
P003 | 책 |
P004 | 책사랑 |
[상품] 테이블
상품ID | 상품명 | 상품내용 | 상품가격 | 상품판매여부 | 카테고리 | 상품판매자이름 | 상품판매자이메일 | 상품거래주소 | 상품거래상세주소 | 상품거래위도 | 상품거래경도 | 상품거래예정시각 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
P001 | 마우스 | 좋은 마우스 | 1000 | FALSE | 가전 | 철수 | chulsoo@naver.com | 영등포 | 영등포역 | 10.24 | 30.1 | 10시 |
P002 | 키보드 | 잘쳐지는 키보드 | 1500 | FALSE | 가전 | 영희 | hee@gmail.com | 잠실 | 잠실역 | 10.44 | 30.21 | 5시 |
P003 | 데이터베이스 | 데이터베이스책 | 2000 | FALSE | 도서 | 훈이 | hun@naver.com | 신도림 | 신도림역 | 10.33 | 30.66 | 7시 |
P004 | 운영체제 | 핵심운영체제 | 3000 | FALSE | 도서 | 맹구 | mang@naver.com | 구로 | 구로역 | 10.37 | 30.99 | 3시 |
이렇게 되면 상품 테이블의 중복은 없어졌지만, 상품 태그 테이블 같은 경우 전자제품이 중복되었음을 알 수 있다.
[상품태그] 테이블
상품태그ID | 상품태그 |
---|---|
T001 | 전자제품 |
T002 | 영등포마우스 |
T003 | 굿키보드 |
T004 | 책 |
T005 | 책사랑 |
[상품_상품태그]
테이블
상품ID | 상품태그ID |
---|---|
P001 | T001 |
P001 | T002 |
P002 | T003 |
P002 | T001 |
P003 | T004 |
P004 | T005 |
[상품]
테이블
상품ID | 상품명 | 상품내용 | 상품가격 | 상품판매여부 | 카테고리 | 상품판매자이름 | 상품판매자이메일 | 상품거래주소 | 상품거래상세주소 | 상품거래위도 | 상품거래경도 | 상품거래예정시각 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
P001 | 마우스 | 좋은 마우스 | 1000 | FALSE | 가전 | 철수 | chulsoo@naver.com | 영등포 | 영등포역 | 10.24 | 30.1 | 10시 |
P002 | 키보드 | 잘쳐지는 키보드 | 1500 | FALSE | 가전 | 영희 | hee@gmail.com | 잠실 | 잠실역 | 10.44 | 30.21 | 5시 |
P003 | 데이터베이스 | 데이터베이스책 | 2000 | FALSE | 도서 | 훈이 | hun@naver.com | 신도림 | 신도림역 | 10.33 | 30.66 | 7시 |
P004 | 운영체제 | 핵심운영체제 | 3000 | FALSE | 도서 | 맹구 | mang@naver.com | 구로 | 구로역 | 10.37 | 30.99 | 3시 |
이제 다음은 상품 테이블에서의 카테고리이다. 가전과 도서가 중복되어 있다는 사실을 알 수 있다.
[ 카테고리 ] 테이블
상품카테고리ID | 카테고리 |
---|---|
C001 | 가전 |
C002 | 도서 |
[ 상품 ]
테이블
상품ID | 상품명 | 상품내용 | 상품가격 | 상품판매여부 | 상품카테고리ID | 상품판매자이름 | 상품판매자이메일 | 상품거래주소 | 상품거래상세주소 | 상품거래위도 | 상품거래경도 | 상품거래예정시각 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
P001 | 마우스 | 좋은 마우스 | 1000 | FALSE | C001 | 철수 | chulsoo@naver.com | 영등포 | 영등포역 | 10.24 | 30.1 | 10시 |
P002 | 키보드 | 잘쳐지는 키보드 | 1500 | FALSE | C001 | 영희 | hee@gmail.com | 잠실 | 잠실역 | 10.44 | 30.21 | 5시 |
P003 | 데이터베이스 | 데이터베이스책 | 2000 | FALSE | C002 | 훈이 | hun@naver.com | 신도림 | 신도림역 | 10.33 | 30.66 | 7시 |
P004 | 운영체제 | 핵심운영체제 | 3000 | FALSE | C002 | 맹구 | mang@naver.com | 구로 | 구로역 | 10.37 | 30.99 | 3시 |
여기까지가 2NF 정규화를 해결한 것이다.
다음은 3NF 정규화이다. 먼저 상품 테이블을 확인하면 상품 판매자 이름과 상품 판매자 이메일은 현재 PK와 이행성 종속성이 있는 상태이다.
[상품판매자] 테이블
상품판매자ID | 상품판매자이름 | 상품판매자이메일 |
---|---|---|
U001 | 철수 | chulsoo@naver.com |
U002 | 영희 | hee@gmail.com |
U003 | 훈이 | hun@naver.com |
U004 | 맹구 | mang@naver.com |
[ 상품 ] 테이블
상품ID | 상품명 | 상품내용 | 상품가격 | 상품판매여부 | 상품카테고리ID | 상품판매자ID | 상품거래주소 | 상품거래상세주소 | 상품거래위도 | 상품거래경도 | 상품거래예정시각 |
---|---|---|---|---|---|---|---|---|---|---|---|
P001 | 마우스 | 좋은 마우스 | 1000 | FALSE | C001 | U001 | 영등포 | 영등포역 | 10.24 | 30.1 | 10시 |
P002 | 키보드 | 잘쳐지는 키보드 | 1500 | FALSE | C001 | U002 | 잠실 | 잠실역 | 10.44 | 30.21 | 5시 |
P003 | 데이터베이스 | 데이터베이스책 | 2000 | FALSE | C002 | U003 | 신도림 | 신도림역 | 10.33 | 30.66 | 7시 |
P004 | 운영체제 | 핵심운영체제 | 3000 | FALSE | C002 | U004 | 구로 | 구로역 | 10.37 | 30.99 | 3시 |
또한 상품 거래 관련 테이블 또한 이행성 종속성이 있는 상태이기 때문에 분리해주는 게 좋다.
[상품거래위치] 테이블
상품거래위치ID | 상품거래주소 | 상품거래상세주소 | 상품거래위도 | 상품거래경도 | 상품거래예정시각 |
---|---|---|---|---|---|
L001 | 영등포 | 영등포역 | 10.24 | 30.1 | 10시 |
L002 | 잠실 | 잠실역 | 10.44 | 30.21 | 5시 |
L003 | 신도림 | 신도림역 | 10.33 | 30.66 | 7시 |
L004 | 구로 | 구로역 | 10.37 | 30.99 | 3시 |
[ 상품 ] 테이블
상품ID | 상품명 | 상품내용 | 상품가격 | 상품판매여부 | 상품카테고리ID | 상품판매자ID | 상품거래위치ID |
---|---|---|---|---|---|---|---|
P001 | 마우스 | 좋은 마우스 | 1000 | FALSE | C001 | U001 | L001 |
P002 | 키보드 | 잘쳐지는 키보드 | 1500 | FALSE | C001 | U002 | L002 |
P003 | 데이터베이스 | 데이터베이스책 | 2000 | FALSE | C002 | U003 | L003 |
P004 | 운영체제 | 핵심운영체제 | 3000 | FALSE | C002 | U004 | L004 |
[ 상품 ] 테이블
상품ID | 상품명 | 상품내용 | 상품가격 | 상품판매여부 | 상품카테고리ID | 상품판매자ID | 상품거래위치ID |
---|---|---|---|---|---|---|---|
P001 | 마우스 | 좋은 마우스 | 1000 | FALSE | C001 | U001 | L001 |
P002 | 키보드 | 잘쳐지는 키보드 | 1500 | FALSE | C001 | U002 | L002 |
P003 | 데이터베이스 | 데이터베이스책 | 2000 | FALSE | C002 | U003 | L003 |
P004 | 운영체제 | 핵심운영체제 | 3000 | FALSE | C002 | U004 | L004 |
[ 상품거래위치 ] 테이블
상품거래위치ID | 상품거래주소 | 상품거래상세주소 | 상품거래위도 | 상품거래경도 | 상품거래예정시각 |
---|---|---|---|---|---|
L001 | 영등포 | 영등포역 | 10.24 | 30.1 | 10시 |
L002 | 잠실 | 잠실역 | 10.44 | 30.21 | 5시 |
L003 | 신도림 | 신도림역 | 10.33 | 30.66 | 7시 |
L004 | 구로 | 구로역 | 10.37 | 30.99 | 3시 |
[ 카테고리 ] 테이블
상품카테고리ID | 카테고리 |
---|---|
C001 | 가전 |
C002 | 도서 |
[ 상품판매자 ] 테이블
상품판매자ID | 상품판매자이름 | 상품판매자이메일 |
---|---|---|
U001 | 철수 | chulsoo@naver.com |
U002 | 영희 | hee@gmail.com |
U003 | 훈이 | hun@naver.com |
U004 | 맹구 | mang@naver.com |
[ 상품태그 ] 테이블
상품 태그ID | 상품 태그 |
---|---|
T001 | 전자제품 |
T002 | 영등포마우스 |
T003 | 굿키보드 |
T004 | 책 |
T005 | 책사랑 |
[ 상품_상품태그 ] 테이블
상품ID | 상품 태그ID |
---|---|
P001 | T001 |
P001 | T002 |
P002 | T003 |
P002 | T001 |
P003 | T004 |
P004 | T005 |
한 테이블의 한 행이 다른 테이블의 정확히 하나의 행과 연관되는 관계를 일대일 관계라고 한다. 두 테이블 간에 데이터가 1:1로 매핑되고, 외래 키(Foreign Key)를 사용하여 두 테이블을 연결하며 보통 테이블을 분리해야 하는 논리적 이유가 있을 때 사용한다. 현재 데이터베이스 설계로 한 상품에는 하나의 상품 거래 위치라고 설계했기 때문에 상품 테이블과 상품거래위치 테이블은 일대일 관계이다.
한 테이블의 한 행이 다른 테이블의 여러 행과 연관되는 관계를 일대다 관계라고 한다. 주로 부모-자식 관계를 표현할 때 사용하며 부모 테이블의 기본 키(PK)가 자식 테이블의 외래 키(FK)로 사용된다. 카테고리 테이블 - 상품 테이블 / 상품판매자 테이블 - 상품 테이블은 일대다 관계이다.
한 테이블의 여러 행이 다른 테이블의 여러 행과 연관되는 관계를 다대다 관계라고 한다. 두 테이블 간의 관계를 표현하기 위해 중간 테이블이 필요하며 중간 테이블은 두 테이블의 PK를 FK로 가진다. 현재 상품 테이블 - 상품 태그 테이블을 보면 상품에는 여러 개의 상품 태그를 달 수 있고, 하나의 태그의 여러개의 상품이 사용될 수 있기 때문에 상품 테이블 - 상품 태그 테이블은 다대다 관계이다.