성능 데이터 모델링의 개요

 

성능 데이터모델링이란?

데이터베이스 성능 향상을 목적으로 설계단계의 데이터 모델링 때부터 성능과 관련된 사항이 데이터 모델링에 반영될 수 있도록 하는 것

 

 

 

성능 데이터모델링 수행 절차

1. 데이터모델링을 할 때 정규화를 정확하게 수행한다.

 

2. 데이터베이스 용량산정을 수행한다.

    용량산정은 전체적인 데이터베이스에 발생되는 트랜잭션의 유형과 양을 분석하는 자료가 된다.

 

3. 데이터베이스에 발생되는 트랜잭션의 유형을 파악한다.

 

4. 용량과 트랜잭션의 유형에 따라 역정규화를 수행한다.

 

5. 이력모델의 조정, PK/FK 조정, 슈퍼타입/서브타입 조정 등을 수행한다.

 

6. 성능 관점에서 데이터 모델을 검증한다.

 

 

 


정규화

정규화 단계와 조건

  • 제1정규화 - 테이블의 컬럼이 원자값을 가지도록 테이블을 분해
  • 제2정규화 - 완전 함수 종속을 만족하도록 테이블을 분해
  • 제3정규화 - 이행적 함수 종속을 없애도록 테이블을 분해
  • BCNF(강화된 제 3정규화) - 모든 결정자가 후보키가 되도록 테이블을 분해

 

 


반정규화

테이블 반정규화 분류 반정규화 기법 내용
테이블 병합 1:1 관계 테이블 병합 1:1 관계를 통합해서 성능 향상
1:M 관계 테이블 병합 1:M 관계를 통합해서 성능 향상
슈퍼/서브타입 테이블 병합 슈퍼/서브 관계를 통합해서 성능 향상
테이블 분할 수직분할 칼럼단위의 테이블을 디스크 I/O를 분산처리 하기 위해 테이블을 1:1로 분리하여 성능향상
-> 트랜잭션의 처리되는 유형 파악을 먼저 해야함
수평분할 로우 단위로 집중 발생되는 트랜잭션을 분석해서 성능 향상을 위해 로우 단위로 데이터를 쪼갬
-> 관계음슴
테이블 추가 중복테이블 추가 다른 업무거나 서버가 다른 경우, 동일한 테이블 구조를 중복해서 원격 조인 같은거를 안하도록 함
통계테이블 추가 SUM, AVG같은걸 미리 계산해둠으로써 조회 성능 향상
이력테이블 추가 이력테이블 중에서 마스터 테이블에 존재하는 레코드를 중복해서 이력 테이블에 존재하는 방법은 반정규화의 유형
부분테이블 추가 하나의 테이블의 전체 칼럼 중 자주 이용하는 집중화된 칼럼이 있을 때, 이러한 칼럼들을 모아놓은 별도의 부분테이블을 추가하는 유형
칼럼의 반정규화 기법 내용
중복칼럼 추가 조인에 의해 처리할때, 조인을 감소시키기 위해 중복된 칼럼을 위치시킴
파생칼럼 추가 트랜잭션이 처리되는 시점에 계산에 의해 발성되는 성능 저하를 예방하기 위해 미리 값을 계산해서 칼럼에 보관
이력테이블 칼럼 추가 대량의 이력데이터를 처리할 때 불특정 날 조회나 최근 값을 조회 할 때 나타날 수 있는 성능 저하를 예방하기 위해 이력 테이블에 기능성 칼럼을 추가
PK에 의한 칼럼 추가 복합의미를 가지는 PK를 단일 속성으로 구성할 경우 발생됨. 단일 PK안에서 특정값을 별도로 조회하는 경우 성능 저하가 발생할 수 있으므로 일반속성으로 포함하는 방법임
응용시스템 오작동을 위한 칼럼 추가 업무적으로는 의미가 없으나 사용자가 데이터 처리를 하다가 잘못 처리하여 원래 값으로 복구하기를 원하는 경우 이전 데이터를 임시적으로 중복해서 보관하는 기법

 

반정규화 말고 다르게 처리하는 방법?

  • 뷰를 사용 >> 조인이 많이 해야하는 경우 
  • 클러스터링 적용, 인덱스 조정 >> 대량의 데이터 처리나 부분처리
  • 파티셔닝 기법 >> 대량의 데이터를 PK의 성격에 따라 부분적인 테이블로 분리
  • 응용 애플리케이션에서 구사하는 로직 변경

표준조인(Standard Join)

1) INNER JOIN

동일한 값이 있는 행만 반환된다. 

반드시 USING이나 ON조건절을 동반한다.

SELECT  A.ID A.NAME B.ID B.DATE
FROM STUDENT A INNER JOIN REGISTER B
ON A.ID=B.ID;

2) NATURAL JOIN

SQL Server은 지원하지 않는 기능이며 where절에서 JOIN조건은 정의 할 수 없다.

일치되는 모든 컬럼들에 대해서 JOIN이 이루어진다.

별명사용이 불가하다고 한다.

SELECT ID NAME DATE
FROM STUDENT NATURAL JOIN REGISTER;

 

3) USING 조건절

이친구도 별명사용이 불가하다고 한다.

동일한 이름을 가진 컬럼중 원하는 컬럼을 선택해서 조인할 수 있다. SQL Server은 지원하지 않는다.

SELECT ID NAME DATE
FROM STUDENT JOIN REGISTER
USING (ID);

 

4) ON 조건절

이친구는 별명 쓰는게 가능하다. 이친구는 USING과 다르게 컬럼명이 달라도 조인을 사용할 수 있지만 정확하게 어느 테이블의 컬럼인지 지정해주어야한다.

SELECT  A.ID A.NAME B.ID B.DATE
FROM STUDENT A JOIN REGISTER B
ON (A.ID=B.ID);

 

(+)

ON 조건절은 WHERE절과 충돌 없이 사용 가능하다

SELECT  A.ID A.NAME B.ID B.DATE
FROM STUDENT A JOIN REGISTER B
ON (A.ID=B.ID)
WHERE B.DATE = '20210831';

WHERE과 큰 차이점은 WHERE은 해당 절을 추출하지만, ON 조건절은 해당 부분만 JOIN하고 나머지 부분도 존재한다는 것이다.

 

5) 다중 테이블 JOIN

SELECT  A.ID A.NAME B.ID B.DATE
FROM STUDENT A JOIN REGISTER B
ON A.ID=B.ID
JOIN PROFESSOR C
ON B.PROFESSOR_ID = C.ID;
SELECT  A.ID A.NAME B.ID B.DATE
FROM STUDENT A, REGISTER B
WHERE A.ID=B.ID;

 

 

6) CROSS JOIN

두 테이블간 JOIN조건이 없는경우 모든 경우의 데이터 조합을 말한다.

CARTESIAN PRODUCT나 CROSS PRODUCT라고 부르기도 한다.

SELECT  A.ID A.NAME B.ID B.NAME
FROM STUDENT A, PROFESSOR B
ORDER BY A.ID;

 

 

7)OUTER JOIN

LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN

해당 방향쪽으로 조인시 없는 데이터도 다 포함해서 출력된다.

 

 

 

 

 

 


오라클에서의 JOIN

LEFT OUTER JOIN

SELECT  A.ID A.NAME B.ID B.NAME
FROM STUDENT A, PROFESSOR B
WHERE A.ID = B.ID(+);

RIGHT OUTER JOIN

SELECT  A.ID A.NAME B.ID B.NAME
FROM STUDENT A, PROFESSOR B
WHERE A.ID = B.ID(+);

FULL OUTER JOIN은 표현할 수 없다.

 

 

 

 

 


집합 연산자

1) UNION (중복을 포함하지 않는 합집합)

중복되지 않는 데이터는 포함하지 않는다.

원래 있던 중복도 없어진다.

앞에나온 테이블 명을 따라간다.

SELECT ID, NAME
FROM STUDENT
UNION
SELECT ID, NAME
FROM OTHER_STUDENT;

2) UNION ALL (중복을 포함하는 합집합)

중복되는 데이터도 포함한다.

앞에나온 테이블 명을 따라간다.

SELECT ID, NAME
FROM STUDENT
UNION ALL
SELECT ID, NAME
FROM OTHER_STUDENT;

3) INTERSECT (교집합)

SELECT ID, NAME
FROM STUDENT
INTERSECT
SELECT ID, NAME
FROM OTHER_STUDENT;

4) MINUS (차집합)

SELECT ID, NAME
FROM STUDENT
MINUS
SELECT ID, NAME
FROM OTHER_STUDENT;

 

 

 

 


계층형 쿼리

상하 수직관계의 트리형태의 구조로 이루어진 형태

SELECT 컬럼
FROM 테이블명
WHERE 조건
START WITH 최상위 조건
CONNECT BY [NOCYCLE][PRIOR 계층형 구조 조건];

https://coding-factory.tistory.com/461 << 좋은 예시! 이해안가면 다시보기

 

[Oracle] 오라클 계층형 쿼리(START WITH.. CONNECT BY)

계층형 쿼리란? 계층형 구조는 상하 수직관계의 트리형태의 구조로 이루어진 형태를 말합니다. 예를 들자면 특정회사의 부서, 특정학교의 학과등이 있습니다. 계층형 쿼리는 테이블에 저장된

coding-factory.tistory.com

용어 기능
START WITH 최상위노드
CONNECT BY PRIOR A = B B->A방향으로 데이터가 전개됨
대체로 B가 부모, A가 자식이다
ORDER SIBLINGS BY 계층 내에서 정렬 가능

뷰(View)

장점

1. 독립성 : 테이블 구조가 변경되어도 뷰를 사용하는 응용프로그램은 변경하지 않아도 된다.

2. 편리성 : 복잡한 질의를 뷰로 생성함으로써 관련 질의를 단순하게 작성할 수 있다. 

3. 보안성 : 직원의 급여정보와 같이 숨기고 싶은 정보는 사용자로부터 감출 수 있다.

 

 


그룹함수

 

https://velog.io/@dongchyeon/%EC%98%A4%EB%9D%BC%ED%81%B4Oracle-%EA%B7%B8%EB%A3%B9-%ED%95%A8%EC%88%98-ROLLUP-CUBE-GROUPING-%EB%93%B1

 

[오라클(Oracle)] 그룹 함수 (ROLLUP, CUBE, GROUPING 등)

그룹 함수에 대해 정리해보자.

velog.io

https://myjamong.tistory.com/173

 

[Oracle] 오라클 GROUP BY ROLLUP, CUBE, GROUPING SETS 정리 :: 마이자몽

GROUP BY 특정 칼럼들을 기준으로 그룹화하여 합산, 평균, 최고값, 최소값 등의 수치를 확인하기 위해 GROUP BY 절을 이용합니다. 부서별 연봉 평균, 반 시험 최고 점수, 매장별 재고량과 같이 하나의

myjamong.tistory.com

 


옵티마이저와 실행계획

사용자가 질의한 SQL문에 대해 최적의 실행방법을 결정하는 역할

그리고 그 최적의 실행방법을 실행계획이라 한다.

어디까지나 계획이기 때문에 실제 정보와 다를 수 있다.

 

-규칙기반 옵티마이저(RBO, Rule Based Optimizer)

우선순위가 높은 규칙이 적은 일량으로 해당 작업을 수행하는 방법

제일 낮은 우선순위는 전체 테이블 스캔이고 제일 높은 우선순위는 ROWID,인덱스를 활용해서 테이블을 액세스하는 방법이다.

-비용기반 옵티마이저(Cost Based Optimizer)

SQL문을 실행하는데 소요될 처리시간 및 CPU, I/O 자원량 등을 계산하여 가장 효율적일 것으로 예상되는 실행계획을 선택

 


INDEX

원하는 데이터를 속도적인 측면에서 빠르게 찾을 수 있도록 만든 것

DML작업시 INDEX도 변경해야 하기 때문에 오히려 느려질 수 있음에 주의해야한다.

 

종류

1) B-트리 인덱스

   브랜치 블록과 리프블록으로 구성되며, 브랜치 블록은 분기를 목적으로 하고, 

   리프블록은 인덱스를 구성하는 컬럼의 값으로 정렬된다.

   일반적으로 OLTP시스템 환경에서 많이 사용된다.

 

2) 비트맵 인덱스

   시스템에 사용될 질의를 시스템 구현 시에 모두 알 수 없는 경우인 DW 및 AD-HOC 질의 환경을 위해서

   설계되었으며, 하나의 인덱스 키 엔트리가 많은 행에 대한 포인터를 저장하고 있는 구조

 

3) 클러스터드 인덱스

   인덱스의 리프 페이지가 곧 데이터 페이지이며, 리프 페이지의 모든 데이터는

   인덱스 키 컬럼 순으로 물리적으로 정렬되어 저장

  

 

DDL(Data Definition Language)

테이블과 같은 데이터 구조를 정의하는데 사용하는 명령어들

Oracle에서는 DDL명령후 자동 커밋을 수행하지만, MYSQL에서는 직접 커밋해주어야 한다.

 

1) CREATE

테이블 생성

테이블 이름 명명 조건 : 테이블과 컬럼명은 무조건 문자로 시작해야하고 특수문자는 " _ $ # "만 사용 가능

CREATE table 테이블이름(
	컬럼명 데이터타입 조건,
	컬럼명 데이터타입 조건,
      . . .
)
데이터타입 의미
CHAR 특정 문자열 개수 지정 ex) char(10)
VARCHAR 가변 문자열 지정 (현재 오라클 사용 안함)
VARCHAR2 가변 문자열 지정 (MYSQL, MariaDB지원 안함)
NUMBER 숫자 저장(정수, 실수) (MYSQL, MariaDB은 INT)
DATE 날짜에 사용하는 데이터 타입
제약조건 의미
NOT NULL Null을 허용하지 않음!
UNIQUE 중복 불가! (null은 가능!)
PRIMARY KEY 기본키로 지정한다는 뜻으로 테이블 당 하나만 가능
FOREGIN KEY 외래키로 지정한다는 뜻으로 references 키워드와 같이 쓰임
CHECK 컬럼에 입력되는 데이터를 체크해 특정 조건에 맞는 데이터만 입력 받음
DEFAULT 만약 값이 없으면 디폴트 값을 부여
참조동작 의미
RESTRICT 개체를 변경/삭제 때 다른 개체가 변경/삭제할 개체를 참조하고 있을 경우 취소(제한한다)
CASCADE 개체를 변경/삭제 때 다른 개체가 변경/삭제할 개체를 참조하고 있을 경우 함께 변경/삭제
NO ACTION MySQL에서는 RESTRICT와 동일
SET NULL 개체를 변경/삭제 때 다른 개체가 변경/삭제할 개체를 참조하고 있을 경우 참조하고 있는 값을
NULL로 세팅
AUTOMATIC 개체를 추가할 때 해당 테이블이 다른 테이블를 참조하고 있을 경우 참조하고 있는 값을
자동적으로 추가
DEPENDENT 개체를 추가할 때 해당 테이블이 다른 테이블를 참조하고 있을 경우 추가 불가

 

 

ex) Primary key

CREATE TABLE Student(
	ID VARCHAR(30) PRIMARY KEY,
    NAME VARCHAR(30),
    AGE NUMBER(10)
);

 

 

ex) Foregin key

CREATE TABLE Student(
	ID VARCHAR(30) PRIMARY KEY,
    NAME VARCHAR(30),
    AGE NUMBER(10),
    CONSTRAINT FK_ID FOREIGN KEY(NAME) REFERENCES NAMEINFO(NAME)
);

 

 

ex) Check

CREATE TABLE Student(
	ID VARCHAR(30),
    NAME VARCHAR(30),
    AGE NUMBER(10) CHECK(AGE IN(10,20,30)),
);

 

ex) Default

CREATE TABLE Student(
	ID VARCHAR(30),
    NAME VARCHAR(30) DEFAULT "JINNIE",
    AGE NUMBER(10)
);

주의!  만약, 직접 값을 Null로 지정한다면 디폴트 값으로 지정되지 않고, Null이 들어가게 된다.

 

 

 

인덱스 생성

데이터베이스로부터 매우 빠르게 데이터를 생성하고 검색하기 위해 사용

인덱스는 테이블의 단일 컬럼 또는 컬럼의 그룹을 사용함으로써 생성 가능하고, 인덱스가 생성되면 데이터를 정렬하기 전에 각 행마다 ROWID가 할당된다.

CREATE INDEX 인덱스테이블 ON 테이블(컬럼1, 컬럼2, ... );

 

 

 

 

 


2) ALTER

컬럼 추가

ALTER TABLE 테이블명 ADD 컬럼명 타입;
ALTER TABLE STUDENT ADD ADDRESS VARCHAR2(30) NOT NULL;

 

컬럼 타입 변경 > 이전에 있던 제약 조건도 사라질 수 있으니 주의! (똑같이 다시 지정해줘야함)

Oracle

ALTER TABLE 테이블명 MODIFY (컬럼명1 타입1 [DEFAULT] [NOT NULL], . . .);
ALTER TABLE STUDENT MODIFY NAME VARCHAR2(100);

MySQL 여러 컬럼 동시에 변경 불가

ALTER TABLE 테이블명 ALTER COLUMN 컬럼명 타입 [DEFAULT] [NOT NULL];
ALTER TABLE STUDENT ALTER COLUMN NAME VARCHAR2(100) NOT NULL;

 

컬럼 삭제

ALTER TABLE 테이블명 DROP 컬럼명;
ALTER TABLE STUDENT DROP NAME;

 

PRIMARY KEY 지정하기

ALTER TABLE STUDENT ADD PRIMARY KEY(ID);
ALTER TABLE STUDENT ADD CONSTRAINT student_pk PRIMARY KEY(ID);

 

 


3) RENAME

RENAME 테이블명 TO 새테이블명;

 

 


4) DROP

storage와 데이터 모두 삭제

DROP TABLE 테이블명;

 

 


5) TRUNCATE

최초 생성되었을 때의 storage만 남기고 데이터는 모두 삭제

TRUNCATE TABLE 테이블명;

 

 

 

 

 


TCL(Transcation Control Language)

1) COMMIT

문제가 없다고 판단하여 데이터를 데이터베이스에 반영시킴

COMMIT;

 

 


2) ROLLBACK

COMMIT이전의 상태로 돌아감

ROLLBACK;

 


3) SAVEPOINT

ROLLBACK이 가능한 저장점을 직접 지정할 때, 사용하는 명령어

Oracle

SAVEPOINT SVPT1;
ROLLBACK TO SVPT1;

MySQL

SAFE TRANSACTION SVTR1;
ROLLBACK TRANSACTION SVTR1;

 

 

 

 

 

 

 


DML

1) INSERT

INSERT INTO 테이블명 VALUES(모든 컬럼 등록);
INSERT INTO 테이블명(컬럼1, 컬럼2) VALUES(컬럼1값, 컬럼2값);

 

 


2) DELETE

삭제 데이터에 대한 로그가 남으며 storage도 남는다.

DELETE FROM 테이블명 where 조건;

 


3) UPDATE

UPDATE 테이블명 SET 컬럼명 = 값 where 조건;

 

 

 


4) SELECT

실행 작동 순서 

FROM >> WHERE >> GROUP BY >> HAVING >> SELECT >> ORDER BY

SELECT 컬럼 FROM 테이블 WHERE 조건;
조건 의미
BETWEEN a AND b a와 b값을 포함한 그 사이값
LIKE '비교문자열' 비교문자열과 형태가 일치한다(% , _ 사용)
IN (list) 리스트 내 값중 어느 하나와 일치
NOT 해당되지 않음 ex) WHERE NOT user_id = 1;
AND, OR 연산자 우선순위가 and에게 있다.
IS NULL 널인 경우
IS NOT NULL 널이 아닌 경우

연산자 우선순위

산술연산자 > 연결연산자(||) > 비교연산자 > IS NULL, LIKE ,IN > BETWEEN > NOT > AND > OR

 


내장함수(Built-in Function)

- 입력 행수에 따라 단일행 함수, 다중행 함수로 나뉜다.

- SELECT, WHERE, ORDER BY, UPDATE의 SET절에 사용 가능

- 단 하나의 결과만 리턴

 

1) 단일행 함수 : 단일행 값이 입력되는 함수

문자열 함수

문자열 함수 의미
ASCII(문자) 문자나 숫자를 아스키코드로 변환
CHAR(아스키번호) 아스키 번호를 문자나 숫자로 변환
LOWER(문자열)/UPPER(문자열) 대문자나 소문자로 변환
CONCAT(문자열1, 문자열2) 두 문자열을 결합
-> "||"(Oracle)이랑 "+"(MySQL)과 같은 의미이다
SUBSTR/SUBSTRING(문자열,m,n) 문자열에서 m위치부터 n개만큼 해당되는 문자열을 반환
-> n이 없다면 마지막 문자까지
-> m이 음수라면 마지막 문자로부터 m위치부터 n개 문자길이 반환
LENGTH/LEN(문자열) 문자열의 길이 반환
->공백이나 줄바꿈도 1로 친다

 

숫자형 함수

숫자형 함수 의미
SIGN(n) 숫자가 양수면 1, 음수면 -1, 0이면 0을 반환
MOD(n , m) n을 m으로 나눠서 나머지를 반환
CEIL/CEILING(n) 크거나 같은 최소 정수 반환
FLOOR(n) 작거나 같은 최대 정수 리턴

 

날짜형 함수

날짜형 함수 의미
SYSDATE/GETDATE() 현재날짜와 시각 출력
EXTRACT/DATEPART() 날짜에서 데이터 출력
TO_NUMBER(TO_CHAR(d,"YYYY"))/YEAR(d) 연도 출력

 

변환형 함수

변환형 함수 의미
TO_NUMBER(문자) 문자 데이터 타입을 숫자 데이터 타입으로 변환
TO_CHAR(숫자 혹은 날짜, [format]) 숫자 혹은 날짜 데이터 타입을 지정된 format의 문자 데이터 타입으로 변환
TO_DATE(문자열, format) 문자 데이터 타입을 지정된 format의 날짜 데이터 타입으로 변환 

 

NULL 관련 함수

NULL 관련 함수 의미
NVL(표현식1, 표현식2) 오라클
ISNULL(표현식1, 표현식2) MySQL
표현식1의 결과값이 null이면 표현식 2의 값을 출력
NULLIF(표현식1, 표현식2) 두 개의 값이 같으면 NULL을, 같지 않으면 첫 번째 값을 반환
COALESCE(표현식1, 표현식2, . . . ) NULL이 아닌 최초의 인자 값을 반환

+) NULL 의 연산

count 되지 않음, 연산시 NULL 리턴, 비교연산시 거짓 리턴

 

 

 

 


2)다중행 함수 : 다중행 값이 입력되는 함수

데이터 모델링

정보시스템을 구축하기 위한 데이터 관점의 업무 분석 기법으로 현실세계의 데이터에 대해 약속된 표기법을 사용해서 표현하는 과정이다.

데이터 베이스를 구축하기위한 분석/설계 과정이지만 그자체로써도 업무를 설명하고 분석하는 의미에서 중요한 의미를 지닌다.

 

 

모델링시 유의사항

1) 중복(Duplication)

데이터베이스가 여러 장소에 같은 정보를 저장하는 잘못을 하지 않도록 한다.

 

2) 비유연성(Inflexibility)

데이터 모델을 어떻게 설계했느냐에 따라 사소한 업무변화에도 데이터 모델이 수시로 변경됨으로써 유지보수의 어려움을 가중시킬 수 있다. 데이터의 정의를 데이터의 사용 프로세스와 분리함으로써 데이터 모델링은 데이터 혹은 프로세스의 작은 변화가 애플리케이션과 데이터베이스에 중대한 변화를 일으킬 수 있는 가능성을 줄인다.

 

3) 비일관성(Inconsistency)

데이터의 중복이 없더라도 비일관성이 발생할 수 있는데, 예를 들면 신용 상태에 대한 갱신 없이 고객의 납부 이력 정보를 갱신하는 경우이다. 개발자가 서로 연관된 다른 데이터와 모순된다는 고려 없이 일련의 데이터를 수정할 수 있기 때문에 이와 같은 문제가 발생할 수 있다. 데이터 모델링을 할 때 데이터와 데이터 간의 상호 연관 관계에 대해 명확하게 정의한다면 이러한 위험을 사전에 예방하는데 도움을 줄 수 있다.

사용자가 처리하는 프로세스 혹은 이와 관련된 프로그램과 테이블의 연계성을 높이는 것은 데이터 모델이 업무 변경에 대해 취약하게 만드는 단점에 해당한다.

 

 

 

데이터 모델링 과정

개념적 모델링 ->  논리적 모델링 -> 물리적 모델링
추상화 수준이 높다
업무중심적
포괄적
전사적 데이터 모델링
EA수립시 사용
key, 속성, 관계 등을
명확하게 표현
재사용성이 높음
성능, 저장 등 
물리적인 성격 고려

 

 

Three-level architecture(3단계 데이터베이스 구조)

1) 외부스키마(External Schema)

추상화의 최상위 단계로 외부 단꼐의 각 외부 스키마는 각 사용자를 의미하는 개인적인 데이터베이스 구조

사용자 뷰를 포함해 개인의 논리적 데이터 구조로 이루어져 있으며, 개체나 관계, 응용 프로그램 모두 사용자와 관련된 것만 포함된다. 서브스키마 라고도 부른다.

 

2) 개념스키마(Conceptual Schema)

전체 구조를 추상화하는 단계로써 개념 단계에서 하나의 개념 스키마는 범 기관적 입장에서 데이터베이스를 정의한 것으로 정확히는 전체적이고 종합적인 측면을 나타내는 스키마

모든 사용자의 관점을 통합한 조직 전체 관점의 통합적 표현

객체나 관계, 응용 프로그램에다가 관리적인 측면에서 필요한 데이터와 정책,권한,규칙까지 포함한다.

 

3) 내부스키마(Internal Schema)

가장 낮은 추상화 단계로 물리적 저장 장치의 입장에서 데이터베이스가 저장되는 저장 구조와 세부사항 그리고 접근 경로 등을 기술한다.

아까 개념스키마가 포함하는 내용에다가 내부 레코드 형식/순서/인덱스 유무와 상세한 명세를 포함한다.

 

 


ERD(Entity Relationship Diagram)

말로 되어있는 요구사항들을 그림으로 그려 그 관계를 도출하는 것

1976년 피터첸에 의해 E-R Model이라는 표기법이 만들어졌다.

ERD의 예시

작성 순서

1) 엔티티를 그린다

2) 엔티티를 적절하게 배치한다

3) 엔티티간 관계를 설정한다

   존재/행위에 의한 관계를 구분하지 않지만, UML은 구분함에 유의한다.

    ex) 소유한다, 포함한다, 가르친다 등등

4) 관계명을 기술한다

5) 관계의 참여도를 기술한다

    ex) 1:1 , 1:다 , 다:다 (관계차수)

6) 관계의 필수여부를 기술한다.

    ex) 필수관계, 선택관계 (관계선택관계)

 

 

 

 

Entity

실체, 객체라는 의미

정의 그렇게 말한 사람
변별할 수 있는 사물 Peter Chen(1976)
데이터베이스 내에서 변별 가능한 객체 C.J Date(1986)
정보를 저장할 수 있는 어떤 것 James Martin(1989)
정보가 저장될 수 있는 사람, 장소, 물건, 사건 그리고 개념 등 Tomas Bruce(1992)

 

 

특징

  • 반드시 해당 업무에서 필요하고 관리하고자 하는 정보여야 한다
  • 유일한 식별자에 의해 식별 가능해야 한다
  • 영속적으로 존재하는 (두개 이상의) 인스턴스의 집합
  • 엔티티는 업무 프로세스에 의해 이용되어야 한다
  • 엔티티는 반드시 속성이 있어야한다
  • 엔티티는 다른 엔티티와 최소 한 개 이상의 관계가 있어야 한다.

 

엔티티와 인스턴스, 속성과 속성값

 

 

 

 


Attribute(속성)

업무에서 필요로 하는 인스턴스에서 관리하고자 하는 의미상 더 이상 분리되지 않는 최소의 데이터 단위

종류 설명 예시
기본 속성 비즈니스 프로세스에서 도출되는 본래의 속성 ex) 회원ID, 이름, 주문일자 . . .
설계 속성 데이터 모델링 과정에서 발생되는 속성
유일한 값을 부여
ex) 상품코드, 주문코드 . . .
파생 속성 다른 속성에 의해서 만들어지는 속성
데이터를 조회할때 빠른 성능을 내게 해준다.
ex) 합계, 평균 . . .

 

 

 

 


Relationship(관계)

엔티티의 인스턴스 간 논리적인 연관성, 존재 형태로서나 행위로서 서로에게 연관성이 부여된 상태

 

구성요소

1) 관계명(Membership)

2) 관계차수(Cardinality)

3) 관계선택사양(Optionality)

 

관계 체크사항

1) 두 개의 엔티티 사이에 관심있는 연관규칙이 존재하는가?

2) 두 개의 엔티티 사이에 정보의 조합이 발생되는가?

3) 업무기술서, 장표에 관계연결에 대한 규칙이 서술되어 있는가?

4) 업무기술서, 장표에 관계연결을 가능하게 하는 동사가 있는가?

 

 

 


Identifiers(식별자)

여러개의 인스턴스를 담고 있는 엔티티에서 인스턴스를 구별하기 위한, 엔티티를 대표하는 속성을 의미

 

식별자가 만족해야할 속성 4가지

유일성 주식별자에 의해 엔티티내에 모든 인스턴스들을 유일하게 구분할 수 있어야한다.
최소성 주식별자를 구성하는 속성의 수는 유일성을 만족하는 최소의 수가 되어야한다.
불변성 주식별자가 한 번 특정 엔티티에 지정되면 그 식별자의 값은 변하지 않아야한다.
존재성 주식별자가 지정되면 반드시 데이터 값이 존재해야한다(not null)

 

식별자의 종류

기준1) 대표성의 유무

주식별자 : 엔티티 내에서 각 인스턴스를 구분할 수 있으면서 타 엔티티와 참조관계를 연결할 수 있는 식별자

보조식별자 : 엔티티 내에서 각 인스턴스를 구분할 수 있으나, 대표성이 없어 참조관계를 연결할 수 없음

 

기준2) 스스로 생성되었는가?

내부식별자 : 엔티티 내부에서 스스로 만들어진 식별자

외부식별자 : 타엔티티와 관계를 통해 생성된 식별자

 

기준3) 단일 속성인가?

단일식별자 : 하나의 속성으로 되어있다

복합식별자 : 둘 이상의 속성으로 되어있다

 

기준4) 업무적 의미가 있는가

본질식별자 : 업무에 의해 만들어지는 식별자

인조식별자 : 업무적으로 만들어지지는 않지만 원조식별자가 복잡한 구성을 가지고 있어 인위적으로 만든 식별자

 

 

 

 

 

#오류에 대해 지적해 주시면 수정하겠습니다.

 

트랜잭션(Transaction)

- DB의 상태를 변환시키는 논리적인 기능을 하는 작업의 단위

- 트랜잭션의 단위는 더 이상 작아질 수 없는 최소의 단위

 

 

 

 

ACID

- Atomicity 원자성트랜잭션의 연산과정 모든 것이 DB에 반영되거나, 전혀 반영되지 않아야한다. (All or Nothing)

트랜잭션의 모든 명령은 완벽히 수행되어야 하고, 만약 실패할 경우 트랜잭션 전체를 롤백 시켜야 한다.

트랜잭션의 단위보다 더 작은 명령으로 나눌수 없다는 점을 빗대어 트랜잭션의 원자성이라 표현한다!

 

- Cosistency 일관성

트랜잭션 실행이 완료되어도 일관성 있는 DB상태가 되어 있어야 한다.

시스템의 고정요소는 트랜잭션 수행 전과 수행 완료 후 상태가 같아야 한다.

ex) 계좌 이체를 빗대어 봤을 때, 계좌 이체가 성공적으로 수행한다고 계좌번호 혹은 계좌주 명이 바뀌면 안된다(명시적)

ex) 계좌 이체가 수행 되었을 때, 계좌의 합이 같아야 하는 것(비명시적)

 

- Isolation 독립성, 고립성여러 트랜잭션이 동시에 수행되더라도, 각각의 트랜잭션이 다른 트랜잭션의 영향을 받지 않고, 주지 않아야 함.만약 이 조건이 성립되지 않는다면 완벽한 롤백이 되지 않는다. 고립성을 가장 완벽하게 지키는 방법은 순차적으로 트랜잭션을 수행하는 것이다.

 

- Durability 지속성트랜잭션이 성공적으로 완료되어 커밋이 되었다면, 해당 트랜잭션에 의한 변경사항은 소프트웨어에 장애가 생기더라도 유지되어야 한다.

 

 

 

 


 

 

 

동시성과 고립성의 관계

 

트랜잭션에서 가장 대립되는 두가지 성질이다. 위에서 설명한 ACID 특성을 지켜내기 위해서, 그중에서도 고립성을 완벽하게 지키려면 모든 트랜잭션을 순차적으로 진행해야 한다.

하지만 그러한 방법은 처리 속도가 느리다는 문제성이 발생한다. 이러한 문제를 해결하기 위해 DBMS는 격리 수준을 나누어 서비스 환경에 따라 고립 수준을 부여하도록 제공하고 있다.

속도가 더 중요하다면 격리 수준을 낮추고, 데이터의 무결성이 중요하다면 격리 수준을 높이는 식으로!

 

 

 

낮은 격리 수준에서 발생하는 고립성 문제

-Dirty Read

-NonRepeatable Read

-Phantom Read

 

 

 

 

-Dirty Read

하나의 트랜잭션이 커밋 되지 않았을 때, 다른 트랜잭션이 해당 트랜잭션의 중간 값을 읽어 오는 것을 말한다.

아래의 사진을 보면 Transaction_1이 아직 Commit이 되지 않았는데

Transaction_2에서 Commit되지 않은 Transaction_1의 값을 조회해갔다.

만약, Transaction_1이 결국 Commit되지 않고 Rollback이 된다면 Transaction_2는 잘못된 값으로 로직을 수행하게 된다.

 

 

 

 

-NonRepeatable Read

한 트랜잭션 내에 같은 키를 가진 Row를 두 번 불렀는데 키의 값에 UPDATE가 수행 되어,

두 번의 Select 결과가 다른 경우이다.

아래의 그림을 보면 Transaction_2가 두번의 Select를 수행하는 도중 Transaction_1이 키의 값을 변경함으로써

Transaction_2의 트랜잭션 도중 값이 변경되어 잘못된 결과값이 나올 수 있다.

 

 

-Phantom Read

Phantom. 환영(幻影), 또는 유령 등을 뜻하는 영어

한 트랜잭션 내에서 같은 쿼리를 두 번 수행했을때, 첫 쿼리에선 나오지 않은 것이 그 다음 쿼리가 나오는 사이 커밋 되어 다른 값으로 나오는 경우이다. 

아래의 경우를 보면 Transaction_1이 먼저 Insert를 수행하고 아직 Commit되지 않은 상태에서 Transaction_2가 조회를 해서 앞에 Insert를 한 결과를 포함하지 않은 결과가 나왔고, 이어서 한 조회에서는 Commit이후이기 때문에 아까는 없었던 값이 포함된 새로운 결과가 나왔다.

 

 

(+)

NonRepeatable Read와 Phantom Read의 차이점

NonRepeatable Read는 하나의 row에서 수행되지만 Phantom Read는 여러 개의 데이터를 읽을 때 일어나는 현상이다.

Phantom Read가 일어나는 쿼리문 예시) SELECT COUNT(*) FROM ~ , SELECT * FROM ~

 

 

 

 

 

 


 

 

 

격리수준(isolation level)

- Read Uncommitted

- Read Committed (Oracle default)

- Repeatable Read (MySQL InnoDB default)

- Serializable

 

 

- Read Uncommitted

가장 하위 레벨의 격리 수준으로 트랜잭션이 commit 되지 않은 데이터를 다른 트랜잭션이 읽을 수 있도록 허용한다.

 

발생 가능한 문제 :  Dirty-Read, Non-Repeatable Read, Phantom Read

 

 

- Read Committed

트랜잭션의 커밋이 확정된 데이터만 읽을 수 있게 허용한다.

아직 커밋이 되지않은 데이터지만 Undo 로그에서 이전 데이터를 가져오는 것이 가능하기 때문에 

실제 DB데이터가 아닌 저기서 들고 온다.

Dirty-Read는 혹시 모를 롤백의 경우에만 문제를 일으키기 때문에 해결 가능하나 나머지 고립성 문제는 그대로 존재하게 된다.

 

해결 가능한 문제 : Dirty-Read

발생 가능한 문제 : Non-Repeatable Read, Phantom Read

 

 

(오른쪽)해결 가능한 문제 (왼쪽)해결 불가능한 문제

 

 

- Repeatable Read

 

트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 읽을 수 있도록 허용된다. 트랜잭션 도중 다른 트랜잭션이 커밋 되어도, 새로 커밋된 데이터는 보이지 않게 된다.

 

아래의 그림을 보면 Transaction_2가 수행되는 도중 Transaction_1이 Busan의 값을 Jeju로 변경했으나 Transaction_2는 해당 Transaction_1이 커밋을 완료 했음에도 Busan으로 출력되게 된다.

이처럼 Repeatable Read 격리 수준은 수행되는 시점을 기억해서 해당 트랜잭션이 완료될 때 까지 기억된 초기 시점 이전까지 커밋된 데이터만 조회 할 수 있도록 한다.

 

 

- Serializable

가장 높은 수준의 격리 수준으로 특정 트랜잭션이 수행중엔 해당 테이블에 다른 트랜잭션이 UPDATE, DELETE, INSERT를 못하게 막는다. 동시성이 가장 낮은 격리 수준이기 때문에 거의 사용하지 않는다고 한다.

 

 

 

 

 

 

 

'Database' 카테고리의 다른 글

[SQLD][1과목]데이터 모델과 성능  (0) 2021.09.02
[SQLD]SQL 기본 및 활용(2)  (1) 2021.08.31
[SQLD]SQL 기본 및 활용(1)  (0) 2021.08.27
[SQLD]데이터 모델링의 이해  (0) 2021.08.23

+ Recent posts