현실 세계의 정보들을 컴퓨터에 표현하기위해 단순화, 추상화하여 체계적으로 표현한 개념적 모형
테이블에서 일부 속성들의 종속으로 인해 중복이 발생하고, 중복으로 인해 테이블 조작 시 분제가 발생하는 현상
함수적 종속 - 데이터의 의미를 표현하는 것, 현실세계를 표현하는 제약조건이 되는 동시에 DB에서 항상 유지되어야할 조건
정규화의 개념 - 테이블의 속성들이 상호 종속적인 관계를 갖는 특성을 이용해 테이블을 무손실 손해하는 과정
목적 : 중복을 최대한 제거해 삽입, 삭제, 갱신 이상을 줄이는 것
정규화 과정(직접 적고 이해하기)
테이블 : DB의 가장 기본적인 오브젝트
로우(Row) - 튜플, 인스턴스
컬럼(Column) - 각 속성 항목에 대한 값을 저장
기본키(Promary Key) - 후보키 중에 선택한 주키(Main key), 한 릴레이션에서 특정 튜플을 유일하게 구별할 수 있는 속성
외래키(Foreign Key) - 다른 릴레이션의 기본키를 참조하는 속성 또는 속성들의 집합
[표 그리기]
엔티티(Entity)를 테이블로 변환
논리 데이터 모델에서 정의된 엔티티를 물리 데이트 모델의 테이블로 변환
엔티티를 테이블로 변환 후 테이블 목록 정의서를 작성
엔티티 -> 테이블
속성 -> 컬럼
주 식별자 -> 기본키
외부 식별자 -> 외래키
관계 -> 관계
변환 시 고려사항
테이블과 엔티티 명칭 동일
테이블은 소스코드의 가독성 위해 영문사용
관계를 외래키로 변환
1:1관계 - 개체 a의 기본키를 개체b의 외래키로 추가하거나 개체b의 기본키를 개체a의 외래키로 추가하여 표현
1:N관계 - 개체a의 기본키를 개체b의 외래키로 추가하여 표현하거나 별도의 테이블로 표현
N:M관계 - 릴레이션a와 b의 기본키를 모두 포함한 별도의 릴레이션(교차 릴레이션, 교차 엔티티)으로 표현
1:M 순환 관계 - 개체a에 개체a의 기본키를 참조하는 외래키 컬럼을 추가하여 표현, 데이터의 계층구조를 표현하기 위해 주로 사용
데이터 타입 선택
CHAR - 고정길이 문자열 Data 최대 2,000Byte 까지 저장 가능
VARCHAR2 - 가변길이 문자열 Data 최대 4,000Byte 까지 저장 가능
NUMBER - 38자릿수의 숫자 저장가능
DATE - 날짜저장
시스템의 성능향상, 개발 및 운영의 편의성을 위해 정규화된 데이터 모델을 통합, 중복, 분리 하는 과정 / 의도적으로 정규화 원칙을 위배하는 행위 / 효율성 증가하지만 과도한 정규화는 성능 저하
테이블 통합
두개의 테이블이 조인되는 경우가 많아 하나로 합쳐 사용하는 것이 도움이 될 경우 수행
검색은 간편하지만, 레코드 증가로 처리량 증가
입력, 수정, 삭제 규칙이 복잡해질 수 있음
not null, default, check등의 제약조건을 설계하기 어려움
테이블 분할
수평분할 : 레코드를 기준으로 분할
수직분할 : 속성을 기분으로 분할, 갱신위주/ 자주조회 / 크기 큰 / 보안적용
기본키의 유일성 관리 어려움
사용 빈도 낮을 경우 분할필요고려
수행속도 느려질 수 있음
데이터 검색에 중점을 두어 테이블 분할여부를 결정
정규화로 수행속도 느려지는 경우
많은 범위의 데이터를 자주처리해야 하는경우
특점범위 데이터만 자주처리하는 경우
범위를 줄이지 않고는 속도개선이 없는 경우
조인이 자주 발생하는 속성인 경우
접근경로가 복잡한 속성인 경우
액세스의 조건으로 자주 사용되는 속성인 경우
기본키의 형태가 적절하지 않거나 여러개의 속성으로 구성된 경우
<중복 속성 추가 시 고려사항>
테이블 중복과 속성의 중복을 고려
데이터 일관성 및 무결성 유의
SQL 그룹 함수를 이용해 처리가능해야함
저장 공간의 낭비 고려
인덱스는 데이터 레코드를 빠르게 접근하기 위해 <키, 값, 포인터> 쌍으로 구성되는 데이터 구조
인덱스는 데이터가 저장된 물리적 구조와 밀접한 관계
레코드가 저장된 물리적 구조에 접근하는 방법을 제공
인덱스를 통해 파일의 레코드에 대한 엑세스를 빠르게 수행
삽입삭제가 수시로 일어나는 경우 인덱스 갯수를 최소화 하는 것이 효율적
인덱스가 없으면 특정한 값을 찾기위해 모든 데이터 페이지를 확인하는 TABLE SCAN 발생
클러스터드 인덱스 - 인덱스 키의 순서에 따라 정렬되어 저장, 원하는 데이터를 빠르게 찾을 수 있음
데이터 삽입, 삭제 시 순서 유지위해 데이터 재정렬, 한개의 릴레이션 한개의 인덱스
트리기반 인덱스
인덱스를 저장하는 블록들이 트리구조를 이루고 있는 것
B트리 인덱스 : 일반적으로 사용, 루트에서 하위로 값을 비교해 데이터 검색, 포인터들이 오름차순
B+트리 인덱스 : B트리의 변형으로 단말노드가 아닌 노드로 구성된 세트와 단말노드로만 구성된 순차세트로 구분
비트맵 인덱스
데이터를 Bit 값인 0또는 1로 변환하여 인덱스 키로 사용하는 방법
목적 : 키 값을 포함하는 로우의 주소를 제공
분포도가 좋은 컬럼에 적합, 논리연산 가능, 저장공간이 작음, 압축효율 좋음
함수기반 인덱스
컬럼의 값 대신 컬럼에 특정 함수나 수식을 적용하여 산출된 값을 사용, B트리 비트맵 인덱스를 생성해 사용
비트맵 조인 인덱스
다수의 조인된 객체로 구성, 단일 객체로 구성된 일반 인덱스와 액세스 방법이 다르다.
비트맵 인덱스와 물리적 구조 동일
도메인 인덱스
개방자가 필요한 인덱스를 직접 만들어 사용, 확장형 인덱스
인덱스 대상 테이블 선정 기준
MULTI BLOCK READ 수에 따라 판단
랜덤 액세스가 빈번한 테이블
특정 번위나 특정 순서로 데이터 조화가 필요한 테이블
다른 테이블과 순차적 조인이 발생되는 테이블
인덱스 설계시 고려사항
새로 추가되는 인덱스는 기존 경로에 영향 가능성
인덱스 많으면 오버헤드 발생
넓은 범위를 인덱스로 처리 시 오버헤드 발생
인덱스 생성시 추가적인 저장공간 필요
인덱스와 테이블 데이터의 저장공간이 분리되도록 설계
뷰는 사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 하나 이상의 기본 테이블로부터 유도된, 이름을 가지는 가상테이블
저장장치 내에 물리적으로 존재 X, 사용자에게는 있는 것처럼 간주
조인문의 사용 최소화로 사용상의 편의성을 최대화
기본 테이블로 유도된 테이블이라 기본테이블과 같은 형태, 조작도 거의 비슷
가상이라 물리적으로 구현 X
논리적 독립성
필요한 데이터만 뷰로 정의해서 처리가능하기 때문에 관리 쉽고 명령문 간단
장점 : 논리적 독립성동일 데이터에 대해 동시에 여러 사용자의 상이한 응용이나 요구 지원, 데이터 관리 간단, 자동보안
단점 : 독립적인 인덱스 X, 뷰의 정의 변경 X, 삽입 삭제 갱신연산에 제약이 따름
설계 순서 : 데이블 선정 -> 대상 컬럼 선정 -> 정의서 작성
데이터 저장 시 데이터 액세스 효율을 향상시키기 위해 동일한 성격의 데이터를 동일한 데이터 블록에 저장하는 물리적 저장 방법
데이터 조회속도 향상 but 데이터 입력, 수정, 삭제에 대한 성능은 저하
분포도가 넓을 수록 유리 -> 클러스터링하면 저장 공간 절약
클러스터링 된 테이블은 열을 공유해 저장공간이 줄어듬
대용량 처리하는 트랜잭션은 전체스캔이 잦아 클러스터링 X
처리범위가 넓음 -> 단인 테이블 클러스터링
조인이 많이 -> 다중 테이블 클러스터링
파티셔닝 된 테이블은 클러스터링 X
클러스터 대상 테이블 - 분포도 넓음, 대량범위 자주조회, 입력 수정 삭제가 자주발생X, 자주조인, ORDER BY GROUP BY UNION이 빈번한 테이블
대용량의 테이블이나 인덱스를 작은 논리적 단위인 파티션으로 나누는 것
처리는 테이블단위, 저장은 파티션별로 수행
장점
접근 시 액세스 점위를 줄여 쿼리 성능이 향상
데이터가 분산 저장되어 디스크 성능 향상
속도가 빠름, 시스템 장애 시 손상 최소화
파티션 단위로 입 출력 분산
단점
세심한 관리 필요, 조인에 대한 비용 증가, 용량작은 테이블에 파티셔닝 시 성능 저하
범위 분할 - 지정한 열의 값을 기준으로 분할
해시 분할
해시함수를 정룔한 결과 값에 따라 데이터 분항
특정 파티션에 데이터 집중되는 범위분할의 단점보완, 데이터를 고르게 분산 시 유용
특정데이터 위치 판단X, 데이터가 고른 컬럼(주민번호 등)에 효과적
조합 분할 - 범위분할 후 해시함수 적용 해 다시 분할, 범위분할해도 파티션이 클 때 유용
파티셔닝키 선정 시 고려사항
테이블 접근 유형에 따라 파티셔닝이 이뤄지도록 선정
관리의 용이성을 위래 이력성 데이터는 파티션 생성주기와 소멸주기를 일치시켜야 함
인덱스 파티션
파티션된 테이블의 데이터를 관리하기 위해서 인덱스를 나눈 것
Local Partitioned Index : 테이블 파티션과 인덱스 파티션이 1:1 대응
Global Partitioned Index : 테이블 파티션과 인덱스 파티션이 독립적 구성
Local Partitioned Index가 Global Partitioned Index에 비해 데이터 관리 쉬움
인덱스 파티션은 인덱스 파티션키 컬럼의 위치에 따라 Prefixed Partitioned Index와 Non-Prefixed Partitioned Index로 나뉜다
Prefixed Partitioned Index : 인덱스 파티션키와 인덱스 첫 번째 컬럼이 같음
Non-Prefixed Partitioned Index : 인덱스 파티션키와 인덱스 첫 번째 컬럼이 다름
Local과 Global, Prefixed와 NonPrefixed를 조합하여 여러가지로 구성해 사용