속성 이야기

속성에 대한 서설

모델링의 3요소는 엔터티와 속성 그리고 관계다. 엔터티를 설계하는 것은 중요하기 때문에 어려운 반면, 속성은 많은 개수 때문에 어려움을 겪는다.

속성은 엔터티의 성격을 상세하게 기술하는 요소(특성)다. 속성을 모두 도출하면 해당 엔터티가 관리하는 데이터가 무엇인지 알게 된다. 속성은 데이터를 저장하는 가장 작은, 독립된 저장 단위다.

속성의 진정한 쓰임새를 알려면 속성의 종류를 아는 것이 좋다.

속성 분류법

  • 식별자(Key)속성과 비식별자(Non-Key)속성
  • 기초(Basic), 관계(Relationship), 추출(Derived), 시스템(System)속성
  • 원본(Raw)속성과 추출(Derived)속성
  • 단일 값(Single-Valued)속성과 다가(Multivalued)속성
  • 단순(Simple)속성과 복합(Composite)속성
  • 필수(Mandatory)속성과 선택(Optional)속성
  • 코드(Code)속성과 비코드(Non-Code)속성

식별자 속성과 비식별자 속성

식별자 속성이란 엔터티에 존재하는 인스턴스의 유일성을 보장해 주는 속성이나 속성 집합니다.

만약 하나의 속성이 식별자의 역할을 하지 못할 때는 여러 속성이 모여 식별자가 된다. 이를 복합 식별자(Composite Identifier)라고 한다.

반면에 비식별자 속성은 일반 속성으로서, 식별자 속성에 따른 특성을 설명하는 속성으로 인스턴스마다 같은 값을 가질 수 있다.

식별자 종류 - 후보 식별자

후보 식별자(Candidate Identifier)는 주 식별자가 될 가능성이 있는 식별자를 의미한다. 모든 식별자는 주 식별자가 될 수 있는 후보이므로, 식별자와 후보 식별자는 사실상 동일어다.

식별자 종류 - 주 식별자

주 식별자(Primary Identifier)는 엔터티에 하나만 존재하는 대표 식별자다. 흔히 주 식별자와 주키(Primary Key)라는 용어는 동일하게 사용한다.

PK(Primary Key)는 테이블에 지정된 물리적인 제약을 의미한다. 이에 반해 주 식별자는 논리적으로 인스턴스를 식별하는 기준을 의미한다. 논리적인 주 식별자에 다른 속성을 추가해서 물리적인 PK를 생성할 수도 있다.

주 식별자가 바뀌는 현상

개발이나 운영 도중에 엔터티의 주 식별자가 변경되는 일은 빈번하다.

주 식별자가 바뀌는 이유

  • 엔터티 정의가 불명확할 때
  • 데이터 분석이 미흡할 때
  • 이력 데이터를 고려하지 않았을 때
  • 업무가 변경될 때

속성 종류 - 기초 속성

아래와 같은 속성 분류법이 있다.

  • 기초 속성
  • 관계 속성
  • 추출 속성
  • 시스템 속성
    이는 실제 엔터티에 존재하는 속성을 분류한 것이다.

엔터티의 본질을 설명하는 속성이 기초 속성(Basic Attribute)이다. 이 기초 속성을 보면 엔터티의 정의를 알 수 있다. 엔터티에 반드시 존재해야 하는 업무 식별자와 후보 식별자, 엔터티의 특성을 설명하는 속성 등이 이에 해당한다.

속성 종류 - 관계 속성

관계 속성은(Relationship Attribute) 타 엔터티와의 관계를 알기 위해 사용하는 외래 식별자 속성이다.

속성 종류 - 추출 속성

추출 속성(Derived Attribute)은 이미 존재하는 속성으로 재생할 수 있는 속성이다. 이미 존재하는 속성이 원본 속성(Raw Attribute)이다. 원본 속성은 추출 속성에 대한 말로 저장 속성(Stored Attribute)라고도 한다.

속성 종류 - 시스템 속성

시스템 속성(System Attribute)은 데이터에 대한 추적, 감시를 위해 사용하는 속성이다. 해당 인스턴스를 누가 생성하고 언제 생성했는지, 누가 언제 수정했는지를 관리하는 속성이다. 이런 추적 데이터는 당장에는 필요 없을 수도 있지만 언젠가는 요긴하게 사용할 수 있는 데이터다.

도메인

일반적인 정의: 도메인은 속성에 허용된 유효한 값(원자 값)의 집합을 의미한다. 속성이 가질 수 있는 값의 집합이 도메인이다.

데이터 모델링에서 사용하는 도메인에는 두 가지 정의가 존재한다.
1. 도메인은 데이터 타입과 길이를 의미한다.
2. 도메인은 속성의 대표 속성을 의미한다.

전자는 물리 도메인으로 실무에서 사실상 도메인이라고 부르는 것이다. 그런데 대표 속성을 의미하는 후자와 구분하지 않아 문제가 되는 경우가 많다. 후자는 논리적 개념이다.

관계 이야기

관계에 대한 서설

관계형 데이터베이스의 핵심 원리는 데이터를 중복하지 않고 한 군데서만 관리하고(Normalization), 필요할 때 연결(join)해서 보는 것이다. 조인하면 되기 때문에 릴레이션을 분해할 수 있을 때까지 분해한다. 릴레이션을 분해한 후 연결해서 사용하기 위해 관계(Relationship)가 필요한 것이다.

중요한 두 단어
1. 관계 속성
2. 참조 무결성

관계선이 의미하는 것

업무 규칙

관계선의 가장 중요한 의미는 관계선을 보고 업무 규칙(Business Rule)을 알 수 있다는 것이다. 관계를 정확히 표현했다면 관계 선은 어떤 식으로든 두 엔터티 간의 업무 규칙을 보여준다.

업무 프로세스

업무 프로세스에 의해 발생하는 데이터면 관계선이 업무의 흐름을 의미하기도 한다.

조인

관계선은 당연히 데이터를 조회할 때 조인하는 경로를 의미한다.

입력 순서

관계선은 데이터를 입력할 때 입력 순서를 의미하기도 한다. 일반적으로 데이터는 상위(부모)엔터티부터 생성되고 하위(자식)엔터티에 생성된다.

관계를 설계할 때 고려할 사항

  • 속성으로 관리하려는 관계
  • 참조 무결성 관계
  • 바로 상위의 1차 관계

참조 무결성

참조 무결성은 참조하는 데이터 간에 결점이 없는 것을 의미한다. 참조한다는 것은 관계선으로 연결된 것을 의미한다. 하위(자식) 엔터티의 외래 식별자 속성(관계 속성)에 존재하는 값이 상위(부모) 엔터티의 주 식별자 값과 일치하거나 널이면 참조 무결성을 만족한다고 한다. 두 엔터티가 이와 같은 상태에 있으면 참조 무결성 관계라고 한다.

참조 무결성은 논리적인 개념이다. 이를 모델(ERD)에 표현한 것이 관계선이며, DBMS에 물리적으로 구현한 것이 참조 무결성 제약(Referential Integrity Constraint)이다. 참조 무결성 제약(FK 제약)은 논리적인 관계선을 물리적으로 연결한 것으로 DBMS의 데이터 딕셔너리에 데이터로서 존재한다.

종속 관계와 참조 관계

종속 관계는 부모 엔터티와 자식 엔터티 간의 관계로, 이 관계에서는 부모 엔터티가 없으면 자식 엔터티가 존재할 수 없다. 즉 자식 엔터티는 부모 엔터티에 존재 종속되므로 홀로 존재할 수 없다.

반면에 참조 관계는 단지 어떤 엔터티와의 연관성을 관리하려는 관계일 뿐 상위(부모) 엔터티가 없다고 존재할 수 없는 관계는 아니다. 단순히 참조 데이터를 관리하므로 관계를 삭제하더라도 한 속성의 연관성을 모르게 될 뿐 하위 엔터티가 존재할 수 없는 것은 아니다. 관계가 엔터티 존재 자체와 연관되는 것이 아니라 속성 하나와만 연관된다.

식별 관계와 비식별 관계

주 식별자를 하위 엔터티에 어떻게 상속하느냐에 따라 식별관계와 비식별 관계로 나눌 수 있다. 이를 관계 타입이라고 한다.

관계 엔터티의 특징

  • 유연함
  • 부가 속성 관리
  • 하위 엔터티 관리
  • 중복 관계 관리
  • 중복 속성 관리
  • 자체 이력 관리

관계 엔터티 선택 기준

  • 관계가 늘어날 가능성
  • 조회 요건

관계선의 구성 요소

관계비

관계비(Cardinality)는 하나의 인스턴스와 관계있는 상대 인스턴스의 개수를 의미한다.

관계 존재성

관계 존재성(Optionality)은 하나의 인스턴스와 관계있는 상대 인스턴스의 존재 여부를 의미한다.

관계 타입

관계를 상속할 때 식별 관계로 상속하는지 비식별 관계로 상속하는지를 관계 타입(Relationship Type)이라고 한다.

관계 참여수

관계 참여수(Relationship Degree)는 관계선과 연관된 엔터티의 개수를 의미한다.

관계 명

관계 명(Relationship Name)은 모델의 가독성을 높이기 위해 붙인다.

이력 이야기

이력 데이터에 대한 서설

이력 데이터(Altered Data)는 지나간 데이터(Bygone Data)다. 원천 데이터가 수정되거나 변경돼야 이력 데이터가 생긴다. 단지 과거 데이터(Historical Data)를 이력 데이터라고 하지 않는다. 언제 입력됐는 입력된 데이터가 변경돼야 이력 데이터라고 한다. 과거에 쌓인 데이터는 이력 데이터가 아니라 내역 데이터다.

이력 데이터를 설계하는 방법

엔터티 단위 이력

원천 엔터티에서 속성 값이 하나라도 변경되면 변경 전의 전체 속성(인스턴스)을 별도의 이력 엔터티에서 관리하는 방법이다. 따라서 원천 엔터티과 거의 동일한 이력 엔터티가 생긴다.

이렇게 엔터티(전체 속성)를 통째로 이력 관리하는 방법은, 다른 방법에 비해 저장 곤간의 낭비가 심하다. 인스턴스의 스냅샷 데이터이기 때문에 저장하기 쉽고 해당 시점의 전체 데이터, 즉 변경된 속성 값과 변경되지 않은 속성 값을 한 번의 액세스로 조회하기 쉽다는 강력한 장점이 있다. 하지만 어떤 속성 값이 변경됐는지 알기 어려워 변경된 속성 값만을 조회하기는 쉽지 않다.

속성 단위 이력

속성 단위로 이력 데이터를 설계하는 방법은 변경된 속성의 데이터만을 별도로 관리하는 방법이다.

이는 저장 공간이 가장 절약된다. 또한, 변경된 속성만을 대상으로 관리하므로 변경된 속성이 무엇인지 명확하게 알 수 있다. 반면에 과거 특정한 시점에 대해 변경된 속성 값과 변경되지 않은 속성 값을 같이 조회하기는 쉽지 않다.

속성 그룹 단위 이력

속성 중 내용(도메인)이 유사하거나 같이 사용될 수 있는 속성을 묶어서 별도의 엔터티에서 이력 데이터를 관리하는 방법으로, 묶인 속성 중의 하나라도 변경되면 그 시점의 묶인 속성 전체를 이력 데이터로 그대로 쌓는 방법이다.

선분이력

선분이력 방법은 데이터가 유효한 시작 시점과 종료 시점을 관리하는 방법이다. 특정 데이터가 변경된 시작일자와 변경 전의 종료일자가 이어지도록 인위적으로 데이터를 관리하는 것이 핵심이다. 만약 하나의 인스턴스가 세 번 수정되었을 때, 세 개의 시작 시점과 종료 시점을 연결하면 하나의 선분이 돼야 한다.

비정규화 이야기

비정규화에 대한 서설

비정규형 모델은 단순이 정규화를 하지 않은 모델이 아니라, 정규화를 마친 후에 비정규화를 한 모델이다. 정규화가 끝나야 비정규화를 할 수 있다.

비정규화(Denormalization)는 조회 성능을 향상시키기 위해 데이터를 중복하거나 그룹핑하는 과정을 의미한다. 비정규화는 사실상 조회 성능만을 향상시키기 위한 기법으로 DBMS의 물리적인 내용과 밀접하게 연관돼 있다.

비정규화 원칙

  • 최우선적으로 고려할 요소는 데이터 무결성이다.
  • 정규형은 필수며, 성능 문제가 있을 때만 비정규형을 채택한다.
  • 중복 속성은 가능한 사용하지 않으며, 추출 속성은 일부 사용할 수 있다.

비정규화의 단점

정합성

데이터를 중복시키는 것이 비정규화의 핵심인데, 중복된 데이터는 정합성이 훼손될 가능성이 항상 존재한다. 중복이 많을수록 데이터 정합성이 저하돼 궁극적으로 데이터의 품질은 떨어지게 된다.

쓰기 성능 저하

비정규화를 하는 유일한 이유는 읽기(Read: Select) 성능을 향상시키는 것이다.

데이터 성격이 불명확

비정규화의 단점 중에 간과할 수 없는 것이 데이터 성격이 불명확해진다는 것이다. 정규화를 완전하게 거치지 않은 채 처음부터 비정규형을 사용한 경우는 말할 것도 없고, 데이터 성격이 명확해지도록 정규화를 한 후에 비정규화를 한 경우도 결국 데이터 성격이 불명확해질 수 있다. 즉 많은 중복 속성 때문에 엔터티의 성격이 명확하지 않을 수 있다.

모델 확장성 저하

개발 어려움

공간 차지

데이터베이스 공간을 많이 차지하면 일반적으로 성능에 나쁜 영향을 미친다.

일부 조회 성능 저하

만약 한 엔터티에 많은 중복 속성이 있으면 인스턴스의 길이가 늘어난다. 그러면 하나의 블록에 존재할 인스턴스가 두 개의 블록에 존재할 수 있다. 따라서 오히려 조회할 때 속도가 늦어진다.

비정규화 과정

  1. 함수 종속을 적용해 정규화
  2. 성능 문제 발생 요건 도출
  3. 비정규화 외에 다른 방안 검토
  4. 비정규화 수행
  5. 정합성 구현 방안 검토

비정규화 외에 다른 방안 검토

데이터베이스 기능과 관련된다.

  • 뷰를 사용해서 조인 문제를 해결할 수 있는지 검토
  • 파티션으로 데이터를 나눠서 해결할 수 있는지 검토
  • 클러스터링이나 IOT(Index Oriented Table) 같은 특수 형태의 테이블을 사용해서 해결할 수 있는지 검토
  • 인덱스를 조정하거나 힌트(Hint) 등으로 해결할 수 있는지 검토
  • 그밖에 DBMS의 최신 기술을 적용해 해결할 수 있는지 검토
profile
새로운 기술을 배우는 것을 좋아하는 엔지니어입니다!

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN