ERD

류지승·2024년 12월 6일
0

Database

목록 보기
7/9
post-thumbnail

ERD(Entity-Relationship Diagram)

ERD는 데이터베이스 설계를 시각화하는 도구입니다. 시스템 내 데이터 구조를 나타내며, 엔티티(Entity), 속성(Attribute), 관계(Relationship) 간의 연관성을 표현한다. ERDOne-to-One(한 Entity가 다른 Entity에 고유하게 매칭) / One to Many(한 Entity가 여러 Entity에 연관) / Many to Many(여러 Entity가 여러 Entity에 연관)

ERD의 구성 요소
Entity (엔티티)
정의: 관리하려는 데이터의 객체를 나타낸다.
예: 사용자(User), 동영상(Video), 좋아요(Like).

Attribute (속성)
정의: 엔티티가 가진 특성을 나타낸다.
예: 사용자 엔티티의 속성 → 이름, 이메일, 비밀번호.

Relationship (관계)
정의: 엔티티 간의 연관성을 나타낸다.
예: 사용자가 동영상을 "좋아요" → User와 Video 간의 관계.
표현: 다이아몬드형으로 표시.

정규화(Normalization)

정규화(Normalization)는 데이터베이스 설계 과정에서 데이터 중복을 최소화하고, 데이터 무결성을 유지하며, 효율적인 데이터 구조를 만들기 위해 데이터를 여러 테이블로 분리하는 방법이다. 정규화는 중복된 데이터를 제거하고 데이터 무결성을 보장하며 효율적인 데이터를 관리하면서 데이터 베이스 향상시킨다.

1NF

모든 속성의 값이 원자값(Atomic Value)여야한다. 즉 각 column에는 하나의 값만 저장되어야만 한다.

비정규화
다가 속성(Multivalued Attributed) 하나의 엔티티(Entity)나 관계(Relationship)가 여러 개의 값을 가질 수 있는 속성을 말한다. 즉 한 Column에 여러 데이터가 존재하는 것을 의미한다. 이는 1NF의 위배된다.

주문번호날짜이름나이주문 상품
P00110/23철수13A001 레고 1개, A002 미니카 2개
P00208/13영희15A003 인형 1개, A001 레고 2개
P00309/07훈이12A003 인형 2개, A002 미니카 1개

다가 속성을 해결하기 위해 여러 데이터를 각각 row으로 나누었다.

주문번호날짜이름나이주문 상품
P00110/23철수13A001 레고 1개
P00110/23철수13A002 미니카 2개
P00208/13영희15A003 인형 1개
P00208/13영희15A001 레고 2개
P00309/07훈이12A003 인형 2개
P00309/07훈이12A002 미니카 1개

복합 속성(Composite Attrubute) - 여러 하위 속성으로 구성된 속성을 말한다. 하나의 속성이 여러 구성 요소를 포함한다는 뜻이다. 현재 주문상품 Column을 보면 상품 번호(A001), 상품명(레고), 상품수량(1개)주문 상품에 들어가 있는데 이는 여전히 1NF에 위배된다.


주문번호날짜이름나이상품번호상품명상품수량
P00110/23철수13A001레고1개
P00110/23철수13A002미니카2개
P00208/13영희15A003인형1개
P00208/13영희15A001레고2개
P00309/07훈이12A003인형2개
P00309/07훈이12A002미니카1개

계속 분리하다보니 중복 데이터가 발생한 사실을 알 수 있다. 만약 이름을 변경할 경우가 발생하면 이는 대규모 공사가 될 것이다. 이를 해결 하기 위해 우리는 테이블을 2개로 분리해야한다.


[ 주문 ] 테이블

주문번호날짜이름나이
P00110/23철수13
P00208/13영희15
P00309/07훈이12

[ 주문_상품 ] 테이블

주문번호상품번호상품명상품수량
P001A001레고1개
P001A002미니카2개
P002A003인형1개
P002A001레고2개
P003A003인형2개
P003A002미니카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라고 부른다.

2NF

1NF를 만족하면서 부분 함수 종속성 제거(기본 키의 일부만으로 결정되는 컬럼이 없어야 한다)인 경우를 제 2 정규화라고 한다. 테이블의 모든 비기본속성(Non-Prime Attribute - 기본 키에 포함되지 않은 나머지 속성)PK의 모든 속성에 완전 함수 종속되어야 한다. 먼저 헷갈릴만한 용어부터 정리를 해보겠다. 부분 함수 종속성기본 키(PK)의 일부 속성에만 의존하는 비기본 속성을 의미한다.

예를 들어보겠다 위에 테이블을 기준으로 말하자면 주문번호(PK)와 상품명은 실질적으로 의존하지 않는다. 즉 상품명은 상품 번호에만 의존한다는 사실을 알 수 있을 것이다. 즉 2NF가 되기 위해서는 1NF를 만족하면서 비기본 속성이 PK의 전체에 의존하는 경우(완전 함수 종속성)를 의미한다. 주로 2NF는 PK가 복합키로 구성되어 있으며 PK의 일부에만 종속된 비기본속성이 있을 때 사용한다.

[ 주문 ] 테이블

주문번호날짜이름나이
P00110/23철수13
P00208/13영희15
P00309/07훈이12

[ 상품 ] 테이블

상품번호상품명
A001레고
A002미니카
A003인형

[ 주문_상품 ] 테이블

실질적으로 상품 수량주문번호와 상품번호에 완전히 종속되어 있다. 하지만 상품 명 같은 경우 상품 번호만 종속되어 있기 때문에 테이블을 분리해야한다.

주문번호상품번호상품수량
P001A0011개
P001A0022개
P002A0031개
P002A0012개
P003A0032개
P003A0021개

이렇게 되면 각 column에는 하나의 값만 존재하며, 완전 함수 종속성을 갖는 테이블 구조가 될 것이다.

3NF

2NF를 만족하면서 이행성 종속성(Transitive Dependency)를 제거한 상태를 말한다. 이행성 종속성(Transitive Dependency)란 비기본 속성(Non-Prime Attribute)이 다른 비기본 속성을 통해 기본 키에 종속되는 경우를 의미한다.

예를 들자면 주문 테이블에서 이름과 나이PK인 주문번호를 통해 종속되어 있지만, 사실상 고객이라는 데이터에 종속되어 있다. 즉, 이름과 나이는 고객 정보이며 주문 정보와 독립적이여야 한다.

[ 주문 ] 테이블

주문번호날짜고객번호
P00110/23U001
P00208/13U002
P00309/07U003

[ 고객 ] 테이블

고객번호이름나이
U001철수13
U002영희15
U003훈이12

[ 상품 ] 테이블

상품번호상품명
A001레고
A002미니카
A003인형

[ 주문_상품 ] 테이블

주문번호상품번호상품수량
P001A0011개
P001A0022개
P002A0031개
P002A0012개
P003A0032개
P003A0021개

테이블 정규화 예시

상품명
상품내용
상품가격
상품거래주소
상품거래상세주소
상품거래위도
상품거래경도
상품거래예정시각
상품판매여부
카테고리-도서
카테고리-의류
카테고리-가전
카테고리-기타
상품태그
상품판매자이름
상품판매자이메일

상품ID상품명상품내용상품가격상품판매 여부카테고리상품태그상품판매자 이름상품판매자 이메일상품거래주소상품거래상세주소상품거래위도상품거래경도상품거래예정시각
P001마우스좋은 마우스1000FALSE가전전자제품, 영등포마우스철수chulsoo@naver.com영등포영등포역10.2430.110시
P002키보드잘쳐지는 키보드1500FALSE가전굿키보드, 전자제품영희hee@gmail.com잠실잠실역10.4430.215시
P003데이터베이스데이터베이스책2000FALSE도서훈이hun@naver.com신도림신도림역10.3330.667시
P004운영체제핵심운영체제3000FALSE도서책사랑맹구mang@naver.com구로구로역10.3730.993시

먼저 1NF 정규화를 해보겠다. 상품 태그 부분을 보면 한 column에 여러 값이 있는 것을 확인할 수 있다. 1FA에 위배되므로

상품ID상품명상품내용상품가격상품판매여부카테고리상품태그상품판매자 이름상품판매자 이메일상품거래주소상품거래상세주소상품거래위도상품거래경도상품거래예정시각
P001마우스좋은 마우스1000FALSE가전전자제품철수chulsoo@naver.com영등포영등포역10.2430.110시
P001마우스좋은 마우스1000FALSE가전영등포마우스철수chulsoo@naver.com영등포영등포역10.2430.110시
P002키보드잘쳐지는 키보드1500FALSE가전굿키보드영희hee@gmail.com잠실잠실역10.4430.215시
P002키보드잘쳐지는 키보드1500FALSE가전전자제품영희hee@gmail.com잠실잠실역10.4430.215시
P003데이터베이스데이터베이스책2000FALSE도서훈이hun@naver.com신도림신도림역10.3330.667시
P004운영체제핵심운영체제3000FALSE도서책사랑맹구mang@naver.com구로구로역10.3730.993시

column에는 한 개의 데이터만 존재하도록 1FA로 변경하였지만 중복되는 데이터가 있다는 것을 확인할 수 있다.

[상품_상품태그] 테이블

상품ID상품태그
P001전자제품
P001영등포마우스
P002굿키보드
P002전자제품
P003
P004책사랑

[상품] 테이블

상품ID상품명상품내용상품가격상품판매여부카테고리상품판매자이름상품판매자이메일상품거래주소상품거래상세주소상품거래위도상품거래경도상품거래예정시각
P001마우스좋은 마우스1000FALSE가전철수chulsoo@naver.com영등포영등포역10.2430.110시
P002키보드잘쳐지는 키보드1500FALSE가전영희hee@gmail.com잠실잠실역10.4430.215시
P003데이터베이스데이터베이스책2000FALSE도서훈이hun@naver.com신도림신도림역10.3330.667시
P004운영체제핵심운영체제3000FALSE도서맹구mang@naver.com구로구로역10.3730.993시

이렇게 되면 상품 테이블의 중복은 없어졌지만, 상품 태그 테이블 같은 경우 전자제품이 중복되었음을 알 수 있다.

[상품태그] 테이블

상품태그ID상품태그
T001전자제품
T002영등포마우스
T003굿키보드
T004
T005책사랑

[상품_상품태그] 테이블

상품ID상품태그ID
P001T001
P001T002
P002T003
P002T001
P003T004
P004T005

[상품] 테이블

상품ID상품명상품내용상품가격상품판매여부카테고리상품판매자이름상품판매자이메일상품거래주소상품거래상세주소상품거래위도상품거래경도상품거래예정시각
P001마우스좋은 마우스1000FALSE가전철수chulsoo@naver.com영등포영등포역10.2430.110시
P002키보드잘쳐지는 키보드1500FALSE가전영희hee@gmail.com잠실잠실역10.4430.215시
P003데이터베이스데이터베이스책2000FALSE도서훈이hun@naver.com신도림신도림역10.3330.667시
P004운영체제핵심운영체제3000FALSE도서맹구mang@naver.com구로구로역10.3730.993시

이제 다음은 상품 테이블에서의 카테고리이다. 가전과 도서가 중복되어 있다는 사실을 알 수 있다.

[ 카테고리 ] 테이블

상품카테고리ID카테고리
C001가전
C002도서

[ 상품 ] 테이블

상품ID상품명상품내용상품가격상품판매여부상품카테고리ID상품판매자이름상품판매자이메일상품거래주소상품거래상세주소상품거래위도상품거래경도상품거래예정시각
P001마우스좋은 마우스1000FALSEC001철수chulsoo@naver.com영등포영등포역10.2430.110시
P002키보드잘쳐지는 키보드1500FALSEC001영희hee@gmail.com잠실잠실역10.4430.215시
P003데이터베이스데이터베이스책2000FALSEC002훈이hun@naver.com신도림신도림역10.3330.667시
P004운영체제핵심운영체제3000FALSEC002맹구mang@naver.com구로구로역10.3730.993시

여기까지가 2NF 정규화를 해결한 것이다.
다음은 3NF 정규화이다. 먼저 상품 테이블을 확인하면 상품 판매자 이름과 상품 판매자 이메일은 현재 PK와 이행성 종속성이 있는 상태이다.

[상품판매자] 테이블

상품판매자ID상품판매자이름상품판매자이메일
U001철수chulsoo@naver.com
U002영희hee@gmail.com
U003훈이hun@naver.com
U004맹구mang@naver.com

[ 상품 ] 테이블

상품ID상품명상품내용상품가격상품판매여부상품카테고리ID상품판매자ID상품거래주소상품거래상세주소상품거래위도상품거래경도상품거래예정시각
P001마우스좋은 마우스1000FALSEC001U001영등포영등포역10.2430.110시
P002키보드잘쳐지는 키보드1500FALSEC001U002잠실잠실역10.4430.215시
P003데이터베이스데이터베이스책2000FALSEC002U003신도림신도림역10.3330.667시
P004운영체제핵심운영체제3000FALSEC002U004구로구로역10.3730.993시

또한 상품 거래 관련 테이블 또한 이행성 종속성이 있는 상태이기 때문에 분리해주는 게 좋다.

[상품거래위치] 테이블

상품거래위치ID상품거래주소상품거래상세주소상품거래위도상품거래경도상품거래예정시각
L001영등포영등포역10.2430.110시
L002잠실잠실역10.4430.215시
L003신도림신도림역10.3330.667시
L004구로구로역10.3730.993시

[ 상품 ] 테이블

상품ID상품명상품내용상품가격상품판매여부상품카테고리ID상품판매자ID상품거래위치ID
P001마우스좋은 마우스1000FALSEC001U001L001
P002키보드잘쳐지는 키보드1500FALSEC001U002L002
P003데이터베이스데이터베이스책2000FALSEC002U003L003
P004운영체제핵심운영체제3000FALSEC002U004L004

최종 정리

[ 상품 ] 테이블

상품ID상품명상품내용상품가격상품판매여부상품카테고리ID상품판매자ID상품거래위치ID
P001마우스좋은 마우스1000FALSEC001U001L001
P002키보드잘쳐지는 키보드1500FALSEC001U002L002
P003데이터베이스데이터베이스책2000FALSEC002U003L003
P004운영체제핵심운영체제3000FALSEC002U004L004

[ 상품거래위치 ] 테이블

상품거래위치ID상품거래주소상품거래상세주소상품거래위도상품거래경도상품거래예정시각
L001영등포영등포역10.2430.110시
L002잠실잠실역10.4430.215시
L003신도림신도림역10.3330.667시
L004구로구로역10.3730.993시

[ 카테고리 ] 테이블

상품카테고리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
P001T001
P001T002
P002T003
P002T001
P003T004
P004T005

ERD

일대일 관계 (1:1 One to One)

한 테이블의 한 행이 다른 테이블의 정확히 하나의 행과 연관되는 관계를 일대일 관계라고 한다. 두 테이블 간에 데이터가 1:1로 매핑되고, 외래 키(Foreign Key)를 사용하여 두 테이블을 연결하며 보통 테이블을 분리해야 하는 논리적 이유가 있을 때 사용한다. 현재 데이터베이스 설계로 한 상품에는 하나의 상품 거래 위치라고 설계했기 때문에 상품 테이블과 상품거래위치 테이블은 일대일 관계이다.

일대다 관계(1:N, One to Many)

한 테이블의 한 행이 다른 테이블의 여러 행과 연관되는 관계를 일대다 관계라고 한다. 주로 부모-자식 관계를 표현할 때 사용하며 부모 테이블의 기본 키(PK)가 자식 테이블의 외래 키(FK)로 사용된다. 카테고리 테이블 - 상품 테이블 / 상품판매자 테이블 - 상품 테이블은 일대다 관계이다.

다대다 관계(N:N Many to Many)

한 테이블의 여러 행이 다른 테이블의 여러 행과 연관되는 관계를 다대다 관계라고 한다. 두 테이블 간의 관계를 표현하기 위해 중간 테이블이 필요하며 중간 테이블은 두 테이블의 PKFK로 가진다. 현재 상품 테이블 - 상품 태그 테이블을 보면 상품에는 여러 개의 상품 태그를 달 수 있고, 하나의 태그의 여러개의 상품이 사용될 수 있기 때문에 상품 테이블 - 상품 태그 테이블은 다대다 관계이다.

profile
성실(誠實)한 사람만이 목표를 성실(成實)한다

0개의 댓글