1. 물리 데이터 모델링 

 

논리모델을(ER Model) 적용하기 위해서 적용 대상에 기술을 맞추고 상세화 하는 과정을 물리 데이터 모델링(Physical Model)이라 합니다.

 

물리 데이터 모델링으로 변환하는 절차는 다음과 같습니다.

 

개체(Entity)를 테이블(Table)로 변환 합니다. 또한 속성(Attribute)을 컬럼(Column)으로 변환하고 UID(User ID: 사용자 식별자)를 기본키(Primary Key)로 변환합니다. 그 후 관계(Relationship)를 외래키(Foreign Key)로 변환하면 논리 모델이 가지고 있던 모든 특징을 물리 데이터 모델링 형식으로 표현하게 됩니다.

 

여기에서 끝나는게 아니라 물리 데이터 모델링을 하기 위해서는 추가적으로 해야할 일이 있습니다. 먼저 속성이 변환된 컬럼(Column)에 대한 길이와 타입을 정의 합니다. 그리고 마지막으로 물리 데이터 모델링에서 제일 중요한 반 정규화가 수행되어야 합니다.

 

반 정규화는 정규화 된 엔티티와 속성, 관계에 대해서 성능을 향상시키고 개발 운영을 단순화하기 위해 중복통합과 분리 등을 수행하는 데이터 모델링 기법입니다. 즉, 정규화과정에서는 중복을 제거하고 합치는 행위를 통해 엔티티의 이상현상을 줄이지만 반 정규화는 그와 반대의 행위를 함으로 정규화 과정이 가져온 성능 저하를 개선하는 효과를 가져옵니다.

 

 

2. 참조무결성 제약조건 (Constraint) 

 

물리데이터 저장소를 구성하기 위해서는 DBMS 선정이 필요합니다. 이때 테이블에 거는 제약조건이 바로 참조무결성 제약조건입니다. 

 

릴레이션과 그 사이의 일관성을 위해 약속한 조건들을 참조 무결성 제약조건이라 말합니다. 두 릴레이션 A, B가 기본키와 외래키를 통해 참조 관계를 형성하고 있습니다. 이 경우 B의 외래키의 값은 참조되고 있는 릴레이션 A의 기본키로 있어야 합니다. 

 

다음과 같이 참조무결성을 지키기 위한 여러 방법들이 있습니다.

 

첫번째 방법은 제한(Restricted)입니다. 제한의 경우 참조무결성 원칙을 위배하는 연산을 거절하게 됩니다. 

두 릴레이션 A, B가 있으면 릴레이션 A가 릴레이션 B를 참조하고 있으면 현재 참조되고 있는 릴레이션 B의 튜플을 삭제하지 못하게 제한 합니다. 이처럼 참조 무결성 제약조건에 따라 삭제 연산을 거절하게 됩니다.

 

두번째 방법은 연쇄(Cascade)입니다. 연쇄의 경우는 참조무결성 원칙을 지키기 위해 연관성있는 튜플이 같이 희생됩니다. 위의 예시와 마찬가지로 두 릴레이션 A, B가 있고 릴레이션 A가 릴레이션 B를 참조하고 있다고 가정해봅시다. 연쇄의 경우 릴레이션 A가 참조하고 있는 릴레이션 B의 튜플에 삭제 연산을 주면 릴레이션 A에도 영향을 미쳐 참조되던 튜플도 삭제시킵니다. 이처럼 두 릴레이션을 건드려 참조 무결성을 지키는 것을 연쇄라고 합니다.

 

마지막 방법은 널 값(Nullify)입니다. 개인적으로 세 방법 중 가장 쉬운 방법으로 Null을 이용하여 참조 무결성을 지키는 방법입니다. 마지막 예시입니다.  릴레이션 A, B가 위와 같은 형태로 참조 중이고 삭제 연산이 일어나게 된다면 릴레이션 A가 가지고 있던 외래키에 Null을 넣어 참조 무결성을 지키게 됩니다.

 

 

세 방법을 한줄로 요약하자면 제한은 연산을 거절하고 연쇄는 두개가 다 영향을 미칩니다. 마지막으로 널 값은 Null을 이용해 참조가 없는 것으로 변경합니다. 각 특징을 이해하고 구분하셔야 합니다. 

 

 

3. 인덱스(Index)

 

인덱스는 저장공간에 영향을 끼치기 때문에 물리데이터 저장소를 구성할때 고려하셔야합니다.

 

데이터베이스 내부의 열에 대한 정보를 구성해 검색연산을 최적화하는 데이터 구조를 인덱스라합니다. 인덱스를 이용하면 불필요한 전체 데이터 검색이 아닌 필요한 정보에 대해서 빠른 접근이 가능해집니다.

 

 

데이터는 테이블에 평균적으로 분포되어 있어야합니다. 이를 확인하기 위해 분포도를 확인해야 하는데 이 분포도가 10~15% 사이여야 적절한 인덱스라 부릅니다. 즉 우리는 분포도를 통해 적절한 인덱스를 판별 가능합니다.

 

이 분포도가 적정한지 구하는식은 다음과 같습니다.

- 분포도 = (1 / (컬럼 값의 종류)) * 100

- 분포도 = (컬럼 값의 평균 Row 수) / (테이블의 총 Row 수) * 100

 

분포도가 범위 이상인 경우 전체처리가 아닌 부분처리 목적으로 이용하기 위해 인덱스에 적용하거나, 조회와 출력으로 사용되는 경우, 인덱스에서 자동생성된 기본기나 Unique Key의 제약조건을 사용할 경우 등에 인덱스에 적용할 수 있습니다.

 

결국 분포도는 인덱스 판별에 중요한 역할을 하지만 위와 같은 예외의 경우도 존재하므로 언제나 분포도를 따른다는 말은 맞지 않습니다. 

 

 

인덱스의 컬럼 선정시 가장 먼저 확인 해야할 사항은 수정 횟수와 위에서 설명한 분포도입니다. 수정이 드물거나 분포도가 좋으면 컬럼을 단독으로 생성합니다. 또한 자주 조합되는 컬럼이 생기면 이를 결합 인덱스로 만들게됩니다. 결합 인덱스가 되면 사용빈도와 유일성, 정렬등 컬럼 순서 선정에 특히 유의하셔야합니다. 

 

 

인덱스 설계시 지나치게 많은 인덱스가 생길 경우 오버헤드(Overhead)로 작용될 수 있음을 유의하셔야합니다. 범위가 넓은 인덱스를 처리할 경우에도 오버헤드가 발생할 수 있습니다. 또한 인덱스 설계시 인덱스가 추가적인 저장공간이 필요하다는걸 반드시 이해하시고 설계를 진행하셔야합니다. 마지막으로 고려해야할 점은 인덱스가 테이블의 저장공간과 분리되어 있도록 설계하면 됩니다.

 

이런 유의 사항들만 지키면 인덱스는 검색연산을 수행할 때 빠른 조회가 가능하게됩니다.

 

 

3. 뷰(View) 

는 사용자에게 기존 테이블에서 제한 된 자료를 보여주기 위해 유도된 가상 테이블입니다. 가상 테이블이므로 물리적으로 존재하지 않지만 Join사용을 최소화해 편의성이 늘어나는 특징이 있습니다.

 

뷰에서 주로 사용하는 속성은 다음과 같습니다.

뷰가 이미 존재하는 경우 재생성 하는 REPLACE와 테이블의 존재여부를 따지지 않고 무조건 뷰를 생성하는 FORCE. 마지막으로 기존의 테이블이 반드시 존재해야지만 뷰를 생성하는 NOFORCE로 나눠져 있습니다.

 

뷰를 설계할때에는 반드시 최적의 액세스 경로를 사용해야하며 잘못 수행할 경우 수행속도가 문제가 발생할 수 있으므로 이점을 유의하시면서 설계하시면 됩니다.

 

 

4. 클러스터 (Cluster)

인덱스는 대부분 분포도가 10~15%라는 적정범위안에 드는걸 선호합니다. 하지만 클러스터의 경우는 분포도가 넓은 경우를 선호하는 설계기법입니다.

 

분포도가 넓은 테이블을 클러스터로 만들게 되면 생기는 장점은 저장공간이 절약되며 대량의 범위 액세스에 유리해집니다. 또한 인덱스가 가진 검색속도의 향상도 가져옵니다.

 

 

그러나 완벽해보이는 클러스터도 유의해야할점이 존재합니다. 입력하거나 수정, 삭제시에 부하가 증가하게 되며 UNION과 DISTINCT, ORDER BY, GROUP BY가 빈번한 컬럼이면 검토대상이됩니다. 또한 수정이 자주 발생하지 않더라도 검토대상에 들어가게 됩니다.

 

 

5. 파티션 (Partition)

마지막기법은 파티션닝입니다. 파티셔닝을 통해 데이터 베이스를 분산 처리하여 성능 저하를 방지하고 관리를 수월하게 할 수 있습니다. 

 

파티션은 레인지 파티셔닝, 해시 파티셔닝, 리스트 파티셔닝, 컴포지트 파티셔닝으로 나눠집니다.

 

가장 먼저 레인지 파티셔닝(Range Partitioning)에 대해 이야기 해보겠습니다. 레인지 파티셔닝은 연속되는 숫자나 날짜를 기준으로 나누는 파티션 기법입니다. 장점으로는 관리가 쉬워 관리 시간을 단축시킬수 있습니다.

 

두번째는 해시 파티셔닝(Hash Partitioning)입니다. 해시 파티셔닝은 해시 함수 값을 파티션 키로 두는 파티션 기법입니다. 해시 파티셔닝은 균등하게 나눌수 있으며 질의 성능도 향상시킬 수 있다는 장점이 있습니다.

 

다음은 리스트 파티셔닝(List Partitioning)입니다. 리스트 파티셔닝은 파티션에 저장 될 데이터에 대해 명시적으로 제어 가능한 파티셔닝 기법입니다. 리스트 파티셔닝은 분포도가 대략적으로 비슷하며 많은 데이터나 컬럼 조건이 많을 경우에 좋은 성능을 보여줍니다.

 

마지막은 컴포지트 파티셔닝(Composite Partitioning)입니다. 컴포지트 파티셔닝은 범위로 분할 후 해시 함수를 적용시켜 재분할하는 파티션 기법입니다. 컴포지트 파티셔닝은 큰 파티션을 여러 파티션으로 분산 할 수 있다는 장점이있습니다.

 

 

파티션을 이용하면 데이터의 액세스 범위가 줄어 성능이 향상되고 데이터의 훼손 가능성이 낮아져 가용성이 향상됩니다. 또한 분할 된 영역이 각자 백업과 복구가 가능하고 디스트 컨트롤러에 대한 경합이 현저히 감소하게 되는 장점이 있습니다.

 

 

6. 디스크(Disk)

디스크는 정확한 용량만 사용해 디스크 사용효율을 높이고 입출력에 대한 경합이 최소화하여 데이터의 접근 성능을 향상시키게 됩니다.

 

+ Recent posts