관계형 데이터베이스의 구조
- 관계형 데이터베이스 : 릴레이션의 모임
- 릴레이션(테이블) : 관련있는 데이터의 모임
- instructor는 교수 데이터의 모임
- 속성(테이블의 열) : 저장할 데이터가 공통적으로 가지는 특성
- 각 교수 데이터는 ID, 이름, 학과명, 급여의 속성을 가짐
- 튜플(테이블의 행) : 한 개의 데이터(레코드)
- ID가 1, 이름이 Yang, 학과가 Biology, 급여가 40000인 한 개의 교수 데이터가 있음
데이터베이스 스키마
- 릴레이션 스키마 : 릴레이션의 구조 정의(논리적 설계)
- 릴레이션 인스턴스 : 릴레이션에 저장된 실제 데이터 집합
String str = "Hello";
String은 해당 변수에 들어가는 값의 구조를 정의하고 Hello는 이 구조에 맞는 실제 값입니다
릴레이션 스키마는 프로그래밍 언어의 타입, 릴레이션 인스터스는 프로그래밍 언어의 변수값과 유사합니다
키
* 예시는 상단의 department 테이블 참고
- 수퍼키 : 릴레이션에서 튜플을 유일하게 식별할 수 있는 하나 혹은 여러 속성들의 집합
- 예시 : { dept_name }, { dept_name, building }, { dept_name, budget }, { dept_name, building, budget }, { budget }
- 후보키 : 수퍼키 중 가장 적은 속성으로 유일성이 보장되는(최소성) 키
- 예시 : { dept_name }, { budget }
- 주 키 : 후보키 중에서 대표로 선택된 키, 데이터를 구별하기 위해 이용
- 주 키 제약 조건
- 한 테이블에 반드시 하나만 존재
- 주 키 값은 반드시 존재(Null 불가)
- 주 키는 중복될 수 없음
- 주 키는 변경 가능성이 낮은 속성을 선택
- 예시 : { dept_name } => budget은 중복 가능성, 변경 가능성이 높으므로 dept_name 선택
- 주 키 제약 조건
- 외래키 : 다른 테이블의 키를 참조하는 키, 서로 다른 테이블의 데이터(튜플)를 연관시키기 위해 이용
- 외래키 제약 조건
- 참조 무결성 제약 조건 : 참조하는 릴레이션의 특정 속성이 참조되는 릴레이션의 특정 속성에 출현해야 함
- 특정 속성은 고유해야 하며 주로 주 키를 사용
- 예시 : 주 키로 사용하는 { dept_name }
- 외래키 제약 조건
질의어
- 질의어 : 사용자가 데이터베이스로부터 정보를 요청할 때 사용하는 언어
- 명령형 질의어
- 사용자가 검색 방법을 직접 지정
- 사용자가 직접 상태 갱신
- 예시 : PL/SQL
- 함수형 질의어
- 함수 조합을 통해 데이터 처리하는 방식
- 기존 데이터는 유지하고 변환하여 새로운 데이터 생성(불변성)
- 예시 : 관계 대수, LINQ in C#
- 선언형 질의어
- 원하는 정보만 기술하는 방식
- DBMS가 자동 상태 갱신
- 예시 : SQL
- 명령형 질의어
관계대수
한 개 혹은 두 개의 릴레이션을 입력으로 받아 새로운 릴레이션을 결과로 생성하는 연산들의 집합
Student | |||
Student_ID | Name | Major | Age |
101 | Alice | CS | 21 |
102 | Bob | Math | 22 |
103 | Carol | CS | 20 |
104 | Dave | Physics | 23 |
Course | ||
Course_ID | NAME | Student_ID |
C1 | Database | 101 |
C2 | Algebra | 102 |
C3 | OS | 103 |
C4 | Physics | 104 |
- 선택 연산(σ) : 조건을 만족하는 튜플 선택
- 예시 : σ Major='CS' (Student)
- Student 테이블에서 Major 속성이 'CS'인 튜플만 선택
Student_ID | Name | Major | Age |
101 | Alice | CS | 21 |
103 | Carol | CS | 20 |
- 추출 연산(π) : 특정 속성만 선택
- 예시 : π Name, Major (Student)
- Student 테이블에서 Name, Major 속성만 선택
Name | Major |
Alice | CS |
Bob | Math |
Carol | CS |
Dave | Physics |
- 카티션 곱 연산(×) : 두 릴레이션의 모든 조합 생성
- 예시 : Student × Course
- Student 테이블과 Course 테이블의 모든 조합
Student.Student_ID | Student.Name | Major | Age | Course_ID | Course.Name | Course.Student_ID |
101 | Alice | CS | 21 | C1 | Database | 101 |
101 | Alice | CS | 21 | C2 | Algebra | 102 |
101 | Alice | CS | 21 | C3 | OS | 103 |
101 | Alice | CS | 21 | C4 | Physics | 104 |
- 나머지 12개의 튜플 생략
- 조인 연산(⨝) : 두 릴레이션의 공통 속성을 기준으로 결합, 선택 + 카티션 곱
- 예시 : Student ⨝ Course
- Student_ID를 기준으로 결합한 조합
Student.Student_ID | Student.Name | Major | Age | Course_ID | Course.Name | Course.Student_ID |
101 | Alice | CS | 21 | C1 | Database | 101 |
102 | Bob | Math | 22 | C2 | Algebra | 102 |
103 | Carol | CS | 20 | C3 | OS | 103 |
104 | Dave | Physics | 23 | C4 | Physics | 104 |
- 배정 연산(←) : 릴레이션 변수에 릴레이션을 배정
- 예시 : CS_Student ← π Name, Major(σ Major='CS' (Student))
- CS_Student의 Student 테이블에서 Major 속성이 'CS'인 튜플 중 Name, Major 속성만 선택
- 재명명 연산(ρ) : 릴레이션 또는 속성의 이름 변경
- 예시 : ρ S(Student)
- Student 테이블을 S로 이름을 변경
- 집합 연산 : 합집합 교집합 차집합
- 집합 연산은 두 릴레이션의 속성이 동일해야 함
- 두 릴레이션의 속성의 갯수가 같음
- 두 릴레이션의 i번째 속성은 같음
- 예시는 Student 테이블의 Name과 Major만 사용
- CS_Student ← π Name, Major(σ Major='CS' (Student))
- Math_Student ← π Name, Major(σ Major='Math' (Student))
- 합집합 연산(∪) : 두 릴레이션의 공통된 속성을 가진 튜플을 합함(중복 제거)
- 예시 : CS_Students ∪ Math_Students
- Major가 CS, Math인 튜플의 합
- 교집합 연산(∩) : 두 릴레이션에서 공통으로 존재하는 튜플 선택
- 예시 : Student ∩ CS_Students
- Student와 CS_Student에 공통으로 존재하는 튜플 선택
- 차집합 연산(−) : 첫 번째 릴레이션 중 두 번째 릴레이션에 없는 튜플 선택
- 예시 : Student - CS_Students
- Student 릴레이션에는 있지만 CS_Student에는 없는 튜플 선택
- 집합 연산은 두 릴레이션의 속성이 동일해야 함
합집합 | 교집합 | 차집합 | |||||
Name | Major | Name | Major | Name | Major | ||
Alice | CS | Alice | CS | Bob | Math | ||
Bob | Math | Carol | CS | Dave | Physics | ||
Carol | CS |
- 동등 질의 : 동일하지는 않지만 동일한 결과를 내는 두 질의
- Student ⨝ Course
- σ Student.Student_ID = Course.Student_ID (Student × Course)
- 위의 두 질의는 동일한 결과를 냄