PracticeEveryday

개념적 데이터 모델링 본문

DB

개념적 데이터 모델링

kimddakki 2022. 8. 9. 11:55
개념적 데이터 모델링

 - 우리가 파악한 업무에서 개념을 뽑아내는 과정

 

 - 일을 하는 순서와 공부를 하는 순서는 다를 수 있다.

 ※ 개념적 모델링이 논리적, 물리적 모델링보다 앞선 단계이지만, 논리적 물리적 모델링을 경험해보지 않은 사람이

     개념적 모델링을 할 수는 없다.

 - 다음 단계를 위한 요소들을 추출해내는 과정이기 때문에 관계형 데이터베이스 모델링의 가장 중요한 부분이다.

 - 첫 단추를 잘 꿰면 다음 수순은 물 흐르듯이 진행될 수가 있다.

 

 ※ 필터 : 현실에서 개념을 추출해내는 도구

 ※ 언어 : 개념에 대해 다른 사람과 대화 할 수 있는 도구

 - 아래의 ERD가 필터이자 언어로서의 도구이다.

 ※ Entity Relationship Diagram ( ERD )

 - 개념적 데이터 모델링의 도구이자, 결과물이다.

 - 현실의 복잡성을 극복하고, 문제를 3가지의 관점으로 바라본다.

1. 정보 () : 정보를 발견하고 표현한다.

2. 그룹 () : 서로 연관된 정보를 인식하고 묶어 표현한다.

3. 관계 () : 그룹 사이의 관계를 인식하고 표현한다.

 

 - 현실로부터 개념을 인식하는 도구이면서, 다른 사람도 알 수 있도록 표현하는 도구이다.

 - 매우 쉽게 표 ( RDB Diagram, 다음 단계인 논리적 모델링에서 작성 )로 전환할 수 있으며 오랜 시간 정교한 규칙들이

   정립되어 왔다.

 

관계형 데이터베이스다운 개념의 구조

1. 개념 추출

 - 기획서에서는 여러가지 정보들이 흩어져있다.

 - 여기에서 연관된 정보를 묶어주는 큰 덩어리부터 추출한다.

 

 - 이걸 어떻게 표현하는 지에는 정답이 없다.

 - 설명이 가능하며 모순이 없다면 모두 타당하다! 하지만 필요한 정보는 모두 가져야 한다!

 - 그 중에서 관계형 데이터베이스에 더 잘 어울리는 모델이 유리하므로 2안을 선택하자!

 

 ※ 관계형 데이터베이스에 더 잘 어울리는 모델?

 - 이 모델을 설명하기 위한 표는 아래와 같다.

 - 표안에 작은 표가 중첩 ( Nested ) 되어 있는 형태이다.

  => 하지만! RDB는 이러한 내포관계를 허용하지 않는다.

 - 보이도록 원하는 대로 구현했지만 개념들의 관계가 가시적으로 보이기는 힘들다.

 - 초 거대 프로젝트라도 어떻게든 구현은 가능하지만, 알아보기 힘들며 유지 / 보수도 힘들다.

 

 - 프로젝트가 거대해지면, Column이 1천개가 넘을 수도 있다.

 => 데이터를 원할 때, 1천 개의 Column에 Access되므로 굉장히 비효율적이다.

 => 굉장히 많은 중복 row가 발생할 수도 있다. 당장 위의 테이블도 저자 1의 내용이 중복으로 저장되어 있다.

   => 저장 뿐아니라, 입력, 수정도 중복으로 행해져야 한다.

 

※ 거대 단일 Table로 표현하면, 중복이 발생하게 된다!!

 

 

 - 주제에 따라 Data를 Grouping 할 수 있다.

 - 조회하려는 대상만 조회가 가능하므로 컴퓨터의 자원을 아낄 수가 있다.

 - JOIN이 가능하다.

SELECT 댓글.내용, 댓글.작성일, 저자.이름, 저자.소개 FROM 댓글 LEFT JOIN 저자 ON 댓글.저자아이디 = 저자.아이디

 - JOIN으로 표현이 가능하므로, 저장되는 데이터의 중복을 피할 수 있다.

 - 관계형 데이터베이스에는 언제든지 필요할 때마다 표끼리 합성해 낼 수 있다.

 => 그로므로 내포된 형태의 완성된 표가 아닌, 평면적인 형태의 개별적인 표를 서로 참조시켜서 사용한다.

ERD 구성 요소

1. Entity ( 개념, 개체 )

 - 개념적 모델링 및 ERD에서, 이러한 모델의 구성 요소 ( 큰 덩어리 )를 Entity라고 한다.

 - 이 Entity는 후에 DB에서 TABLE로 전환될 것이다.

 

 - ' 글 ' Entity를 가져와 보자

2. Attribute ( 속성 )

 - 이 ' 글 ' Entity는 실제 Data가 아니다.

 - 구체적인 Data는 제목, 생성일, 본문, ... 이다. 이런 각각의 Data들이 모여 Entity를 이루게 된다.

 - 이런 Data를 Grouping 한 것이 Entity가 된다.

 - 이 구체적인 Data는 Attribute( 속성 ) 이라고 한다.

 - Attribute는 후에 TABLE의 COLUMN이 된다.

 

 ※ 그럼 저자명, 댓글은 왜 글의 Attribute가 되지 않는가?

 - 글 아래에 ' 저자명 ' 속성 하나만 필요하다면 Attribute 속성이 될수 있지만 저장명 외에도 저자 아래에

   저자소개도 함께 필요하게 된다.

 => 즉, 이런 저자에 대한 Data가 여럿이고, 이것들이 하나의 Entity가 된다.

 

 - Entity는 하위 Entity를 두지 않으며 ( => 중첩 테이블, Nested 하게 두지 않으며 )

   Entity는 개별적으로 존재( 저장 )하고 필요할 때마다 JOIN을 통해 합한 결과를 이용할 것이다.

 - 그러므로 모델링에서는 별개의 것으로 보면 된다.

 

3.  Relation ( 관계 )

 

 - Entity들 간의 관계 

 - 글은 저자가 쓴것

  => 글에 댓글이 포함되어 있다.

 - 댓글은 저자가 쓴 것

  => 이러한 Entity 사이의 관계가 Relationship ( 관계 )

 

 - 논리적 데이터 모델링에서 Entity에 포함시키고 싶은 다른 Entity의 Primary Key ( PK, 기본키 )를

    Foreign Key (FK, 외래키 )로 두고 SQL문의 JOIN 기능을 사용하여 이 FK를 조건으로 일치하는 PK를 가진

    data를 해당 Entity에서 참조해서 사용한다.

 

ERD의 구성 요소

*Entity(): data의 group

 ㆍDatabase의 TABLE이 된다.

*Attribute(): data

 ㆍTABLE의 COLUMN이 된다.

*Relationship(): Entity간의 관계

 ㆍTABLE의 COLUMN 중 Foreign Key(FK)로 다른 TABLE의 Primary Key(PK)가 오게 된다.

 

 - ERD에는 속하지 않지만, 표의 행 ( Row )에 속하는 인스턴스인 Tuple이 존재한다.

30세 남성인 홍길동 => 테이블의 ROW가 된다.

 

 - 개념적 데이터 모델링은 " 개념 "에 집중하여, DB 체계와는 거리를 두고 있기 때문에, 용어들이 실제 DB에서

   사용하는 용어와는 다르다.

 

Entity 정의

 - 현실과 Data의 서로 원인 - 결과 관계

 

Application을 하나의 건물이라고 할 때 
 - UI ( User Interface )가 옥상이라면 DB ( DataBase )는 지하이다.

UI와 DB 사이의 일들을 원인 - 결과의 관점으로 생각해보자.
 - UI에 Data를 입력하는 원인으로 DB의 Data를 변경하는 결과를 낳는다.
 - DB의 Data라는 원인으로, UI에 내용이 표시되는 결과를 낳는다.
 
  => 즉, 사용자가 마주하는 UI ( 현실 )과 컴퓨터 ( DB )에 저장되는 데이터는
     서로 원인과 결과의 관계에 있다고 할 수 있다.
     => 이 원인과 결과를 번갈아가며 순차적으로 점검해야 좋은 모델링이 될 수 있다.

 - 기획자와 구현자가 다르다면 데이터 모델링까지는 함께 동행하는 것이 이상적이라 생각한다.

 - 기획과 데이터 모델링은 사소한 부분까지 서로 놓치면 안되는 중요한 작업이다.

 

1. 가장 먼저 해야할 일은, 기획서에서 Entity를 찾아내는 것이다.

 

※ 팁으로 읽기 UI 보다는 쓰기 UI에서 Entity를 찾아내기가 더 쉽다.

 

 

Entity Relationship Diagram 작성 ( https://www.draw.io )

 - 사각형에 Entity를 표현

 

2. Attribute 정의

 

 - Attribute ( 속성 )는 각 Entity의 소속이 될 Data 종류이다. ( Column에 위치한다. )

 => 이 역시 쓰기 UI에서 쉽게 파악 가능하다.

 - 글 Entity에서 " Entity 저자 "가 Dropbox에서 선택하는 것은 단독 Data가 아니라 좀 더 복합적이라 별도의 Entity로

   독립해 나갈 있을 수 있다는 것이다.

 - 그래서 Attribute라기보다는, Relationship으로 연결한다.

 

 - 쓰기 UI만으로는 부족한 정보가 있을 수 있다.

 - 읽기 UI로 보면 글의 " 생성일 " 이 보인다.

 - 쓰기 UI에서 별도의 지정없이 자동으로 현재 시각을 계한하여 포함하는 Data이기 때문이다.

 - 이런 정보들도 빠뜨리지 않아야 한다!!

 

 - UI를 토대로 모델링을 하다보면, UI가 모델링을 검증하고 모델링이 UI를 검증하는 형태의 교차 검증이

   이루어질 수 있다. ( 기획에서 모델링이 이어지고, 모델링하면서 부족했던 기획을 보충할 수 있다. )

 - 그러므로 기획자와 구현자가 한 사람이 아니라면 개념적 모델링까지는 함께 해야 좋은 결과를 얻을 수 있다.

 

 

3. Identifier ( 식별자 ) 지정

 

 - 이제 Entity의 Attribute 중에 대표적인 Identifier ( 식별자 )를 뽑아야 한다.

 - Attribute들 중에 식별자가 될 수 있는 후보가 없다면 새로 추가해야 한다.

 Ex 주민등록번호, 차량번호, 웹사이트의 도메인 이름 등...

 

 - 원하는 대상 ( 인스턴스 . 개체 )를 정확하게 가리킬 수 있어야 한다.

 => 즉, 중복될 수 없는 값을 가지기 때문에, 인스턴스 간에 구분이 가능하다.

  => 그 대상을 제외한 누구도 같은 값을 가질 수 없는 것이 가장 중요하다.

 

 - 이렇게 지정한 Identifier는 DB에서 Primary Key ( PK, 기본키 )가 될 것이다.

 - Name과 City는 중복이 발생할 수 있으므로 후보에서 제외한다.

 - User_id, Email, National_id는 각각 중복되지 않는 값을 가지므로, Identifier의 후보가 될 수 있으며, 이들을

   후보키 ( Candidate Key )라고 한다.

 - 그 중 식별자로 지정한 것을 기본키 ( Primary Key )라고 한다.

 - 그 외 나머지 후보키는 대리키 ( Alternate Key )라고 한다.

 - 대리키는 필요한 때에, 성능 향상을 위해서 기본키가 아닌 Secondary Index로 지정하기 좋다.

 

 - 복합키 ( Composite Key )

 - 단일 Attribute로는 중복이 발생할 수 있지만, 여러 Attribute가 함께 사용된 결과는 중복이 발생할 수 없을 때 

   ( 식별 가능할 때 ) 이 묶음 단위를 복합키 ( Composite Key )로 사용할 수 있다.

 

 - 인조키 ( Artificial Key )

 - 자연키 ( Natural Key )로는, 즉, 자연스럽게 존재하는 Atrribute들로는 식별자를 선택할 수 없을 때

   인조키 ( Artificial Key )를 추가하여 사용할 수 있다.

 

※ DB에서는 SEQUENCE를 사용하거나 AUTO_INCREMENT 속성을 가진 INT를 사용하여 자동으로 1씩 증가하여

    중복되지 않는 값이 매겨지도록 설정할 수 있다.

4. Entity간의 연결 ( Relationship )

 

 - 각 표들이 연결된 상태로써 위와 같이 표들관의 관계를 이야기한다.

 

 - 왜래 ( Foreign )에 있는 TABLE ( 저자 TABLE )과 연결한다.

 - 이러한 외래의 식별자를 자기 TABLE ( 글 TABLE, 댓글 TABLE )에서는 외래키 ( Foreign Key, FK )라고 한다.

 

 => 즉 DB에서 Primary Key와 Foreign Key를 통해 Entity간의 Relationship이 구현된다.

 

 

5. Cardinality ( 집합론에서 집합의 " 크기 " )

 - " 저자 "의 입장에서, 댓글은 여러개를 가질 수 있다. ( 한 명이 여러 댓글을 작성할 수 있다. )

  => ? : N의 관계가 된다.

 - " 댓글 " 입장에서, 저자는 하나만 가질 수 있다. ( 본 댓글은 한 명이 작성한 것이다. )

  => 1: ?의 관계가 된다.

 - 합치면 1 : N의 관계가 된다.

 

 - ERD에서는 Relation의 양 긑이 다음과 같이 표현된다.

 - 1인 쪽이 일직선, N인 쪽이 세 갈래 선으로 표현된다.

 - 선의 끝에 1, N이라고 표시하기도 한다.

 

 - " 담임 "의 입장에서, 반은 하나 가질 수 있다. ( 본 담임은 한 반만 담당할 수 있다. )

  => ? : 1의 관계가 된다.

 - " 반 "의 입장에서, 담임은 하나 가질 수 있다. ( 본 반의 담임은 한 명만 될 수 있다. )

  => 1 : ?의 관계가 된다.

 - 합치면, 1 : 1의 관계가 된다.

 

 - ERD에서는 Relation의 양 끝이 다음과 같이 표현된다.

 

 - 둘다 1이라 양 쪽이 모두 일직선으로 표현된다.

 

 - " 저자 "의 입장에서, 글은 여러 개 가질 수 있다. ( 한 명이 여러 글을 작성할 수 있다. )

  => ? : M 관계가 된다.

 - " 글 "의 입장에서, 저자는 여러 개 가질 수 있다. ( 본 글은 여러 명이 작성했을 수 있다. )

  => N : ? 관계가 된다.

 

 - 합치면 N : M의 관계가 된다.

 

 - ERD에서는 Relation의 양 끝이 다음과 같이 표현된다.

 - 둘 다 여러 개이므로, 양 쪽이 모두 세 갈래 선으로 표현된다.

 - 선의 끝에 N, M이라고 표시하기도 한다.

 

 - N : M의 경우, DB의 TABLE 끼리만으로는 표현이 불가능하기 때문에, 신규 테이블에서 양쪽 TABLE의 FK를 사용하여

   양쪽을 참조하는 형태 ( 연결 TABLE )를 만들어 사용한다.

  => 즉, 연결 TABLE에서 1 : N, 1 : M으로 하여 구현한다.

 

6. Optionality ( 선택성 )

 - " 저자 "의 입장에서 " 댓글 "은 필수로 존재해야 하나요?

  => 아니요 : Optional ( 선택적인 )

 - " 댓글 "의 입장에서 " 저자 "는 필수적으로 존재해야 하나요?

  => 예 : Madatory ( 필수적인 )

 

 - ERD에서는 Relation의 양 끝이 다음과 같이 표현된다.

 - Optional인 부분에 원형이 매겨진다.

 - Madatory인 부분에 수직선이 매겨진다.

 

Optionality는 Cardinality와 별개의 속성이다.

 - Optionality는 개념에 따라 다를 수 있다.
   Entity를 " 선생님 "으로 한다면 " 반 "은 Optional이 되지만
   Entity를 " 담임선생님 "으로 한다면 " 반 "은 Mandatory가 된다.
   
Optionality는 현실에 따라 다를 수 있다.
 
 - " 학생 " Entity와 " 967회 모의 TOEIC 답안 " Entity를 보면
   " 제출답안 " 입장에서는 " 학생 " 하나만 가질 수 있고 ( 본 제출답안의 작성자는 한 사람 ),
   " 학생 " 입장에서도 " 특정 시험 "의 " 제출 답안 "은 하나만 가질 수 있다. ( 여러개 칠 수 없고, 여러개 낼 수 없다. )
   " 제출답안 " 입정에서는 존재하기 위해 " 학생 "은 필수적이다 ( Mandatory )
   " 학생 " 입장에서는 시험을 치르지 않았을 수도 있다. " 제출 답안 "은 필수가 아니다 ( Optional )
   Cardinality는 1:1 관계이지만, 반드시 Mandatory:Mandatory로 이어지지 않는다.
  
 이렇게 현실에서는 다양한 종류와 문제들이 존재할 수 있다!


 

 

RDB Modeling - 3. 개념적 데이터 모델링

RDB Modeling (관계형 데이터베이스 모델링) 3. 개념적 데이터 모델링 3.1 - 개념적 데이터 모델링 소개 3.2 - 관계형 데이터베이스다운 개념의 구조 3.3 - ERD의 구성요소 3.4 - Entity 정의 3.5 - Attribute..

ydeer.tistory.com

 

'DB' 카테고리의 다른 글

TypeORM  (0) 2022.08.13
논리적 데이터 모델링  (0) 2022.08.09
RDB Modeling  (0) 2022.08.08
Key  (0) 2022.05.13
Transaction  (0) 2022.05.11
Comments