티스토리 뷰

* 데이터베이스의 정의와 특성

- DB의 정의

1) 통합된 데이터: 한곳에 모아서 통합해놓은 데이터

2) 저장된 데이터: 컴퓨터 하드웨어에 저장되어 있는 데이터

3) 운영 데이터: 어떤 조직의 기능을 수행하기 위해 필요한 데이터

4) 공용 데이터: 여러 사용자들이 공동 소유/관리/이용하는 데이터

 

- DB의 특성

1) 실시간 접근성: 실시간으로 요청에 대해 응답해야 함

2) 내용에 의한 참조: DB의 데이터는 그 주소나 위치에 의해서가 아니라 내용에 의해 참조됨

3) 동시 공유: 같은 내용의 데이터를 여럿이 공유할 수 있음

4) 계속적 변화: DB는 데이터의 삽입, 삭제, 갱신 등을 통해 계속해서 내용이 바뀜

 

* 스키마

데이터베이스의 구조, 즉 어떻게 생겼냐를 정의한 것

- 스키마의 3계층

1) 외부 스키마: 사용자나 응용 프로그래머가 접근할 수 있는 정의

2) 개념 스키마: 기관, 조직의 입장에서 정의한 데이터베이스

3) 내부 스키마: 데이터의 실제 저장 방법. 물리적인 표현 방법 및 순서 등

 

* 데이터 모델

현실 세계를 DB로 표현하기 위한 중간 과정이자 도구.

데이터 구조, 구조 내에서의 연산, 연산을 할 때의 제약조건으로 구성

 

- 개념적 데이터 모델: ER 모델 (ER 다이어그램) 이 대표적. 개체를 사각형, 관계를 마름모, 속성을 타원으로 표현

- 논리적 데이터 모델: 테이블 (관계형) 이나 트리 (계층형), 그래프 (네트워크형) 로 표현

- 그 외 객체지향 모델 같은 것도 있음

 

- 릴레이션 (Relation): 테이블을 뜻함
- 튜플: 테이블의 각 행을 의미. 하나의 릴레이션 안에서 튜플은 순서가 없음. (사용자에게는 정렬돼서 보여지는게 보통이라 헷갈릴 수 있음)

 

* 데이터베이스 설계의 단계

1) 요구조건 분석

2) 개념적 설계

3) 논리적 설계

4) 물리적 설계

5) DB 구현

 

* 키 (key) 의 종류

예시는 '학생' 테이블의 속성으로 (학번, 이름, 주민번호, 전화번호, 학과번호) 가 있다고 치자.

 

- 슈퍼키 (SK): 어떤 개체를 유일하게 식별할 수 있는 하나 이상의 속성 집합.

ex) {학번}, {주민번호} 는 슈퍼키이며 {학과번호} 는 슈퍼키가 아님.

{학번, 주민번호}, {학번, 이름} 과 같이 슈퍼키에 다른 속성을 더하면 그것도 슈퍼키임.

 

- 후보키 (CK): minimal superkey. 즉 어떤 슈퍼키에서 속성을 하나라도 빼면 슈퍼키가 아닐 경우, 그것은 후보키.

ex) {학번}, {주민번호} 는 후보키임. {학번, 이름} 은 슈퍼키지만 후보키는 아님.

 

- 기본키/일차키 (PK): 보통 DB 설계할 때 가장 중요하고 많이 보게 되는 것. 후보키 중에 적당한 하나를 고른 것.

ex) {학번} 을 기본키로 골랐다면 {주민번호} 는 그냥 후보키 (또는 대체키라고 부르기도 함).

 

- 외래키 (FK): 다른 테이블에서 기본키인 것이 현재 테이블에 존재하면서 현재 테이블이 그 다른 테이블을 참조할 경우, 현재 테이블에서 그 기본키에 해당하는 속성 집합을 외래키라고 함.

ex) 각 학생들이 어떤 과목을 듣는지를 나타내는 '수강' 테이블이 있고 '학생' 테이블을 참조할 때, 수강 테이블에서 {학번} 이 외래키.

 

* 함수적 종속 (Functional Dependencies)

- 슈퍼키 개념을 일반화한 것으로, DB 설계 시 고려되는 정규형 (NF) 이 이것에 의해 결정되므로 중요한 개념

- "A -> B" 와 같이 표현하며 A, B는 각각 속성의 집합

'테이블에서 어떤 임의의 튜플 쌍을 골랐을 때 A가 같으면 B도 항상 같다' 가 성립하면 함수적 종속이 있다고 함

- A가 후보키인 경우 B에 어떤 속성 집합이 오더라도 함수적 종속은 항상 있음

- B가 스키마 전체이고 A -> B라는 함수적 종속이 있을 때 A를 슈퍼키라고 정의함

 

ex)

{학번} -> {이름}: 학번이 같으면 이름도 항상 같으므로 함수적 종속 O

{학번} -> {학번}: 너무 당연한 얘기지만 함수적 종속 O (trivial FD: B가 A의 부분집합인 경우)

{이름} -> {주민번호}: 이름이 같다고 해서 주민번호가 같은 것은 아니므로 (동명이인의 존재 가능성) 함수적 종속 X

{학번, 이름} -> {이름}: 이것도 trivial FD. 함수적 종속 O

 

* 정규형 (Normal Form: NF)

스키마를 더 효율적으로 만들기 위해서 쪼개는 작업을 정규화라고 함.

관계형 DB에서 기본적으로 모든 스키마는 1NF에는 속한다.

거기서 제약조건이 더 붙을수록 (정규화를 해나갈수록) 1NF -> 2NF -> 3NF -> BCNF -> 4NF -> 5NF가 된다.

 

- 1NF: 속성의 값이 단순 속성, 하나뿐인 값 (Simple & Single-valued)

관계형 DB에서는 복합 속성을 다루지 않고 한 칸에 여러 값이 들어갈 수도 없으므로 RDB의 모든 스키마는 기본적으로 1NF.

 

- 2NF: 후보 키 K와 K에 속하지 않는 속성 A가 있을 때, A를 결정하기 위해 K의 일부가 아닌 K 전체를 참조해야만 하는 경우 2NF라고 함. 1NF에서 '부분적 함수 종속' 을 제거한 것. 근데 실제로 쓰이진 않고 이론적 의미만 존재함.

 

위의 '종업원의 기술' 테이블 (1NF) 에서 후보키는 {종업원, 기술} 인데, '근무지' 속성은 {종업원, 기술} 에 따라 결정되는게 아니라 '종업원' 에만 영향을 받음. 이 문제 때문에 근무지가 여러번 중복해서 나타나고 있다.

이걸 종업원 테이블, 종업원의 기술 테이블 두개로 쪼개면 2NF가 됨.

 

- 3NF: 스키마에 존재하는 모든 함수적 종속 A -> B에 대하여

1) A가 슈퍼키거나

2) 해당 함수적 종속이 trivial FD거나

3) B가 후보 키의 일부인 경우

이 조건들 중 하나라도 만족하면 3NF에 속한다.

또는, 2NF에서 '이행적 함수 종속' (A -> B -> C 식의 관계) 을 제거한 것을 의미한다.

 

- BCNF: 3NF에서 3) 의 조건을 빼서 더 강화한 것. 즉 A가 슈퍼키가 아니면서 B의 모든 속성이 후보키의 일부분인 FD가 3NF에서는 허용되지만 BCNF에서는 허용되지 않음.

또는 모든 함수적 종속 A -> B에 대해서 A가 후보키인 경우를 의미.

 

- 4NF, 5NF: BCNF에서 '다치 종속' 을 제거하면 4NF, 4NF에서 '후보키를 통하지 않은 조인 종속' 을 제거하면 5NF라고 하는데 별로 중요하지 않음. 보통 BCNF까지만 분해하며, 4NF의 경우 BCNF를 만족하면 자동으로 만족되는 경우가 많고, 5NF는 만들기가 어려워서 비효율적.

 

* 이상 현상 (Anomaly)

정규화가 제대로 되어있지 않으면 이런 문제점들이 발생할 수 있음.

 

- 삽입 이상: 데이터 삽입 시 불필요한 데이터가 함께 삽입되는 현상

- 삭제 이상: 튜플을 삭제했는데 필요한 데이터까지 같이 날아가는 현상

- 갱신 이상: 튜플 중에서 일부를 변경했더니 데이터의 불일치가 발생하는 현상

 

* 관계 대수 (Relational Algebra)

- 선택 (select): SQL에서 제일 자주 쓰는 그거. 조건을 만족하는 튜플, 즉 행을 출력.

- 속성 추출 (project): 원하는 속성만 보기. 즉 선택한 열을 출력.

- 합집합 (union)

- 차집합 (difference)

- 교집합 (intersection): 차집합 연산을 두 번 하는 걸로 표현 가능.

- 카티전 곱 (cartesian product): 테이블 A의 각 튜플마다 테이블 B의 각 튜플을 붙여서 새로운 테이블을 만든다. 즉 결과 테이블의 속성 수는 A와 B의 속성 수의 합, 튜플 수는 각 테이블의 튜플 수의 곱이다. 이것만 단독으로 쓰면 의미불명의 튜플들이 잔뜩 생기기 때문에 단독으로는 안 쓰고 자연 조인의 중간 과정으로 쓰임.

- 자연 조인 (natural join) 또는 그냥 조인: 공통 속성을 기준으로 두 테이블을 합치는 것

1) 카티전 곱을 수행

2) A, B 테이블에 공통적으로 나오는 속성의 값이 같도록 select 연산 수행

3) A, B 테이블에 공통적으로 나오는 속성은 한 번만 나오도록 project 연산으로 중복 제거

보통 조인을 하는 경우 '공통적으로 나오는 속성' 은 한 테이블에서 기본키, 다른 테이블에서 외래키인 경우가 대부분

 

- 관계 해석: 원하는 정보가 무엇인지만 정의하는 비절차적 방법. '관계 대수' 는 절차적인 방법이라 함.

 

* SQL문의 종류

DBMS에는 데이터베이스를 정의, 조작, 제어하는 3가지 기능이 있어야 하며 각 기능을 할 수 있게 해주는 것이 SQL문

 

- DDL (Data Definition Language)

테이블을 만들고 삭제하고 구조를 변경하는 Create, Drop, Alter

> CREATE: CREATE TABLE 이름 ({열이름 데이터타입 [NOT NULL], [디폴트 값], ...

              뒤에 PRIMARY KEY, FOREIGN KEY ~ REFERENCE, UNIQUE, ON DELETE, ON UPDATE, CHECK 등

> DROP: DROP TABLE 이름 [CASCADE | RESTRICT]

                                    다른 개체에서 참조중이라도 삭제 vs 참조중이면 삭제X

> ALTER: ALTER TABLE 이름 {ADD/ALTER/DROP} 열 이름

 

- DML (Data Manipulation Language)

데이터를 조작하는, 일반적으로 CRUD라고 부르는 Select, Insert, Delete, Update

> SELECT: SELECT 속성명 FROM 테이블명 WHERE 조건;

              뒤에 GROUP BY, HAVING, ORDER BY 등 가능

> INSERT: INSERT INTO 테이블명 (속성명1, 속성명2, ...) VALUES (데이터1, 데이터2, ...)

> DELETE: DELETE FROM 테이블명 WHERE 조건;

> UPDATE: UPDATE 테이블명 SET 속성명=데이터 WHERE 조건;

 

- DCL (Data Control Language)

무결성 유지, 권한 설정 등을 위한 Commit, Rollback, Grant, Revoke

> GRANT: GRANT 권한 ON 데이터 객체 TO 사용자 [WITH GRANT OPTION];

> REVOKE: REVOKE [GRANT OPTION FOR] 권한 ON 데이터 객체 FROM 사용자 [CASCADE];

(GRANT OPTION은 권한을 부여받은 사용자가 또다시 그 권한을 다른 사용자에게 부여할 수 있는 권한을 주거나 취소하는 것. CASCADE는 권한을 부여받은 사용자가 다른 사용자에게 부여한 권한까지 같이 취소시키는 것)

 

* 뷰 (View)

- 사용자의 데이터 확인을 위해 보여주는 가상의 테이블

- CREATE, SELECT, DROP 을 이용해 뷰를 이용 가능

- 뷰를 이용해 또 다른 뷰를 생성할 수 있으며 이 경우 부모 뷰를 삭제하면 자식 뷰도 삭제된다

- 필요한 데이터만 볼 수 있게 해주므로 독립성, 편의성, 보안성을 제공

- 어디까지나 가상이므로 실제 테이블의 정의나 내용물에 영향을 끼칠 수 없음

 

* 시스템 카탈로그

- DB의 여러 구성요소들에 관한 상위 정보들을 포함하고 있는 시스템 DB

- 이것도 SQL문으로 내용을 검색할 수 있으나 사용자가 갱신할 수는 없음, DB 구성요소에 변화가 생기면 시스템이 알아서 갱신

- 데이터 딕셔너리라고도 함

 

* 트랜잭션

- 데이터베이스에서 일어나는 연산, 작업 단위

- 트랜잭션의 4가지 특성

1) 원자성: 완전히 수행되던지 아예 수행되지 않던지 해야 한다. 실행하다가 오류가 발생하면 지금까지 실행했던 내용은 취소되어야 한다.

2) 일관성: 시스템의 고정 요소 (DB의 구조나 상태) 는 트랜잭션 수행 전후 같아야 한다.

3) 격리성: 트랜잭션은 다른 트랜잭션의 간섭을 받지 않아야 한다.

4) 영속성: 트랜잭션이 성공적으로 실행되면 그 결과는 DB에 영구히 적용된다.

 

- 트랜잭션의 과정

실행 시작 -> 활동 -> 부분 완료 -> 완료 (Commit)

                                          -> 실패 -> 철회 (Rollback)

 

- 병행 제어 (Concurrency Control)

트랜잭션의 일관성을 유지하기 위한 제어 기법.

> 로킹 (Locking): 하나의 트랜잭션이 데이터에 액세스하는 동안 다른 트랜잭션이 접근 못하도록 막는 것. 잠금 - 실행 - 잠금해제의 과정을 거치며, 작은 단위로 할수록 오버헤드가 커지는 대신 공유도가 높아진다 (= 여러 트랜잭션이 접근하면서도 일관성이 유지됨).

 

> 2단계 로킹 기법: 트랜잭션의 직렬성 (순서대로 처리됨) 을 보장하는 기법. 그러나 데드락이 발생할 수 있다.

> 타임스탬프 기법: 트랜잭션마다 타임스탬프를 찍는 방법. 데드락이 발생하지 않는다.

 

* 분산 데이터베이스

- 네트워크를 통해 연결된 여러 개의 컴퓨터에 DB가 분산되어 있는 형태

- 목표

1) 위치 투명성: DB가 존재하는 하드웨어, 소프트웨어의 물리적 위치를 사용자가 알 필요가 없다

2) 중복 투명성: 시스템 안에 파일, 자원들을 자유롭게 복사할 수 있으며 사용자가 알 필요가 없다

3) 병행 투명성: 여러 사용자들이 자원을 자동으로 공유할 수 있다

4) 장애 투명성: 어느 위치에서 오류가 발생했는지 사용자가 알 필요가 없다

 

- 장점: 쿼리 시간 단축, 데이터 공유성/신뢰성/가용성 향상, 시스템 용량 확장, 지역 자치성 향상

- 단점: 개발 및 유지보수 비용 증가, 하드웨어 구매 비용 증가, 네트워크 성능의 영향을 크게 받음

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함