데이터 모델링이란?

 

데이터 모델링이란,

업무에서 요구하는 각종 데이터를 시스템 측면에서 체계화하고 구체화하여 데이터 모델로 표현하는 것이다.

 

데이터 모델링 작업은 현업 인터뷰, 업무 지침서, 용어집, 산출물 등 현행 업무를 파악하여 개념들을 정리하고 분류하여 엔티티, 속성, 관계로 형상화하는 과정이다.

 

도출된 개념 중 상품, 가입처럼 복합 정보를 포괄적으로 수용하고 있는 경우 엔티티로 식별하고,

생년월일, 가입금액 등 단일 정보는 속성으로 식별한다.

 

개념을 구체화하는 과정에서 상품과 예금, 대출 관계처럼 어떤 개념(상품)이 다른 개념(예금/대출)을 포함하거나

개인, 기업처럼 동등한 지위를 가지는 개념을 식별하여 별도 엔티티로 도출하거나 슈퍼타입과 서브타입으로 집합을 정의한다.

 

 

- ER 모델(Entity-Relationship Model)

현실 세계의 업무를 개체(Entity)와 관계(Relationship)라는 두 가지 개념으로 표현하는 모델이다.

ER모델의 구성요소로는 엔티티, 관계, 속성이 있으며, 속성과 관계 중 하나 이상의 조합으로 구성된 식별자를 포함한다.

 

 

- 엔티티(Entity)

엔티티는 고객, 상품, 직원처럼 현실 세계에 실제로 존재하는 실체이거나, 조직, 서비스, 직업처럼 개념적인 것이다.

엔티티는 주문, 계약처럼 실체와 실체 간의 관계에 해당하는 엔티티를 포함한다.

엔티티는 적어도 둘 이상의 인스턴스가 존재할 수 있어야 하고, 최소한 둘 이상의 속성이 있어야 하며, 반드시 각 인스턴스를 식별할 수 있는 속성이나 관계가 하나 이상 정의되어 있어야 한다.

 

엔티티는 슈퍼타입 엔티티서브타입 엔티티로 확장할 수 있다.

슈퍼타입, 서브타입 엔티티는 일반화/특수화 과정을 통해 도출된다.

슈퍼타입 엔티티는 하나 이상의 서브타입 엔티티와 관계된 일반화된 엔티티이며 서브타입에 공통으로 존재하는 속성을 관리한다.

서브타입 엔티티는 각각의 서브타입에만 존재하는 고유한 속성을 관리한다.

서브타입은 슈퍼타입의 식별자, 속성, 관계 등 모든 특성을 상속받는다.

 

- 관계(Relationship)

엔티티와 엔티티 간에 존재하는 업무 규칙을 정의하고, 엔티티 간에 어떤 관계가 이루어질 수 있는지 표현한다.

관계는 관계수(cardinality), 선택성(optionality), 식별성(Identifier Inheritance), 관계명 등으로 구성된다.

 

관계수(Cardinality) : 일 대 다수인가?

어떤 엔티티의 인스턴스 하나가 다른 엔티티 몇개 인스턴스와 대응될 수 있는지를 표시한 것

일대일(1:1), 일대다(1:M), 다대다(M:N) 3가지 유형이 있다.

 

1. 일대일 관계
직원 - 인턴 관계.

직원은 한 번의 인턴과정을 거쳐 채용될 수 있으며, 하나의 인턴과정은 한 직원과 관련이 있다.

일반데이터와 보안이 필요한 데이터를 따로 분리하여 1:1로 join해서 데이터를 보여주는 경우가 있다.

 

2. 일대다 관계

고객 - 주문, 부서 - 직원 관계.

고객은 주문을 여러개 할 수 있고, 주문은 특정 고객에 종속된다.

한 부서에 직원 여러명이 소속되어 있으며, 직원은 한 부서에만 소속될 수 있다.

 

3. 다대다 관계

학생 - 수강신청

학생은 여러 개 수강과목을 신청할 수 있고, 수강과목은 여러명의 학생에 의해 선택된다.

(다대다 관계는 중간 테이블을 만들어 해소해야 한다)

 


 선택성(Optionality) : 서로 필수관계인가?
1. 필수 - 필수 관계 : 주문과 주문상품
상품을 선택하지 않고 주문을 할 수는 없다.
반대로 주문상품도 주문이 존재해야 함.

2. 필수 - 선택 관계 : 고객과 주문
주문하지 않은 고객은 있을 수 있으나, 주문이 있으면 반드시 주문한 고객이 있어야 한다.

3. 선택 - 선택 관계 : 소개사원과 등록된 계좌
사원은 소개사원으로 등록된 계좌가 존재하지 않을 수 있고, 
계좌도 소개 사원을 지정하지 않은 계좌가 존재할 수 있다.

 

식별자 상속

식별자 상속은 식별관계와 비식별 관계로 구분할 수 있다.

식별 관계는 참조되는 상위 엔티티 식별자가 참조하는 하위 엔티티 식별자로 상속되는 경우를 말하고,

비식별 관계는 식별자가 아닌 일반 속성으로 상속되는 관계를 말한다.

 

-> 식별관계는 상대 테이블의 PK가 내 테이블의 FK이면서 동시에 PK인 것.

비식별관계는 상대 테이블의 PK가 내 테이블의 FK이면서 일반 속성인 것.

 

- 속성(Attribute)

속성은 데이터를 표현하는 가장 작은 단위이며, 속성이 가지는 의미를 통해 엔티티 특성이나 상태를 알 수 있다.

하나의 엔티티는 두 개 이상의 속성을 가지며, 속성명, 식별자여부, 옵셔널리티, 도메인 등으로 구성된다.

 

식별자여부 : 해당 속성이 엔티티 식별자에 해당하는지 표시한다.

옵셔널리티 : 엔티티에 인스턴스가 발생할 때 해당 속성이 반드시 특정값을 가져야 하는지에 대한 구분

도메인 : 속성이 허용하는 데이터 형식과 범위를 가지고 있으며 문자형, 숫자형, 날짜형 등이 있다.

 

 

- 식별자(Identifier)

식별자는 주문 엔티티의 주문번호처럼 엔티티에서 인스턴스를 개별적으로 식별할 수 있는 속성(들)이다.

식별자의 특징으로는 유일성, 최소성, 불변성, 존재성이 있다.

 

유일성)

엔티티의 모든 인스턴스를 유일하게 식별할 수 있어야 한다

 

최소성)

유일성을 만족하는 최소 속성들로 식별자를 구성해야 한다(속성 갯수가 적을수록 좋다)

 

불변성)

일단 엔티티의 식별자를 지정하면 그 식별자의 값은 변하지 않아야 한다.

 

존재성)

모든 직원은 사원번호를 가지듯이 식별자는 반드시 데이터 값이 존재햐아 한다(Not Null)

 

 

관계형 데이터 모델 이론

관계형 데이터 모델은 데이터를 2차원 테이블(표) 형식으로 정의하고 표현한 모델이다.

이러한 테이블 형태를 릴레이션(Relation)이라고 한다.

릴레이션은 정의에 해당하는 릴레이션 스키마(헤더)와 실제값인 릴레이션 인스턴스(본문)로 구성된다.

릴레이션 스키마는 릴레이션명과 어트리뷰트(Attributes)를 포함하고, 튜플(Tuples)은 릴레이션 인스턴스에 해당한다.

 

 

- 관계형 모델의 키

슈퍼 키(Super Key) : 튜플을 고유하게 식별할 수 있는 속성 집합을 말한다.

릴레이션은 한 개 이상의 슈퍼키를 가질 수 있으며, 슈퍼 키 값은 모든 튜플에서 유일해야 한다.

 

후보 키(Candidate Key) : 튜플을 고유하게 식별할 수 있는 최소한의 속성 집합을 후보키라고 한다.

모든 후보키는 슈퍼키이지만, 모든 슈퍼키가 후보키는 아니다(슈퍼키가 후보키를 포함한다)

 

기본 키(Primary Key) : 릴레이션은 하나 이상의 후보키가 있을 수 있으며 그 중 하나만을 기본키로 선택할 수 있다.

후보키와 마찬가지로 유일성, 최소성을 가진다.

 

대체 키(Alternate Key) : 후보키 중에 기본키가 아닌 후보키가 대체키에 해당한다.

예를 들면 후보키인 사원번호, 전화벊 중 사원번호를 기본 키로 정했다면 전화번호는 대체키가 된다.

 

외래 키(Foreign Key) : 어떤 릴레이션의 어트리뷰트 값이 다른 릴레이션에 속한 어트리뷰트의 기본 키를 참조하는 경우를 말한다. 

 

- 제약조건 (for 무결성)

키 제약조건 : 튜플을 유일하게 식별할 수 있는 어트리뷰트들로 구성하며, 다른 튜플의 키값과 중복된 값이 있어서는 안된다.

 

실체무결성 : NOT NULL, 릴레이션 내에 오직 하나의 값만 존재해야 한다.

 

영역무결성 : 릴레이션 내의 각 어트리뷰트 값은 반드시 정의된 도메인에 속한 값이어야 한다.

 

참조무결성 : 자식 릴레이션의 외래키는 참조하는 부모 릴레이션의 기본키 값 이외의 값을 가질 수 없으며, 두 릴레이션 값의 일관성을 유지해야 한다.

 

=> PK, FK, NOT NULL, UNIQUE, 도메인

 

 

- 정규화 (Normalization)

좀 더 작은 단위의 테이블로 설계하는 과정. (테이블을 쪼개서 여러개의 테이블로 만드는 것)

 

정규화를 너무 심하게 할 경우 Join이 빈번하게 발생하여 성능이 저하되지 않을까 걱정할 수 있다.

조인이 발생한다는 사실은 맞지만 이로 인해 반드시 성능 문제가 발생한다고 볼 수 없다.

하지만 성능이 저하되는 문제는 조인이 원인이라기보다는 데이터베이스 특성을 고려하지 않고 사용할 때 발생하는 경우가 더 많다.

때로는 반정규화(De-normalization)를 하기도 하는데, 이 경우도 매우 제한적으로 사용해야 하고, 데이터 중복으로 인한 각종 이상현상이 발생하지 않도록 많은 노력을 기울여야 한다.

 

- 제1 정규형

가장 일반적인 특징은 관계형 테이블은 중복되는 행이 없어야 하고, 모든 열의 값은 원자 값을 가져야 한다는 것이다.

중복 행은 키와 관련되어 있고, 행이 중복되지 않도록 기본 키를 지정해야 한다.

테이블의 모든 열 값이 단일 값이 되려면 개념적으로 중복 열이 없어야 하고, 다중 값이 발생하지 않아야 한다.

중복 열은 전화번호1, 전화번호2 처럼 동일한 개념의 어트리뷰트가 여러 개 있는 형태를 의미하고,

다중 값은 한 열에 여러 개의 값이 들어간 형태를 의미한다.

 

- 제2 정규형

제1 정규형을 만족하고, 키가 아닌 어트리뷰트(후보키에 속하지 않는 속성)는 후보키 전체에 종속되어야 한다.

즉, 후보키에 종속적이지 않거나 후보키 일부 어트리뷰트에 종속적인 어트리뷰트는 별도 릴레이션(테이블)으로 분리해야 한다.

 

- 제3 정규형

제2정규형을 만족하고, 키가 아닌 어트리뷰트들 간에는 서로 종속적인 관계가 없어야 한다.

즉, 키가 아닌 어떤 어트리뷰트가 다른 어트리뷰트에 종속된 경우 별도 릴레이션으로 분리해야 한다.

 

 

=> 결국 중복제거를 위한 작업이다!

 

+ Recent posts