ERD란?
Entity Relationship Diagram (ERD)는 시스템의 엔티티들이 무엇이 있는지 어떤 관계가 있는지를 나타내는 다이어그램입니다. 예를 들면 작가, 소설, 소비자 요소가 있다고 할 때 ER 다이어그램으로 다음과 같이 표현할 수 있습니다.
허허 말이 어렵다..
다시 천천히 엔티티부터 들어가야 한다.
엔티티(Entity)란?
간단한 요약으로는 엔티티는 인스턴스의 집합을 말한다.
엔티티(Entity)를 그대로 번역하면 실제, 독립체라는 뜻으로 데이터 모델링에서 사용되는 실제 객체라고 생각하면 된다. 음 그럼 인스턴스를 말하는 것인가? 라고 혼란스럽다.
여기서 실제는 뭐 실물을 말하는 것이 아니라, 클래스의 인스턴스를 생각해보면 쉽다. 클래스는 설계도고 인스턴스(객체)는 설계도로 만든 제품이다.(by 남궁성님)
이 정도로도 그 미묘한 차이를 해결 할 수 없다. 엔티티는 인스턴스와 사실 조금 다른 개념이지만, 결과적으로 말로 설명하다보면 비슷한 느낌을 받아 햇갈리게 한다.
하지만 다른 부분은 ‘대표 객체’라는 표현을 써보면 좀 더 근접하게 되는 것 같다. 인스턴스는 객체가 가지고 있는 멤버(필드와 메소드)처럼 인스턴스는 하나의 객체마다 다를 수 있지만, 엔티티는 대표적인 모습을 띈다. 따라서 엔티티는 결국 DB입장에서 보면 Table의 개념이며, 인스턴스는 Row의 개념을 가지게 된다. 그럼 사실상 인스턴스보다는 클래스의 개념에 가깝다.그래서 같은것들을 가지고 있어서 혼동이 있을 수 있다.
•
학생은 대명사이며, 아래처럼 학번, 이름, 학점, 전공을 가지고있다.
•
“A”라는 학생은 고유명사이며 아래처럼 학번, 이름, 학점, 전공을 가지고있다.
그럼 다시 엔티티는 무엇들이 있는가
말그대로 객체들의 관계도 라고 한글로 쓰는 것이 가장 쉬워보인다. 그런데 간과하면 안되는 것이 엔티티는 어떠한 사물만을 말하지 않는다. 약간은 메소드와 비슷한 개념으로 개념적인 부분도 엔티티로 포함이 된다. 조금 교과서적인 부분이라 이정도 개념이 있구나 보고 넘어가고 있다.
유무형에 따른 분류
물리적 형태가 존재하는가?
종류 | 설명 |
유형 엔터티 | - 업무에서 도출되며 지속적으로 사용되는 엔터티입니다.- 예) 고객, 강사, 사원 등 |
개념 엔터티 | - 유형 엔터티는 물리적 형태가 있지만 개념 엔터티는 물리적 형태가 없습니다.- 개념적으로 사용되는 엔터티입니다.- 예) 거래소 종목, 코스닥 종목, 생명보험 상품 |
사건 엔터티 | - 비즈니스 프로세스를 실행하면서 생성되는 엔터티입니다.- 예) 주문, 체결, 취소주문, 수수료 청구 등 |
발생 시점에 따른 엔터티 종류
언제 발생되느냐?
종류 | 설명 |
기본 엔터티(Basic Entity) | - 키 엔터티라고도 합니다.- 다른 엔터티로부터 영향을 받지 않고 독립적으로 생성되는 엔터티입니다.- 예) 고객, 상품, 부서 등 |
중심 엔터티(Main Entity) | - 기본 엔터티와 행위 엔터티 간의 중간에 있는것을 말합니다.- 즉. 기본 엔터티로부터 발생되고 행위 엔터티를 생성하는것을 말합니다.- 예) 계좌, 주문, 취소, 체결 등 |
행위 엔터티(Active Entity) | - 2개 이상의 엔터티로부터 발생됩니다.- 예) 주문 이력, 체결 이력 등 |
엔티티 다이어그램은 어떻게 그리는가?
위와 같은 엔티티들을 이해하기 시작했으면 DB설계를 할 수 있다. 이전 프로젝트에서 DB 설계를 내가 담당하긴 했었지만, 뭐 이해도가 부족한 상태에서 배운대로 해본느낌이었다. 오히려 내 레벨에서는 설계하는것 보다, 남의 엔티티 다이어그램을 보기위해서 내가 담당했다고 볼 수 있다. 팀원들보다 더 많이 찾아봤어야 했고 어떻게들 표현하는지 배우고자 자진했었다.
그리는 양식 자체가 조금 익숙하지 않고 복잡해보여서 관련 툴들을 사용했었다. 생각보다 좋은것들이 많다. StarUML이라던지 유료로 서비스되는 것들이 많다. 예전에는 Eclipse의 플러그인 중에 하나가 오픈소스로 그 기능을 제공했는데 2020년부터인가 배포가 금지? 개발이 중단되었다. 그런데 나는 원래 게임 기획단계에서부터 Gitmind라는 툴을 사용해왔다. 이전 교육에서도 이것을 활용해서 ERD를 작성했었다.
그 특유의 기호들의 규칙과 관계 표현에서 1:1관계 1:N관계등 정해진 것들이 많다. 중요한건 FK, PK를 통한 테이블간 관계가 중요하고, 그것을 읽어내서 내가 실제로 DB에 어떤 쿼리문을 작성해야 하는지가 더 중요하다고 생각되었다.
이 부분을 해결할 수 있는 좋은 툴을 알고 있다.
본격적으로 ERD를 그려보자
실제로 중요한 것들은 빨간색 부분들이다. 그 빨간색 부분을 이해시키기 위해서 부가적인 설명이 파란색으로 들어간다. 빨간색은 물리값으로 실제 개발자가 사용하는 부분, 파란색은 개발자가 커뮤니케이션을 위해 사용되는 논리값이다.
•
논리 테이블명 : 테이블명에 대한 설명 (한글)
•
물리 테이블명 : 실제 테이블명 (영문)
•
논리 필드명 : 필드명에 대한 설명 (한글)
•
물리 필드명 : 실제 필드명 (영문)
•
도메인 : 필드명에 대한 주제를 적는 곳 (이것도 일종의 코멘트와 같다)
•
타입 : int, varchar, date 필드 타입을 써주는 곳
•
NULL 유무 : NULL / NOT NULL 중에 하나
•
기본값 : default 값을 써주는 곳
•
코멘트 : 말 그대로 부가설명이 필요할 경우 써주는 곳이다
Type에 대한 추가 설명
ERD 테이블의 type 종류
•
INT : 숫자로 컬럼 타입정함
•
VARCHAR : 텍스트인데 맥시멈 3000정도()안에 숫자를 쓰면 그 만큼의 텍스트를 쓸 수 있다.
•
TEXT : 상품 설명이나 VARCHAR보다 더 긴 텍스트를 쓸 때(VARCHAR를 쓸지 TEXT를 쓸지 잘생각)
•
DECIMAL : 소수점까지 저장()안에 10.2 면 .앞에는 몇자리 까지 뒤에는 소수점 이하 몇자리 까지 쓸것인지(정확하게 값저장)
•
FLOAT : 정확하게 저장을 해도 안하는 값
•
DATETIME : 년도 부터 초까지 저장 DATE만 쓰면 일까지만 표현
데이터베이스 관련 용어 어깨넘어로 본것들 추가
이 글을 정리하면서 정보들을 찾다가 조금 관계 있는 다른 용어들도 한번 모아보았다. 스키마 이런것들 안그래도 실제로 DB 플러그인에서도 볼 수 있고 해서 알아둬야겠다 해서 정리를 해둔다.
현재까지 Oracle과 MySQL, MongoDB까지 실습을 해보면서 부르는 명칭들이 조금씩 상이하다. 그런데 또 다르게 부르는것을 발견했다. 평상시에 궁금하던 것들도 모여있어서 크롤링해왔다!
릴레이션 = 테이블 = (스키마 + 인스턴스)
•
릴레이션이란 테이블을 말합니다.
•
릴레이션은 스키마, 인스턴스로 이루어져 있습니다.
스키마
•
스키마는 관계형 데이터베이스에서 기본 구조를 정의하는 것입니다.
•
스키마는 테이블의 첫 행인 헤더를 나타내며, 속성, 자료타입 등의 정보를 담고 있습니다.
인스턴스
•
인스턴스는 테이블에서 실제로 저장된 데이터를 말합니다 .
Tuple(튜플) = Row(행) = Cardinality(카디널리티)
•
튜플은 릴레이션에서 행(가로)의 개수를 의미합니다
•
위 그림에서 튜플의 개수는 3입니다
Attribute(속성) = Column(열) = Degree(차수)
•
속성은 릴레이션에서 열(세로)의 개수를 의미합니다
•
위그림 속성의 개수는 3입니다
도메인
•
도메인은 속성이 가질 수 있는 값의 집합입니다
•
무지개라는 속성에는 7가지 도메인이 존재합니다.