데이터베이스란
특정 조직 내에서 다수의 사용자들이 공유할 수 있도록 통합시키고 컴퓨터 저장 장치에 저장시킨 운영 데이터의 집합.
- 공유 데이터 : 여러 사용자들이 공동으로 사용하는 데이터
- 통합 데이터 : 데이터의 중복이 최소화된 데이터
- 저장 데이터 : 컴퓨터가 접근 가능한 저장 매체에 저장된 데이터
- 운영 데이터 : 조직의 목적을 위해 존재 가치가 확실하고 반드시 필요한 데이터
데이터베이스의 특성
- 실시간 접근성
데이터 베이스에 저장된 데이터는 실시간 접근이 보장됨 - 계속적인 변화
데이터베이스에 저장된 데이터는 계속적으로 변화함 - 동시공유
데이터베이스에 저장된 데이터는 여러 명의 사용자들이 동시에 공유할 수 있으며, 이와 같은 기능은 데이터베이스 관리시스템이 지원함 - 내용에 의한 참조
데이터베이스에 저장된 데이터는 내용에 의한 참조를 할 수 있음. 즉, 데이터가 저장된 주소를 이용하여 원하는 데이터에 접근하는 것이 아니라, 저장된 데이터의 내용을 이용하여 원하는 데이터에 접근할 수 있음
DBMS의 장단점
장점
- 데이터 중복의 최소화
데이터를 중앙 집중식으로 관리하여 같은 데이터가 여러 곳에 저장되는 것을 방지하고, 저장 공간을 효율적으로 사용할 수 있음 - 데이터의 공용
여러 사용자와 응용 프로그램이 동시에 데이터베이스에 접근하여 데이터를 공유할 수 있어 조직 내 협업이 용이함 - 데이터 무결성 유지
제약 조건과 규칙을 설정하여 잘못된 데이터가 입력되는 것을 방지하고, 데이터의 정확성과 신뢰성을 보장함 - 데이터의 일관성 유지
데이터 중복을 최소화함으로써 데이터 갱신 시 일관성을 유지할 수 있으며, 모순된 데이터가 발생하는 것을 방지함 - 데이터 보안 보장
사용자별로 접근 권한을 설정하여 중요한 데이터를 보호하고, 무단 접근이나 데이터 유출을 방지할 수 있음 - 응용 프로그램과 데이터의 독립성 유지
데이터 구조가 변경되어도 응용 프로그램을 수정할 필요가 없어 유지보수가 용이하고 시스템 유연성이 향상됨 - 표준화의 달성
데이터 형식, 접근 방법, 인터페이스 등을 표준화하여 조직 내 데이터 관리의 일관성을 확보하고 효율성을 높임 - 데이터 백업 및 회복 기능
자동 백업 기능과 장애 발생 시 회복 메커니즘을 제공하여 데이터 손실을 최소화하고 시스템의 안정성을 보장함
단점
- 운영비의 증대
DBMS 소프트웨어 구입, 하드웨어 업그레이드, 전문 인력 고용 등으로 인해 초기 투자 비용과 유지보수 비용이 증가함 - 데이터베이스 설계의 어려움
효율적인 데이터베이스를 구축하기 위해서는 전문적인 지식과 경험이 필요하며, 설계 단계에서 많은 시간과 노력이 소요됨 - 복잡한 예비와 회복
시스템 장애나 데이터 손실에 대비한 백업 및 복구 절차가 복잡하고, 대용량 데이터베이스의 경우 복구 시간이 오래 걸릴 수 있음 - 시스템의 복잡성 증가
DBMS는 다양한 기능을 제공하지만 그만큼 시스템이 복잡해져 관리와 운영에 어려움이 생길 수 있음 - 성능 저하 가능성
많은 사용자가 동시에 접근하거나 복잡한 쿼리를 실행할 경우 시스템 성능이 저하될 수 있으며, 적절한 튜닝이 필요함 - 단일 장애점(Single Point of Failure)
중앙 집중식 구조로 인해 DBMS에 장애가 발생하면 전체 시스템이 마비될 수 있는 위험이 있음
NoSQL의 장단점
장점
- 유연한 데이터 모델
스키마가 고정되어 있지 않아 데이터 구조 변경이 용이함 - 확장성
수평적 확장(Scale-out)이 쉬워 대용량 데이터 처리에 유리함 - 높은 성능
특정 유형의 쿼리에 대해 빠른 읽기/쓰기 성능을 제공함 - 비정형 데이터 처리
다양한 형태의 데이터를 저장하고 처리할 수 있음 - 가용성
분산 시스템 구조로 인해 높은 가용성과 내결함성을 제공함
단점
- 제한적인 쿼리 기능
복잡한 조인이나 트랜잭션 처리가 어려움 - 데이터 일관성 문제
강한 일관성 대신 최종 일관성을 보장하는 경우가 많음 - 표준화 부족
NoSQL 데이터베이스마다 사용법이 다르고 통일된 표준이 없음 - 성숙도
관계형 데이터베이스에 비해 상대적으로 생태계와 도구가 덜 발전됨 - 관리의 복잡성
분산 시스템 관리와 운영에 전문 지식이 필요함
데이터 독립성
데이터 독립성은 하위 단계의 데이터 구조가 변경되더라도 상위 단계에 영향을 미치지 않는 특성을 말한다. 데이터 독립성은 논리적 데이터 독립성과 물리적 데이터 독립성으로 구분된다.
논리적 데이터 독립성 (Logical Data Independence)
논리적 데이터 독립성은 개념 스키마가 변경되어도 외부 스키마에는 영향을 미치지 않도록 지원하는 것을 말함
- 응용 프로그램과 데이터베이스를 독립시킴으로써 데이터의 논리적 구조를 변경시키더라도 응용 프로그램은 영향을 받지 않음
- 테이블의 구조가 변경되거나 새로운 속성이 추가되어도 기존 응용 프로그램에 영향을 주지 않음
- 사용자의 관점에서 본 데이터베이스의 논리적 구조가 변경되어도 응용 프로그램은 변경되지 않음
물리적 데이터 독립성 (Physical Data Independence)
물리적 데이터 독립성은 내부 스키마가 변경되어도 개념 스키마에 영향을 미치지 않도록 지원하는 것을 말함
- 저장 장치의 구조 변경, 인덱스의 추가 및 삭제, 파일 구조의 변경 등 물리적 저장 구조가 변경되어도 개념 스키마나 응용 프로그램에 영향을 주지 않음
- 데이터베이스의 성능 향상을 위해 물리적 구조를 변경할 수 있음
- 논리적 데이터 독립성보다 구현하기 쉬움
데이터베이스의 구조
스키마 (Schema)
스키마는 데이터베이스의 구조와 제약 조건에 관한 전반적인 명세를 기술한 것으로, 데이터베이스를 구성하는 데이터 개체(Entity), 속성(Attribute), 관계(Relationship) 및 제약 조건 등을 정의함
- 외부 스키마 (External Schema) = 뷰 = 서비스키마
사용자나 응용 프로그래머가 각 개인의 입장에서 필요로 하는 데이터베이스의 논리적 구조를 정의한 것으로, 서브 스키마라고도 함 - 개념 스키마 (Conceptual Schema)
데이터베이스의 전체적인 논리적 구조로, 모든 응용 프로그램이나 사용자들이 필요로 하는 데이터를 종합한 조직 전체의 데이터베이스를 의미함 - 내부 스키마 (Internal Schema)
물리적 저장 장치의 입장에서 본 데이터베이스 구조로, 실제로 데이터베이스에 저장될 레코드의 물리적인 구조를 정의함
데이터베이스의 3단계 구조
데이터베이스의 3단계 구조는 외부 스키마, 개념 스키마, 내부 스키마로 구분되며, 각 단계 간의 독립성을 유지하여 데이터베이스 관리의 효율성을 높임
- 외부 단계 (External Level)
개별 사용자 관점의 데이터베이스로, 각 사용자가 보는 데이터베이스의 일부분을 나타냄. 여러 개의 외부 스키마가 존재할 수 있음 - 개념 단계 (Conceptual Level)
조직 전체의 관점에서 본 데이터베이스로, 데이터베이스에 저장되는 데이터와 그들 간의 관계를 표현함. 하나의 개념 스키마만 존재함 - 내부 단계 (Internal Level)
물리적 저장 장치의 관점에서 본 데이터베이스로, 데이터가 실제로 저장되는 방법을 정의함. 하나의 내부 스키마만 존재함
데이터 사전 (Data Dictionary)
데이터 사전은 데이터베이스에 저장되어 있는 모든 데이터 객체들에 대한 정보를 유지·관리하는 시스템으로, 메타데이터(Metadata)를 저장하고 관리함
- 시스템 카탈로그
데이터 사전은 시스템 카탈로그라고도 하며, DBMS가 스스로 생성하고 유지함 - 저장 내용
데이터베이스 객체(테이블, 뷰, 인덱스 등)의 정의, 데이터 타입, 제약 조건, 사용자 권한, 무결성 규칙 등의 정보를 포함함 - 접근 방식
일반 사용자는 읽기만 가능하며, DBMS만이 데이터 사전을 갱신할 수 있음 - 역할
데이터베이스 설계 및 관리의 기초 자료로 활용되며, 데이터 무결성 유지와 보안 관리에 중요한 역할을 함
데이터 디렉토리 (Data Directory)
데이터 디렉토리는 데이터 사전에 수록된 데이터에 실제로 접근하는 데 필요한 위치 정보를 관리하는 시스템임
- 물리적 위치 정보
데이터가 실제로 저장된 물리적 위치와 접근 경로에 대한 정보를 유지함 - 시스템 전용
데이터 디렉토리는 사용자가 접근할 수 없으며, DBMS만이 사용하고 관리함 - 성능 최적화
효율적인 데이터 접근과 검색을 위해 데이터의 물리적 위치 정보를 관리함 - 데이터 사전과의 관계
데이터 사전이 논리적 정보를 담당한다면, 데이터 디렉토리는 물리적 정보를 담당하여 상호 보완적인 역할을 수행함
데이터베이스 언어(DDL, DML, DCl)
데이터베이스 언어는 데이터베이스를 정의하고 조작하며 제어하기 위해 사용되는 언어로, DDL, DML, DCL로 구분됨.
DDL (Data Definition Language, 데이터 정의어)
DDL은 데이터베이스 구조를 정의하거나 변경, 삭제하는 데 사용되는 언어
스키마, 테이블, 뷰, 인덱스 등의 데이터베이스 객체를 생성하고 관리함
| 명령어 | 기능 | 설명 |
|---|---|---|
| CREATE | 생성 | 새로운 데이터베이스 객체(테이블, 뷰, 인덱스 등)를 생성 |
| ALTER | 변경 | 기존 데이터베이스 객체의 구조를 변경 |
| DROP | 삭제 | 데이터베이스 객체를 삭제 |
| TRUNCATE | 내용 삭제 | 테이블의 모든 데이터를 삭제하지만 구조는 유지 |
| - 특징 | ||
| DDL 명령어는 자동으로 커밋(Auto Commit)되므로 ROLLBACK이 불가능합니다. | ||
| - 예시 | ||
CREATE TABLE 학생 (학번 INT, 이름 VARCHAR(50), 학과 VARCHAR(50)); |
DML (Data Manipulation Language, 데이터 조작어)
DML은 데이터베이스 내의 데이터를 검색, 삽입, 수정, 삭제하는 데 사용되는 언어입니다. 사용자가 데이터베이스의 데이터를 실질적으로 처리하는 데 사용됩니다.
| 명령어 | 기능 | 설명 |
|---|---|---|
| SELECT | 검색 | 데이터베이스에서 데이터를 검색하고 조회 |
| INSERT | 삽입 | 테이블에 새로운 데이터를 삽입 |
| UPDATE | 수정 | 테이블의 기존 데이터를 수정 |
| DELETE | 삭제 | 테이블에서 특정 데이터를 삭제 |
| - 특징 | ||
| DML 명령어는 트랜잭션을 발생시키므로 COMMIT이나 ROLLBACK을 통해 변경 사항을 확정하거나 취소할 수 있습니다. | ||
| - 예시 | ||
SELECT * FROM 학생 WHERE 학과 = '컴퓨터공학'; |
||
INSERT INTO 학생 VALUES (20250001, '김철수', '컴퓨터공학'); |
DCL (Data Control Language, 데이터 제어어)
DCL은 데이터베이스에 대한 접근 권한을 제어하고 트랜잭션을 관리하는 데 사용되는 언어입니다. 데이터의 보안과 무결성을 유지하는 역할을 합니다.
| 명령어 | 기능 | 설명 |
|---|---|---|
| GRANT | 권한 부여 | 사용자에게 데이터베이스 객체에 대한 접근 권한을 부여 |
| REVOKE | 권한 취소 | 사용자에게 부여된 권한을 취소 |
| COMMIT | 트랜잭션 확정 | 트랜잭션의 작업 결과를 데이터베이스에 영구적으로 반영 |
| ROLLBACK | 트랜잭션 취소 | 트랜잭션의 작업을 취소하고 이전 상태로 되돌림 |
| SAVEPOINT | 저장점 설정 | 트랜잭션 내에서 특정 지점을 표시하여 부분 롤백 가능 |
| - 특징 | ||
| DCL은 데이터베이스의 보안과 무결성을 관리하며, 다중 사용자 환경에서 중요한 역할을 합니다. | ||
| - 예시 | ||
GRANT SELECT, INSERT ON 학생 TO 사용자1; |
||
REVOKE INSERT ON 학생 FROM 사용자1; |
||
COMMIT; |
데이터베이스 언어의 분류 비교
| 구분 | DDL | DML | DCL |
|---|---|---|---|
| 대상 | 데이터베이스 구조 | 데이터베이스 내의 데이터 | 사용자 권한 및 트랜잭션 |
| 주요 명령어 | CREATE, ALTER, DROP, TRUNCATE | SELECT, INSERT, UPDATE, DELETE | GRANT, REVOKE, COMMIT, ROLLBACK |
| 트랜잭션 | 자동 커밋 (ROLLBACK 불가) | 수동 커밋 (ROLLBACK 가능) | 트랜잭션 제어 |
| 영향 범위 | 스키마 및 객체 구조 | 데이터 내용 | 보안 및 무결성 |
| 사용 주체 | 데이터베이스 관리자(DBA) | 일반 사용자 및 응용 프로그램 | 데이터베이스 관리자(DBA) |
RDBMS 기본 용어
- 릴레이션 (Relation): 행과 열로 구성된 2차원 테이블 형태의 데이터 구조
- 속성 (Attribute): 릴레이션의 열(Column)로, 개체의 특성을 나타냄
- 튜플 (Tuple): 릴레이션의 행(Row)로, 하나의 개체에 대한 정보를 표현
- 도메인 (Domain): 하나의 속성이 가질 수 있는 모든 가능한 값들의 집합
- 차수 (Degree): 릴레이션에 포함된 속성(열)의 개수
- 카디널리티 (Cardinality): 릴레이션에 포함된 튜플(행)의 개수
릴레이션의 특징
- 튜플의 유일성: 릴레이션 내의 모든 튜플은 유일해야 함. 즉, 중복된 튜플은 존재할 수 없음
- 튜플의 무순서: 튜플들 사이에는 순서가 없음. 어떤 순서로 저장되어 있든 같은 릴레이션으로 간주됨
- 속성의 무순서: 속성들 사이에도 순서가 없음. 속성의 위치가 바뀌어도 같은 릴레이션임
- 속성의 원자성: 각 속성의 값은 더 이상 분해할 수 없는 원자값만 가질 수 있음. 다중 값이나 복합 값을 가질 수 없음
데이터베이스의 키
슈퍼 키 (Super Key)
튜플을 유일하게 식별할 수 있는 속성 또는 속성들의 집합. 유일성은 만족하지만 최소성은 보장되지 않음
- 예시: 학생 테이블에서 (학번), (학번, 이름), (학번, 주민등록번호) 모두 슈퍼 키가 될 수 있음
후보 키 (Candidate Key)
튜플을 유일하게 식별할 수 있는 최소한의 속성 집합. 유일성과 최소성을 모두 만족함
- 특징: 슈퍼 키 중에서 불필요한 속성을 제거한 키
- 예시: 학생 테이블에서 학번, 주민등록번호가 각각 후보 키가 될 수 있음
기본 키 (Primary Key)
후보 키 중에서 선택된 주 키. 릴레이션에서 튜플을 유일하게 식별하기 위해 사용됨
- 특징: NULL 값을 가질 수 없고, 중복된 값이 있어서는 안 됨
- 선정 기준: 자주 사용되는 속성, 값이 변경될 가능성이 적은 속성, 간단한 속성을 선택
- 예시: 학생 테이블에서 학번을 기본 키로 설정
대체 키 (Alternate Key)
후보 키 중에서 기본 키로 선택되지 않은 나머지 키
- 예시: 학생 테이블에서 학번을 기본 키로 선택했다면, 주민등록번호는 대체 키가 됨
외래 키 (Foreign Key)
다른 릴레이션의 기본 키를 참조하는 속성 또는 속성들의 집합. 릴레이션 간의 관계를 표현하는 데 사용됨
- 특징: 참조 무결성 제약 조건을 유지하기 위해 사용됨
- 특징: NULL 값을 가질 수 있고, 중복된 값도 허용됨
- 예시: 수강 테이블의 학번 속성이 학생 테이블의 학번(기본 키)을 참조하는 경우
복합 키 (Composite Key)
두 개 이상의 속성을 조합하여 만든 키. 단일 속성으로는 튜플을 유일하게 식별할 수 없을 때 사용됨
- 예시: 수강 테이블에서 (학번, 과목코드)를 조합하여 기본 키로 설정
무결성 제약
개체 무결성 (Entity Integrity)
기본 키는 NULL 값을 가질 수 없으며, 릴레이션 내에서 중복될 수 없다는 제약 조건
- 목적: 각 튜플을 유일하게 식별할 수 있도록 보장
- 규칙: 기본 키를 구성하는 모든 속성은 NULL 값을 가질 수 없고, 릴레이션 내에서 유일한 값을 가져야 함
- 예시: 학생 테이블에서 학번(기본 키)은 NULL이 될 수 없으며, 모든 학생은 서로 다른 학번을 가져야 함
참조 무결성 (Referential Integrity)
외래 키 값은 참조하는 릴레이션의 기본 키 값과 일치하거나 NULL이어야 한다는 제약 조건
- 목적: 릴레이션 간의 관계를 일관성 있게 유지하고, 존재하지 않는 데이터를 참조하는 것을 방지
- 규칙: 외래 키는 참조하는 릴레이션에 존재하는 값이거나 NULL이어야 함
- 예시: 수강 테이블의 학번(외래 키)은 학생 테이블에 존재하는 학번이거나 NULL이어야 함
- 참고: 자세한 내용은 아래 참조 무결성 제약 조건 섹션 참조
도메인 무결성 (Domain Integrity)
각 속성 값은 해당 속성이 정의된 도메인에 속한 값이어야 한다는 제약 조건
- 목적: 속성 값이 허용된 범위 내의 올바른 데이터 타입과 형식을 갖도록 보장
- 규칙: 속성 값은 해당 속성의 도메인에서 정의한 데이터 타입, 길이, 형식, 범위 등을 만족해야 함
- 예시: 나이 속성의 도메인이 0~150의 정수로 정의되어 있다면, -5나 200 같은 값은 입력할 수 없음
- 예시: 성별 속성의 도메인이 {'남', '여'}로 정의되어 있다면, 다른 값은 입력할 수 없음
SQL 뷰
뷰의 개념
뷰(View)는 하나 이상의 기본 테이블로부터 유도된 가상 테이블(Virtual Table)로, 물리적으로 존재하지 않고 논리적으로만 존재하는 테이블이다. 뷰는 기본 테이블의 데이터를 기반으로 정의되며, 사용자에게는 실제 테이블처럼 보이지만 실제 데이터를 저장하지 않고 정의만 저장한다.
뷰의 특징
- 가상 테이블: 뷰는 물리적으로 데이터를 저장하지 않으며, 뷰에 대한 질의가 수행될 때 기본 테이블로부터 동적으로 데이터를 가져온다
- 독립성: 기본 테이블의 구조가 변경되어도 뷰를 이용하는 응용 프로그램은 변경할 필요가 없어 논리적 데이터 독립성을 제공한다
- 보안성: 사용자에게 기본 테이블의 특정 컬럼이나 행만 접근하도록 제한할 수 있어 데이터 보안을 강화할 수 있다
- 편리성: 복잡한 질의를 뷰로 정의해두면 사용자는 간단한 질의만으로 원하는 결과를 얻을 수 있다
- 단순화: 여러 테이블을 조인한 복잡한 쿼리를 뷰로 정의하여 데이터 접근을 단순화할 수 있다
뷰의 장점
- 논리적 독립성 제공: 응용 프로그램과 데이터베이스 간의 논리적 독립성을 제공하여 유지보수가 용이하다
- 데이터 보안 강화: 민감한 데이터를 숨기고 필요한 데이터만 노출할 수 있다
- 사용자 편의성: 복잡한 쿼리를 단순화하여 사용자가 쉽게 데이터에 접근할 수 있다
- 동일 데이터의 다양한 관점 제공: 같은 기본 테이블로부터 여러 개의 뷰를 생성하여 다양한 관점으로 데이터를 볼 수 있다
뷰의 단점
- 성능 저하 가능성: 뷰는 매번 기본 테이블로부터 데이터를 가져오므로 복잡한 뷰의 경우 성능이 저하될 수 있다
- 갱신 제약: 뷰를 통한 데이터 삽입, 수정, 삭제에는 제약이 있으며, 특정 조건을 만족하는 뷰만 갱신 가능하다
- 저장 공간: 뷰의 정의는 시스템 카탈로그에 저장되므로 뷰가 많을 경우 저장 공간이 필요하다
뷰의 생성과 삭제
생성: CREATE VIEW 문을 사용하여 뷰를 생성한다
CREATE VIEW 뷰이름 AS
SELECT 컬럼1, 컬럼2, ...
FROM 테이블명
WHERE 조건;
삭제: DROP VIEW 문을 사용하여 뷰를 삭제한다
DROP VIEW 뷰이름;
뷰의 갱신 가능 조건
모든 뷰가 갱신 가능한 것은 아니며, 다음 조건을 만족하는 뷰만 갱신(INSERT, UPDATE, DELETE)이 가능하다:
- 하나의 기본 테이블로부터 유도된 뷰
- GROUP BY, HAVING, DISTINCT, 집계 함수를 사용하지 않은 뷰
- UNION, INTERSECT, MINUS 등의 집합 연산자를 사용하지 않은 뷰
- 기본 테이블의 기본 키를 포함하는 뷰
- 산술 연산자나 함수를 사용하여 계산된 컬럼이 없는 뷰
데이터베이스 설계
데이터베이스 설계 단계
데이터베이스 설계는 사용자의 요구사항을 분석하여 효율적이고 안정적인 데이터베이스를 구축하기 위한 과정으로, 크게 5단계로 나뉜다.
- 요구사항 분석 (Requirements Analysis)데이터베이스를 사용할 사용자들의 요구사항을 수집하고 분석하는 단계다. 어떤 데이터가 필요하고, 어떤 작업을 수행해야 하는지를 파악한다.
- 주요 활동: 사용자 인터뷰, 기존 시스템 분석, 데이터 및 처리 요구사항 명세화
- 결과물: 요구사항 명세서
- 개념적 설계 (Conceptual Design)요구사항 분석 결과를 바탕으로 데이터베이스의 전체적인 구조를 추상적으로 표현하는 단계다. DBMS에 독립적인 개념적 스키마를 설계한다.
- 사용 도구: ER 다이어그램 (Entity-Relationship Diagram)
- 주요 요소: 개체(Entity), 속성(Attribute), 관계(Relationship) 정의
- 결과물: 개념적 스키마 (ER 다이어그램)
- 논리적 설계 (Logical Design)개념적 스키마를 특정 DBMS가 처리할 수 있는 논리적 스키마로 변환하는 단계다. 관계형 데이터베이스의 경우 테이블, 컬럼, 제약조건 등을 정의한다.
- 주요 활동: ER 다이어그램을 릴레이션 스키마로 변환, 정규화 수행, 트랜잭션 인터페이스 설계
- 결과물: 논리적 스키마 (릴레이션 스키마, 제약조건 명세)
- 물리적 설계 (Physical Design)논리적 스키마를 실제 저장장치에 저장할 수 있도록 물리적 구조를 설계하는 단계다. 성능을 고려하여 저장 구조, 접근 경로, 인덱스 등을 결정한다.
- 주요 활동: 저장 레코드 형식 설계, 인덱스 설계, 접근 경로 설계, 저장 공간 할당
- 고려사항: 응답 시간, 저장 공간 효율, 트랜잭션 처리량
- 결과물: 물리적 스키마
- 구현 (Implementation)설계된 스키마를 실제 DBMS를 사용하여 데이터베이스로 구축하는 단계다. SQL의 DDL(Data Definition Language)을 사용하여 테이블, 인덱스, 제약조건 등을 생성한다.
- 주요 활동: 테이블 생성, 인덱스 생성, 뷰 정의, 권한 설정, 테스트 데이터 입력
- 결과물: 실제 운영 가능한 데이터베이스
이상현상
이상현상의 정의
이상현상(Anomaly)은 테이블이 제대로 정규화되지 않았을 때 발생하는 데이터의 중복성과 종속성 문제로 인한 불일치 현상이다. 잘못 설계된 테이블에서 데이터를 삽입, 삭제, 수정할 때 예상치 못한 문제가 발생할 수 있다.
이상현상의 종류
1. 삽입 이상 (Insertion Anomaly)
새로운 데이터를 삽입할 때 불필요한 데이터까지 함께 삽입해야 하거나, 특정 데이터를 삽입할 수 없는 현상이다.
- 예시: 학생 테이블에 (학번, 이름, 수강과목, 담당교수) 속성이 있을 때, 아직 수강 신청을 하지 않은 신입생의 정보를 입력하려면 수강과목과 담당교수에 NULL 값을 넣어야 한다
- 문제점: 원하는 정보만 독립적으로 삽입할 수 없고, 불필요한 NULL 값이나 더미 데이터가 발생한다
2. 삭제 이상 (Deletion Anomaly)
특정 데이터를 삭제할 때 의도하지 않은 다른 데이터까지 함께 삭제되는 현상이다.
- 예시: 학생이 수강 중인 과목을 취소하려고 해당 튜플을 삭제하면, 그 학생의 학번과 이름 등 기본 정보까지 함께 삭제될 수 있다
- 문제점: 원하지 않는 정보까지 손실되어 데이터 무결성이 깨진다
3. 갱신 이상 (Update Anomaly)
중복된 데이터 중 일부만 수정되어 데이터 불일치가 발생하는 현상이다.
- 예시: 한 교수가 여러 과목을 담당할 때, 교수의 연락처를 변경하려면 해당 교수가 담당하는 모든 튜플을 찾아서 수정해야 한다. 만약 일부만 수정하면 같은 교수의 연락처가 서로 다르게 저장된다
- 문제점: 데이터의 일관성이 깨지고, 모든 중복 데이터를 찾아 수정해야 하므로 비효율적이다
이상현상의 해결 방법
이상현상은 테이블이 정규화되지 않았을 때 발생하므로, 정규화(Normalization)를 통해 테이블을 적절히 분해하고 함수적 종속성을 제거하면 해결할 수 있다. 정규화를 통해 데이터 중복을 최소화하고 각 테이블이 명확한 목적을 갖도록 설계해야 한다.
정규화
정규화의 개념
정규화(Normalization)는 관계형 데이터베이스의 설계 과정에서 데이터의 중복을 최소화하고 데이터 무결성을 향상시키기 위해 테이블을 체계적으로 분해하는 과정이다. 이상현상을 제거하고 데이터베이스의 논리적 설계를 개선하는 것이 주요 목적이다.
정규화의 특징
- 데이터 중복 최소화: 같은 데이터를 여러 곳에 저장하지 않도록 테이블을 분해한다
- 이상현상 방지: 삽입, 삭제, 갱신 이상을 제거하여 데이터의 일관성을 유지한다
- 저장 공간 효율화: 중복 데이터를 제거하여 저장 공간을 절약한다
- 데이터 무결성 향상: 함수적 종속성을 명확히 하여 데이터의 정확성을 보장한다
- 유지보수 용이: 데이터 구조가 체계적이어서 수정 및 관리가 쉽다
정규화 과정
정규화는 단계적으로 진행되며, 각 단계를 정규형(Normal Form)이라고 한다. 일반적으로 제3정규형까지 수행하면 실무에서 충분하다.
제1정규형 (1NF, First Normal Form)
조건: 모든 속성의 도메인이 원자값(Atomic Value)만으로 구성되어야 한다.
- 반복 그룹을 제거한다
- 다중값 속성(Multi-valued Attribute)을 제거한다
- 각 속성은 하나의 값만 가져야 한다
예시:
정규화 전 (1NF 위반):
| 학번 | 이름 | 수강과목 |
|---|---|---|
| 2021001 | 김철수 | 데이터베이스, 운영체제, 알고리즘 |
| 2021002 | 이영희 | 자료구조, 네트워크 |
정규화 후 (1NF 만족):
| 학번 | 이름 | 수강과목 |
|---|---|---|
| 2021001 | 김철수 | 데이터베이스 |
| 2021001 | 김철수 | 운영체제 |
| 2021001 | 김철수 | 알고리즘 |
| 2021002 | 이영희 | 자료구조 |
| 2021002 | 이영희 | 네트워크 |
제2정규형 (2NF, Second Normal Form)
조건: 제1 정규형을 만족하고, 모든 비주요 속성이 기본 키에 완전 함수 종속되어야 한다.
- 부분 함수 종속(Partial Functional Dependency)을 제거한다
- 기본 키가 복합 키일 때, 기본 키의 일부분에만 종속되는 속성을 분리한다
예시:
정규화 전 (2NF 위반):
| 학번 | 과목코드 | 학생이름 | 과목명 | 성적 |
|---|---|---|---|---|
| 2021001 | CS101 | 김철수 | 데이터베이스 | A |
| 2021001 | CS102 | 김철수 | 운영체제 | B |
| - 기본키: (학번, 과목코드) | ||||
| - 학생이름은 학번에만 종속 → 부분 함수 종속 | ||||
| - 과목명은 과목코드에만 종속 → 부분 함수 종속 |
정규화 후 (2NF 만족):
학생 테이블:
| 학번 | 학생이름 |
|---|---|
| 2021001 | 김철수 |
| 2021002 | 이영희 |
과목 테이블:
| 과목코드 | 과목명 |
|---|---|
| CS101 | 데이터베이스 |
| CS102 | 운영체제 |
수강 테이블:
| 학번 | 과목코드 | 성적 |
|---|---|---|
| 2021001 | CS101 | A |
| 2021001 | CS102 | B |
제3정규형 (3NF, Third Normal Form)
조건: 제2정규형을 만족하고, 모든 비주요 속성이 기본키에 이행적 함수 종속(Transitive Functional Dependency)이 되지 않아야 한다.
- 이행적 함수 종속을 제거한다
- A → B, B → C일 때 A → C가 성립하는 경우를 분리한다
예시:
정규화 전 (3NF 위반):
| 학번 | 학생이름 | 학과코드 | 학과명 |
|---|---|---|---|
| 2021001 | 김철수 | CS | 컴퓨터공학과 |
| 2021002 | 이영희 | EE | 전자공학과 |
| - 학번 → 학과코드 → 학과명 (이행적 함수 종속) |
정규화 후 (3NF 만족):
학생 테이블:
| 학번 | 학생이름 | 학과코드 |
|---|---|---|
| 2021001 | 김철수 | CS |
| 2021002 | 이영희 | EE |
학과 테이블:
| 학과코드 | 학과명 |
|---|---|
| CS | 컴퓨터공학과 |
| EE | 전자공학과 |
BCNF (Boyce-Codd Normal Form)
조건: 제3정규형을 만족하고, 모든 결정자(Determinant)가 후보키(Candidate Key)여야 한다.
- 3NF보다 강한 제약 조건을 가진다
- 후보키가 아닌 속성이 다른 속성을 결정하는 경우를 제거한다
예시:
정규화 전 (BCNF 위반):
| 학번 | 과목명 | 교수 |
|---|---|---|
| 2021001 | 데이터베이스 | 김교수 |
| 2021002 | 데이터베이스 | 김교수 |
| - 후보키: (학번, 과목명) | ||
| - 교수 → 과목명 (교수가 결정자지만 후보키가 아님) |
정규화 후 (BCNF 만족):
수강 테이블:
| 학번 | 교수 |
|---|---|
| 2021001 | 김교수 |
| 2021002 | 김교수 |
담당 테이블:
| 교수 | 과목명 |
|---|---|
| 김교수 | 데이터베이스 |
제4정규형 (4NF, Fourth Normal Form)
조건: BCNF를 만족하고, 다치 종속(Multi-valued Dependency)이 없어야 한다.
- 한 속성이 다른 속성에 대해 다중값을 가지는 경우를 제거한다
제5정규형 (5NF, Fifth Normal Form)
조건: 제4정규형을 만족하고, 조인 종속(Join Dependency)이 없어야 한다.
- 테이블을 분해했다가 다시 조인해도 정보 손실이 없어야 한다
트랜잭션
트랜잭션의 개념
트랜잭션(Transaction)은 데이터베이스에서 수행되는 작업의 논리적 단위로, 분리될 수 없는 하나 이상의 데이터베이스 연산들의 집합을 의미한다. 예를 들어 은행 계좌 이체 시 출금과 입금은 반드시 함께 성공하거나 함께 실패해야 하는데, 이러한 일련의 연산들을 하나의 트랜잭션으로 묶어 처리한다.
트랜잭션의 특성 (ACID)
트랜잭션은 데이터베이스의 무결성을 보장하기 위해 ACID라는 4가지 특성을 만족해야 한다.
1. 원자성 (Atomicity)
- 트랜잭션의 모든 연산이 완전히 수행되거나 전혀 수행되지 않아야 한다 (All or Nothing)
- 트랜잭션 도중 오류 발생 시 모든 작업이 취소되고 원래 상태로 복구된다
2. 일관성 (Consistency)
- 트랜잭션 실행 전후에 데이터베이스가 일관된 상태를 유지해야 한다
- 트랜잭션이 성공적으로 완료되면 언제나 일관성 있는 데이터베이스 상태로 변환된다
3. 격리성 (Isolation)
- 여러 트랜잭션이 동시에 실행될 때 각 트랜잭션은 다른 트랜잭션의 영향을 받지 않고 독립적으로 실행되는 것처럼 동작해야 한다
- 한 트랜잭션의 중간 결과가 다른 트랜잭션에게 보이지 않아야 한다
4. 지속성 (Durability)
- 트랜잭션이 성공적으로 완료(Commit)되면 그 결과는 영구적으로 데이터베이스에 반영되어야 한다
- 시스템 장애가 발생해도 커밋된 트랜잭션의 결과는 보존된다
트랜잭션의 주요 연산
1. Commit
- 트랜잭션의 모든 연산이 성공적으로 완료되었음을 알리는 연산
- 트랜잭션의 결과를 데이터베이스에 영구적으로 반영한다
- Commit 이후에는 트랜잭션을 되돌릴 수 없다
2. Rollback
- 트랜잭션 실행 중 오류가 발생했을 때 트랜잭션의 모든 연산을 취소하는 연산
- 데이터베이스를 트랜잭션 시작 전 상태로 되돌린다
- 트랜잭션의 원자성을 보장하는 핵심 연산이다
3. Savepoint
- 트랜잭션 내에서 특정 지점을 저장하는 연산
- 전체 트랜잭션을 롤백하지 않고 특정 Savepoint까지만 롤백할 수 있다
- 긴 트랜잭션에서 부분적인 롤백이 필요할 때 유용하다
동시성 제어(Concurrency Control)
동시성 제어의 개념
동시성 제어(Concurrency Control)는 다수의 사용자가 동시에 데이터베이스에 접근하여 트랜잭션을 수행할 때, 각 트랜잭션이 정확하고 일관된 결과를 얻을 수 있도록 제어하는 기법이다. 여러 트랜잭션이 동시에 실행되면서도 데이터의 무결성과 일관성을 유지하는 것이 핵심 목표다.
동시성 제어의 목적
- 데이터 무결성 보장: 동시에 실행되는 트랜잭션들이 서로 간섭하지 않도록 하여 데이터베이스의 정확성을 유지한다
- 일관성 유지: 트랜잭션 실행 전후로 데이터베이스가 일관된 상태를 유지하도록 보장한다
- 시스템 성능 향상: 여러 트랜잭션을 동시에 처리함으로써 시스템의 처리량과 응답 시간을 개선한다
- 격리성 보장: 각 트랜잭션이 독립적으로 실행되는 것처럼 보이도록 하여 ACID 특성 중 격리성을 구현한다
동시성 제어 문제점
동시성 제어가 제대로 이루어지지 않으면 다음과 같은 문제가 발생할 수 있다.
1. 갱신 손실 (Lost Update)
- 두 개 이상의 트랜잭션이 같은 데이터를 동시에 갱신할 때, 하나의 갱신 결과가 다른 트랜잭션의 갱신 결과로 덮어씌워지는 문제
- 예: T1과 T2가 동시에 같은 계좌에서 출금하면 한 쪽의 출금 내역이 사라질 수 있다
2. 모순성 (Inconsistency)
- 하나의 트랜잭션이 여러 개의 데이터를 갱신하는 도중에 다른 트랜잭션이 그 데이터들을 접근하여 일관성 없는 상태의 데이터를 읽는 문제
- 예: 계좌 이체 중 출금은 완료되었지만 입금 전에 다른 트랜잭션이 잔액을 조회하는 경우
3. 연쇄 복귀 (Cascading Rollback)
- 한 트랜잭션이 롤백될 때, 해당 트랜잭션이 갱신한 데이터를 읽은 다른 트랜잭션들도 함께 롤백되어야 하는 문제
- 여러 트랜잭션이 연쇄적으로 롤백되면 시스템 성능이 크게 저하된다
4. 비완료 의존성 (Uncommitted Dependency, Dirty Read)
- 한 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 갱신 결과를 읽는 문제
- 만약 갱신한 트랜잭션이 롤백되면 잘못된 데이터를 읽은 것이 된다
5. 반복 불가능 읽기 (Non-repeatable Read)
- 한 트랜잭션이 같은 데이터를 두 번 읽을 때, 그 사이에 다른 트랜잭션이 데이터를 수정하여 두 번의 읽기 결과가 다른 문제
- 트랜잭션 내에서 데이터의 일관성이 깨진다
6. 유령 데이터 읽기 (Phantom Read)
- 한 트랜잭션이 같은 조건으로 데이터를 두 번 조회할 때, 그 사이에 다른 트랜잭션이 데이터를 삽입하거나 삭제하여 조회 결과가 달라지는 문제
- 반복 불가능 읽기와 유사하지만 행의 개수 자체가 변하는 차이가 있다
동시성 제어 기법
동시성 제어를 위한 다양한 기법들이 존재하며, 각각의 기법은 서로 다른 방식으로 트랜잭션 간의 충돌을 방지하고 데이터 일관성을 유지한다.
1. 로킹 (Locking)
로킹은 가장 널리 사용되는 동시성 제어 기법으로, 트랜잭션이 데이터에 접근하기 전에 잠금(Lock)을 획득하여 다른 트랜잭션의 접근을 제어하는 방법이다.
- 공유 락(Shared Lock, S-Lock): 읽기 연산을 위한 잠금으로, 여러 트랜잭션이 동시에 획득할 수 있다
- 배타 락(Exclusive Lock, X-Lock): 쓰기 연산을 위한 잠금으로, 한 트랜잭션만 획득할 수 있다
- 2단계 로킹 프로토콜(Two-Phase Locking, 2PL): 확장 단계(Growing Phase)에서는 락만 획득하고, 축소 단계(Shrinking Phase)에서는 락만 해제하여 직렬성을 보장한다
2. 타임스탬프 순서 (Timestamp Ordering)
각 트랜잭션에 고유한 타임스탬프를 부여하고, 타임스탬프 순서대로 트랜잭션을 실행하는 것처럼 동작하도록 제어하는 기법이다.
- 트랜잭션이 시작될 때 시스템 시간이나 논리적 카운터를 기반으로 타임스탬프를 할당한다
- 데이터 항목마다 읽기 타임스탬프(Read-Timestamp)와 쓰기 타임스탬프(Write-Timestamp)를 유지한다
- 타임스탬프 순서를 위반하는 연산은 거부되고 해당 트랜잭션은 롤백된다
3. 낙관적 검증 (Optimistic Concurrency Control)
트랜잭션 실행 중에는 제약을 가하지 않고, 트랜잭션이 완료될 시점에 검증(Validation)을 수행하는 기법이다.
- 읽기 단계(Read Phase): 트랜잭션이 데이터를 읽고 로컬 복사본에서 작업한다
- 검증 단계(Validation Phase): 트랜잭션이 커밋을 요청할 때 충돌이 있는지 검사한다
- 쓰기 단계(Write Phase): 검증이 성공하면 로컬 복사본의 변경 사항을 데이터베이스에 반영한다
- 충돌이 적은 환경에서 효율적이지만, 충돌이 많으면 롤백이 빈번하게 발생한다
4. 다중 버전 동시성 제어 (Multi-Version Concurrency Control, MVCC)
데이터의 여러 버전을 유지하여 읽기와 쓰기 연산이 서로 블로킹되지 않도록 하는 기법이다.
- 각 트랜잭션은 자신의 타임스탬프에 해당하는 데이터 버전을 읽는다
- 쓰기 연산은 새로운 버전을 생성하며, 이전 버전은 유지된다
- 읽기 연산이 쓰기 연산을 블로킹하지 않아 동시성이 향상된다
- PostgreSQL, MySQL(InnoDB), Oracle 등 많은 상용 DBMS에서 사용된다
'Knowledge > 개발지식' 카테고리의 다른 글
| [Server] 토큰 기반 인증 VS 세션 기반 인증 (0) | 2025.12.07 |
|---|---|
| [CS] 동시성과 병렬성 (0) | 2025.11.01 |