| 학생ID | 이름 | 나이 | 성별 | 학번 | 주민등록번호 |
|---|---|---|---|---|---|
| 1 | 홍길동 | 20 | 남성 | 20240101 | 001022-** |
| 2 | 김영희 | 22 | 여성 | 20240102 | 000230-** |
| 3 | 이철수 | 22 | 남성 | 20240103 | 000512-** |
| 강의ID | 강의명 | 담당교수 |
|---|---|---|
| 101 | 수학 | 김선생 |
| 102 | 영어 | 이선생 |
| 103 | 과학 | 박선생 |
| 수강ID | 학생ID | 강의ID | 성적 |
|---|---|---|---|
| 1 | 1 | 101 | A |
| 2 | 1 | 102 | B |
| 3 | 2 | 103 | A+ |
| 4 | 3 | 101 | C |
데이터 베이스 (Database)
릴레이션(Relation)
튜플, 레코드 (Tuple, Record)
속성, 필드 (Attribute, Field)
도메인(Domain)
카디널리티(Cardinality)
디그리/차수(Degree)
데이터베이스 설계 및 관리에서 중요한 역할을 수행하며, 효율적인 데이터 검색, 관계 정의, 데이터 무결성을 지원한다.
Candidate Key(후보키)
Primary Key(기본기)
Main Key(메인 키)
Alternate Key(대체키)
Super Key(슈퍼키)
Foreign Key(외래키)
여기에서 후보키는 유일성과 최소성을 만족하고, 슈퍼키는 유일성을 만족하는데, 이때 유일성과 최소성은 어떤 의미를 가질까 생각해 볼수 있다.
유일성은 특정 키나 속성이 데이터 집합에서 고유한 값을 가져야 함을 의미하는데, 각 행이나 튜플을 유일하게 식별할 수 있어야 한다는 것이다. 특히 기본키는 모든 튜플에서 유일한 값을 가져야 한다. 이는 중복 데이터를 방지하고 데이터의 정확정을 유지한다.
최소성은 키나 속성이 꼭 필요한 최소한의 속성으로 이루어져야 함을 의미한다. 키를 구성하는 속성들 중에서 어느 하나라도 제거할 경우 고유성이 깨지는 것을 허용하지 않는다. 최소성을 지키면서도 필요한 최소한의 속성으로 구성된 키를 선택하는 것이 중요하다.
예시로 학생 테이블에서 (학번, 주민등록번호)가 후보키라고 가정할때, 이 키가 최소성을 만족하려면 두 속성이 함께 사용되어야 한다. 만약에 (학번)만으로도 유일성을 만족한다면, (학번)이 최소성을 가진 키가 된다고 할수 있다.
주요 명령어
-- 사용자에게 특정 테이블에 대한 SELECT 권한을 부여
GRANT SELECT ON employees TO user1;
-- 사용자로부터 특정 테이블에 대한 INSERT 권한을 회수
REVOKE INSERT ON employees FROM user1;
주요 명령어
-- employees 테이블에서 모든 정보를 조회
SELECT * FROM employees;
-- employees 테이블에 새로운 직원 정보 추가
INSERT INTO employees (employee_id, first_name, last_name) VALUES (101, 'John', 'Doe');
-- employees 테이블에서 조건에 맞는 데이터 수정
UPDATE employees SET salary = 60000 WHERE department_id = 10;
-- employees 테이블에서 조건에 맞는 데이터 삭제
DELETE FROM employees WHERE employee_id = 101;
주요 명령어
-- employees 테이블 생성
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
salary INT
);
-- employees 테이블에 새로운 열 추가
ALTER TABLE employees ADD COLUMN department_id INT;
-- employees 테이블 삭제
DROP TABLE employees;
데이터베이스에서 작업의 논리적인 단위를 나타낸다. 트랜젝션은 여러 개의 데이터베이스 연산들을 하나의 논리적인 작업으로 묶어서, 모두 성공적으로 수행될 때만 데이터베이스를 일관성 있는 상태로 유지하도록 하는 개념
1. 원자성 (Atomicity)
-- 트랜잭션의 시작
START TRANSACTION;
-- 데이터 조작 작업
UPDATE accounts SET balance = balance - 100 WHERE account_id = 123; -- 출금
UPDATE accounts SET balance = balance + 100 WHERE account_id = 456; -- 입금
-- 트랜잭션 종료 및 커밋
COMMIT;
예를들어, 계좌 이체 트랜잭션을 생각해볼수 있다. 이때 보내는 계좌에서 금액을 감소시키는 연산과 받는 계좌에 금액을 증가시키는 연산이 있는데 만약에 어느 한 연산이라도 실패하게 된다면, 트랜잭션이 모두다 롤백이 되어야 한다는 것이다. 보내는 계좌에서 출금 및 받는 계좌의 입금이 동시에 취소된다라고 생각할수 있다.
2. 일관성 (Consistency)
-- 트랜잭션의 시작
START TRANSACTION;
-- 데이터 조작 작업
UPDATE grades SET score = 90 WHERE student_id = 123;
-- 트랜잭션 종료 및 커밋
COMMIT;
일관성을 유지하는 예시로 학생 성적 업데이트 트랜잭션이 있다. 학생의 성적을 업데이트 할때, 성적은 특정 범위(0 ~ 100) 내에 있어야 한다고 가정하면, 일관성을 유지하기 위해 트랜잭션 시작 전 종료 후 일관된 상태로 유지 되어야 한다.
3. 고립성(Isolation)
-- 트랜잭션 1
START TRANSACTION;
UPDATE grades SET score = 95 WHERE student_id = 123;
COMMIT;
-- 트랜잭션 2 (동시에 실행)
START TRANSACTION;
UPDATE grades SET score = 85 WHERE student_id = 456;
COMMIT;
고립성을 유지하기 위해 각 트랜잭션은 서로에게 영향을 주지 않으며, 각 학생의 성적이 동시에 업데이트되어도 서로간의 간섭이 없어야 한다.
4. 지속성(Durability)
계좌 이체 트랜잭션이 성공적으로 이루어 졌을때 영구적으로 데이터 베이스에 저장이 되어야 한다. 이후에 시스템이 다운되거나 장애가 발생 하더라도 결과는 지속적으로 유지가 되어야한다.
시작 (Begin)
종료 (End)
커밋 (Commit)
롤백 (Rollback)
데이터 베이스에서 병행 제어(Concurrency Control)는 여러 트랜잭션이 동시에 데이터베이스에 접근할 때 일관성을 유지하고 데이터 손상을 방지하기 위한 기법이다.
Ex) 상황: 은행 계좌 데이터베이스에서 두 트랜잭션 A와 B가 같은 계좌에서 동시에 인출 작업을 진행 하려고 한다.
1. Locking 단계
2. 인출 작업
3. Lock 해제
로킹 단위의 특징
| 로킹단위 | 로크 수 | 병행성 | 로킹 오버헤드 | 병행성 수준 | 데이터베이스 공유도 |
|---|---|---|---|---|---|
| 커짐 | 감소 | 단순 | 감소 | 낮음 | 감소 |
| 감소 | 증가 | 복잡 | 증가 | 높음 | 증가 |
락을 이용하여 병행 제어를 하게 되면 읽기, 쓰기 트랜잭션 처리할때 서로 충돌을 방지하고 일관성을 유지할수 있다.
타임스탬프(Timestamp) : 일련의 이벤트나 트랙잭션에 대해 시간 정보를 기록하는데 사용하는 값.
Ex) 상황: 두 트랜잭션 A와 B가 동시에 은행 계좌에서 송금 작업을 수행하려고 한다.
1. 타임스탬프 부여
2. 읽기와 쓰기 단계
3. 송금 작업
타임스탬프를 이용한 병행 제어는 트랜잭션의 시작 시간을 기반으로 충돌을 방지하게 되므로 일관성이 유지될수 있다.
데이터베이스에서 데이터 구조, 데이터베이스 객체 간의 관계, 제약 조건 등을 정의하는 데 사용되는 구조적인 틀을 의히한다. 스키마는 데이터베이스의 설계와 관련이 있으며, 데이터베이스에서 사용되는 테이블, 뷰, 인덱스, 프로시저, 트리거 등과 관련된 정보를 포함한다.
1. 물리적 스키마 (Physical Schema)
2. 논리적 스키마 (Logical Schema)
3. 관계 스키마 (Logical Schema)
1. 삽입 이상(Insertion Anomaly)
2. 갱신 이상(Update Anomaly)
3. 삭제이상(Deletion Anonaly)
이상 현상은 잘못된 스키마 설계로 릴레이션에 예기치 못한 현상이 발생하는 것이므로 방지하기 위해서는 정규화를 통해 데이터베이스를 설계하는 것이 일반적으로 권장되고 있다.
1. 완전 함수적 종속성 (Fully Functional Dependency)
2. 부분 함수적 종속성(Partial Functional Dependency)
3. 이행적 함수적 종속성(Transitive Functional Dependency)
4. 다치 함수적 종속성(Multivalued Dependency)
관계 대수는 관계형 데이터베이스에서 데이터를 조작하고 쿼리하는 데 사용되는 형식적인 언어.
1. 선택 (Selection): σ
2. 투영 (Projection): π
3. 합집합 (Union): ∪
4. 차집합 (Difference): -
5. 교집합 (Intersection): ∩
6. 카티션 곱 (Cartesian Product): ×
무결성은 데이터베이스의 정확성, 일관성 및 신뢰성을 보장하기 위한 규칙이나 제약 조건을 의미함.
1. 개체 무결정 (Entity Integrity)
2. 참조 무결성 (Referential Integrity)
3. 도메인 무결성 (Domain Integrity)
4. 키 무결성 (Key Integrity)
5. 데이터 무결성 (Data Integrity)
6. 작업 무결성 (Transaction Integrity)
1. 외부 스키마 (External Schema)
External Schema (Student View):
---------------------------------------
| StudentID | FirstName | LastName |
---------------------------------------
| 1 | John | Doe |
| 2 | Jane | Smith |
| 3 | Mark | Johnson |
예를 들어, 학사 관리 시스템의 외부 스키마는 학생들에게 필요한 정보를 중심으로 정의가 될수 있다. 이런 외부 스키마는 실제로 데이터베이스에 어떤 식으로 저장되는지에 대한 세부 정보가 공개될 필요 없으니, 사용자가 필요로 하는 정보만 제공함.
2. 개념 스키마 (Conceptual Schema)
Conceptual Schema:
-----------------------
| Students | Courses |
| Enrollments |
-----------------------
예를 들어, 학사 관리 시스템의 개념 스키마는 학생, 강의, 수강신청 등의 주요 엔터티와 관계를 정의한다. 개념 스키마는 외부 스키마와 달리 구체적인 사용자 또는 응용 프로그램에 의존하지 않고, 데이터베이스의 전체 구조를 통합적으로 정의한다. 쉽게 말해 외부 스키마의
3. 내부 스키마 (Internal Schema)
Internal Schema (InnoDB Storage):
--------------------------------------
| Tables, Indexing, Clustering, etc. |
--------------------------------------
내부 스키마는 주로 데이터베이스 관리 시스템(DBMS)의 입장에서 이해되며, 물리적 구조와 성능 최적화를 담당한다.
전반적으로 봤을때, 외부 스키마는 사용자나 응용프로그램의 입장에서 데이터베이스를 바라보는 뷰를 정의하고, 개념 스키마는 전체적인 논리적 구조를 정의하며, 내부 스키마는 물리적인 세부 사항을 다룬다.
1. 요구사항 수집 및 분석
예를 들어 학사 관리 시스템을 구축하기 위해 사용자와의 인터뷰를 통해 다양한 요구사항을 수집합니다. 학생 정보, 강의 계획, 성적 등을 포함한 데이터와 해당 데이터를 다루는 기능을 파악한다.
2. 개념적 설계
학생 엔터티와 강의 엔터티 간의 관계를 ERD로 표한한다. 학생은 여러 개의 강의를 수강할 수 있고, 강의는 여러 학생에 의해 수강될 수 있다.
3. 논리적 설계
학생 테이블과 강의 테이블을 생성하고, 강의를 수강한 학생 정보를 나타내기 위해 수강 테이블을 추가한다. 각 테이블의 속성을 정의하고, 정규화를 통해 중복을 최소화 한다.
4. 물리적 설계
각 테이블의 컬럼과 데이터 타입을 정의하고, 각 테이블에 대한 인덱스를 생성한다. 데이터베이스 성능을 고려하여 클러스터링이나 파티셔닝을 결정하고, 보안 정책에 따라 사용자 권한을 부여함.
5. 구현 및 테스트
SQL을 사용하여 정의한 테이블과 인덱스를 생성하고, 테스트 데이터를 입력하여 시스템을 구현한다. 다양한 시나리오에 대해 테스트를 수행하여 데이터베이스가 예상대로 동작하는지 확인.
6. 운영 및 유지보수
운영 환경에 데이터베이스를 배포하고, 백업 및 복구 계획을 수립한다. 성능 모니터링을 통해 시스템의 성능을 지속적으로 관찰하고, 필요에 따라 인덱스 재조정 및 최적화 작업을 수행함.
데이터베이스 설계 과정에서 중복을 최소화 하고 데이터의 일관성을 유지하기 위한 프로세스로, 일반적으로 1NF(제 1정규형)부터 5NF(제 5정규형)까지의 단계로 나누어 진다.
1. 제 1정규형 (1NF)
| 학번 | 과목 |
|---|---|
| 101 | 수학,영어,과학 |
| 102 | 역사,지리 |
1NF 변환
| 학번 | 과목 |
|---|---|
| 101 | 수학 |
| 101 | 영어 |
| 101 | 과학 |
| 102 | 역사 |
| 102 | 지리 |
2. 제 2정규형 (2NF)
- 강의 정보 테이블 -
| 강의 ID | 학생 ID | 강의명 | 성적 |
|---|---|---|---|
| 1 | 101 | 수학 | A |
| 2 | 101 | 영어 | B |
| 2 | 102 | 역사 | A+ |
기본키는 {강의ID, 학생ID}이고, 강의명은 강의ID에만 종속되므로 2NF가 아니다.
2NF 변환
- 강의 테이블 -
| 강의 ID | 강의명 |
|---|---|
| 1 | 수학 |
| 2 | 영어 |
| 2 | 역사 |
- 성적 테이블 -
| 강의 ID | 학생 ID | 성적 |
|---|---|---|
| 1 | 101 | A |
| 2 | 101 | B |
| 2 | 102 | A+ |
3. 제 3정규형 (3NF)
- 교수 정보 테이블 -
| 학과 | 교수명 | 전공 |
|---|---|---|
| 컴퓨터공학 | 김교수 | 데이터베이스 |
| 전자공학 | 박교수 | 회로이론 |
학과는 교수명에 종속되지만 교수명에만 종속되므로 이행적 종속이 존재한다.
3NF 변환
- 학과 테이블 -
| 학과 | 교수명 |
|---|---|
| 컴퓨터공학 | 김교수 |
| 전자공학 | 박교수 |
- 전공 테이블 -
| 교수명 | 전공 |
|---|---|
| 김교수 | 데이터베이스 |
| 박교수 | 회로이론 |
4. BCNF (Boyce-Codd Normal Form)
5. 제 4 정규형 (4NF)
Ex) 다대다(N:M) 관계를 가지는 테이블
- 학생 강의 테이블(Students_Courses) -
| 학생ID | 강의명 |
|---|---|
| 1 | 수학, 영어 |
| 2 | 역사, 과학 |
이 테이블에는 학생ID가 강의명에 다치 종속적인 관계가 있습니다. 한 학생이 여러 강의를 수강하고, 한 강의도 여러 학생이 수강할수 있다.
4NF변환
- 학생 테이블(Students) -
| 학생ID | 이름 |
|---|---|
| 1 | 홍길동 |
| 2 | 하니 |
- 강의 테이블(Courses) -
| 강의ID | 강의명 |
|---|---|
| 1 | 수학 |
| 2 | 영어 |
| 3 | 역사 |
| 4 | 과학 |
- 강의신청 테이블(Enrollments) -
| 학생ID | 강의ID |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
4NF에서는 학생 강의 테이블을 학생 테이블과 강의 테이블로 분해하여 각 테이블 간의 중복을 최소화하고 다치 종속을 제거합니다.
5. 제 5 정규형 (5NF)
- 강의 테이블(Courses) -
| 강의ID | 강의명 |
|---|---|
| 1 | 수학 |
| 2 | 영어 |
- 교재 테이블(TextBooks) -
| 교재ID | 교재명 |
|---|---|
| 1 | 산업수학 |
| 2 | 기하학 |
| 3 | 영어회화 |
| 4 | 문법 |
- 강의-교재 조인 테이블(Courses_Textbooks_Relation) -
| 강의ID | 교재ID |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 2 | 3 |
| 2 | 4 |
여기서 5NF에서는 조인 종속성을 강조하고, 강의 테이블과 교재 테이블을 조인을 통해 필요한 정보를 얻을수 있어야 한다. 즉, 강의와 교재의 조합이 의미를 갖도록 하는 것이 중요하다.
예를 들어서 우리가 수학 강의에 어떤 교재들이 사용되었는지 알고 싶다면, 다음과 같은 SQL 쿼리를 사용해 볼수 있다.
SELECT Courses.CourseName, Textbooks.TextbookName
FROM Courses
JOIN Courses_Textbooks_Relation ON Courses.CourseID = Courses_Textbooks_Relation.CourseID
JOIN Textbooks ON Courses_Textbooks_Relation.TextbookID = Textbooks.TextbookID
WHERE Courses.CourseName = '수학';
이 쿼리는 강의 테이블과 교재 테이블 간의 조인을 통해서 수학강의에 사용된 교재들을 얻어 올수가 있다. 5NF에서는 이러한 조인 연산을 활용하여 필요한 정보를 얻을수 있도록 테이블을 설계한다.