데이터베이스(2) - 관계 데이터 모델
관계 데이터 모델은 수학의 집합 이론에 근거한 이론적인 토대가 있는 모델임.
관계 데이터 모델이 적용된 SQL 언어는 비절차적인 언어로 원하는 데이터를 쉽게 얻을 수 있음.
릴레이션: 행과 열로 구성된 테이블. 그냥 테이블이라고 부르기도 함.
한 테이블에 존재하는 속성들과 그 속성이 가질 수 있는 속성값들의 집합들이 존재한다고 하자.
이때 이 테이블에 존재하는 한 레코드는 이 속성 값 집합들에서 각각 원소 한 개씩 선택해서 만들어진 것임. 즉, 각 집합의 원소들이 관계를 맺어서 만들어진 것이 한 개의 레코드. 즉, 한 레코드 == 관계(relationship)라고도 볼 수 있음.
그리고, 이러한 관계(=레코드. 라는 의미로 관계라는 말이 쓰이기도 함)들이 모인 것이 한 테이블임.
하지만, 관계는 두가지 의미를 지닌다.
1. 릴레이션(테이블) 내에서 생성되는 관계. => 위에서 본 것.
2. 릴레이션 간에 생성되는 관계. => 한 릴레이션에서 다른 릴레이션의 식별 가능한 값을 활용해서 릴레이션 간 연결하는 것. 예를 들어, 도서 테이블과 고객 테이블이 있다고 하자. 이때, 주문 내역에 대한 테이블이 필요하다면, 주문 테이블은 속성으로 도서번호와 고객번호와 같이 각 도서,고객 테이블에서 식별 값으로 쓰일 수 있는 속성을 가져와서 주문 테이블과 다른 테이블들을 연결 시킬 것임.
릴레이션 스키마: 관계 데이터베이스의 릴레이션이 어떻게 구성되는지 어떤 정보를 담는지에 대한 기본적인 구조를 정의한 것 => 기본적인 구조를 정의 한 것이 스키마이므로 카디널리티(행의 개수)는 스키마의 요소가 아님
스키마의 요소 세가지) 속성, 도메인(한 속성이 가질 수 있는 속성 값의 집합), 차수(속성의 개수)
테이블은 한개의 파일로 봐도 무방함. 릴레이션 스키마는 이 테이블을 파일화 시켰을때, 헤더 부분 즉 맨 첫 행에 등장한다.
스키마(=내포)에는 속성, 자료타입 등의 데이터 특징을 나타내는 정보가 담겨 있음.
릴레이션 스키마 표현법 ) 릴레이션_이름(속성1, 속성2, ...) 혹은 릴레이션_이름(속성1:도메인1, 속성2:도메인2, ...)
ex: 도서(도서번호, 도서이름, 출판사, 가격) // 밑줄은 기본키임. 기본키 개념은 이따가 배움.
릴레이션 인스턴스: 릴레이션 스키마에 실제로 저장된 데이터의 집합.
인스턴스 요소: 튜플(행 한개), 카디날리티(행 개수)
한 행(= 튜플)이라고 부름. => 튜플은 각 행과 같은 의미로 릴레이션 인스턴스를 나타냄. 튜플은 중복될 수 없음.
카디널리티: 튜플의 수
각 튜플의 속성값은 릴레이션 스키마에서 정의한 도메인 값으로 구성됨.
릴레이션 구조와 관련된 용어 정리 표 한번 보기.
릴레이션의 특징 6가지
1. 속성은 도메인에 정의된 단일 값을 가져야 함.(속성의 원자성. 원자값을 갖는다고도 표현.)
2. 속성은 서로 다른 이름을 가짐. (한 릴레이션 내에서)
3. 한 속성의 값은 모두 같은 도메인 안에 있는 값을 가짐. (한 열은 모두 그 속성의 도메인 내 값을 가짐)
4. 속성의 순서는 상관없음. (속성 순서 달라도 릴레이션 스키마는 같은거임)
5. 릴레이션 내에서 중복 튜플은 허용 안함.
6. 튜플의 순서는 상관없음.(달라도 같은 릴레이션임)
관계 데이터 모델은 릴레이션에 대한 제약조건과 관계연산을 위한 관계대수를 정의함.
제약조건: 각 릴레이션에 저장된 데이터 값이 가져야 하는 제약. ex) 나이는 음수가 되면 안됨.
관계연산: 릴레이션을 다루는 연산 규칙. ex) 주문 릴레이션과 고객 릴레이션을 조작하여, 특정 고객의 주문 내역을 검색하는 행위
관계 데이터 모델을 컴퓨터 시스템에 구현한 것이 관계 데이터베이스 시스템임.
관계 데이터 베이스 시스템은 관계 데이터 모델에 기초해서 SQL 기반으로 구현 됨.
=> 컴퓨터 시스템 상에서, 릴레이션은 SQL로 생성 및 관리 됨. 제약조건은 SQL로 제약을 표현함. 관계대수는 SQL로 표현되고 연산됨
키: 특정 튜플을 식별할 때 사용하는 속성 혹은 속성의 집합(=복합키)
이런 키는 릴레이션 간의 관계를 맺는 데도 사용된다.
키의 종류에는 슈퍼키,후보키,기본키가 있고 추가적으로 대리키, 대체키, 외래키가 존재함.
슈퍼키: 유일성만 만족 시키면 됨. 즉, 키 중 유일성을 만족 시킬 수 있는 키들. 키 중 슈퍼키가 제일 넓은 범위임.
주의) 핸드폰번호 속성이 슈퍼키가 될 수 없는 이유는 휴대폰이 없는 사람이 있을 수 있으므로. 즉, NULL 값이 존재 가능한 속성은 슈퍼키에 낄 수 없음.
또한 , 슈퍼키는 유일성만 만족하면 되기 때문에 속성들이 여러개 섞인 속성 집합들 중 슈퍼키가 될 수 있는 경우가 많음.
후보키: 유일성과 최소성까지 만족하는 키. 최소성을 만족해야 한다고 해서 속성 집합이 안된다는 것이 아님.
EX) 주문 릴레이션에서 (고객번호, 도서번호)는 유일성과 최소성으로 단 한개의 주문내역을 판별 가능한 후보키임.
=> 이렇게 두 개 이상의 속성으로 이루어진 키를 복합키라고 한다.
기본키: 후보키 중 하나를 선정한 것(하지만 기본키 선정 권장 사항은 있음.)
릴레이션 스키마를 표현할 때, 기본키는 밑줄을 그어 표시함.
기본키 선정 시 고려사항
1. 릴레이션 내 튜플 식별이 가능해야 함. => 유일성
2. NULL 값이 가능한 속성은 안됨.
3. 키 값의 변동이 (빈번하게)일어나면 안됨.
4. 최대한 적은 수의 속성으로 구성된 키여야 한다. => 최소성
5. 향후 키를 사용하는데 문제 발생 소지가 없어야 함. EX) 보안 문제로 인해 주민번호는 기본키로 안씀.
대리키(인조키): 보안의 문제 등 마땅히 쓸 기본키가 없으면, 가상의 속성을 만들어서 기본키로 삼는 키.
=> 일반적으로 DBMS와 같은 SW에서 자체적으로 값을 생성함. EX) 주문 번호 같은거.
대체키: 후보키 - 기본키. 즉, 기본키로 선정되지 않은 후보키들을 말함.
외래키: 다른 릴레이션의 기본키를 참조하는 속성(간혹 자기 자신 릴레이션의 기본키를 가리키기도 함). 이 외래키로 인해서 관계 데이터 모델의 특징인 릴레이션 간 관계를 표현할 수 있는 거임. 일반적으로 두 개 이상의 기존 릴레이션들에 관계를 만들어서 새로운 릴레이션을 탄생시킬때, 이 새로 만들어진 릴레이션에는 외래키가 존재한다.
외래키와 참조되는 다른 릴레이션의 기본키는 도메인이 같아야 함. 참조되는 값이 변경되면 참조하는 외래키의 값도 변경되어야 함. 외래키는 NULL값이나 중복값이 존재 가능함(예: 주문 테이블에 고객의 id가 여러번 언급될 수 있음)
외래키가 참조하는 키가 같은 릴레이션 내의 기본키일 수 있음. => 이 경우는 한 튜플이 다른 튜플과의 관계가 표현되는거임. ex: 장미란은 김연아와 같은 선수테이블에 들어가지만, 장미란이 김연아의 멘토일 수 있음.
무결성 제약조건 - 도메인,기본키,외래키 제약
데이터 무결성 = 데이터베이스에 저장된 데이터의 일관성과 정확성을 지키는 것
이런 데이터 무결성을 유지하기 위한 제약 조건 세가지.
도메인 무결성 제약조건(=도메인 제약): 속성 값과 관련된 무결성임.각 속성의 도메인에 지정된 값만을 가져야 함.
한 속성 당 한개의 도메인 제약을 가짐.
개체 무결성 제약조건(=기본키 제약): 릴레이션의 기본키에 대한 무결성 즉, 튜플에 대한 제약임. 기본키는 NULL값을 가지면 안되고, 유일한 값을 가져야 한다는 조건. 한 릴레이션에서 기본키에 대해서만 기본키 제약이 들어감. 1개임.
참조 무결성 제약조건(=외래키 제약): 릴레이션 간의 참조 관계를 선언하는 제약조건임 즉, 속성과 튜플 둘 다 제약 대상임. 참조되는 릴레이션을 부모릴레이션이라고 함. 참조하는 릴레이션을 자식 릴레이션이라고 함. 자식 릴레이션의 외래키는 부모 릴레이션의 기본키와 도메인이 동일해야 하며, 자식 릴레이션의 값이 변경될때 부모 릴레이션의 제약을 받는 것
EX) 다른 도메인의 값으로 외래키에 값이 삽입, 수정 될 경우 거부됨. 반대로, 자식 릴레이션에서 참조하는 값을 부모 릴레이션에서 삭제 혹은 수정하려고하면 거부되는 것.
수행의 거부는 DBMS가 판단함.
개체 무결성 제약 조건
삽입: 이미 같은 기본키 값이 있으면 거부됨. => 기본키 충돌 여부 검사.
수정: 이미 있는 기본키 값이나 NULL로 수정이 금지됨.
삭제: 수행.
참조 무결성 제약조건
삽입:
=> 부모 릴레이션은 별 문제 없이 수행 됨(이때는 기본키 제약조건만 판단하면 됨. 그건 여기서 신경쓸게 아님)
=> 자식 릴레이션은 참조받는 테이블 즉, 부모 테이블에 [이번에 자식릴레이션에 삽입되려는 튜플의 외래키 값]이 기본키 값에 삽입하려는 외래키 값이 존재하는지 검사하고 삽입한다. 없으면 거부됨.
삭제:
=> 부모 릴레이션은 참조받는 입장임. 즉, 자식 릴레이션에게 정보를 제공하는 입장이므로 맘대로 데이터를 제거하면 안됨. 기본적으로는 거부됨. 그래서 이런 경우 4가지 조치 방법이 있음. 또한 이에 대응하는 명령어도 존재함.
1. 즉시 작업 중지, RESTRICTED
2. 자식 릴레이션의 관련 튜플을 모두 삭제(연쇄삭제), CASCADE
3. 자식 릴레이션의 튜플을 미리 설정해둔 값으로 변경, DEFAULT
4. 자식 릴레이션의 튜플의 외래키 값을 NULL값으로 설정, NULL
=> 자식 릴레이션은 어차피 참조하는 입장이므로 자식 릴레이션 내 튜플 삭제는 그냥 수행됨.
수정:
=> 삭제와 삽입 명령이 연속으로 수행됨. 이때, 부모 릴레이션에서 수정이 일어나는 경우는 지정된 삭제 옵션을 따름. 만약 RESTRICTED이면 삭제/삽입 둘 다 안일어나고 중단됨. 삭제 옵션에 따라 삭제하고, 삽입 제약조건에 따라 삽입된다.
관계대수 와 관계해석
관계 데이터 모델의 제안자가 소개한, 관계 데이터 모델을 사용하는데 필요한 언어 두가지가 바로 관계대수와 관계해석임.
=> 둘은 동일한 표현 능력을 갖고 있음. 단, 관계대수는 구체적으로 어떻게 찾는지 절차까지 표현 가능한 언어임. 관계해석이 이론적인 기반을 제공했다면, 관계대수는 실제로 DBMS를 사용하는데 쓰이는 언어임.
관계대수: 릴레이션에서 원하는 결과를 얻기 위해 수학의 대수(수를 대신해서 문자를 사용하는 방법)와 같은 연산을 이용해서 질의하는 방법을 기술하는 언어. 관계대수는 어떤 데이터를 어떻게 찾는지에 대한 처리 절차를 명시하는 절차적인(=비선언적인) 언어임. DBMS 내부의 처리 언어로 사용됨.
관계해석: 어떤 데이터를 찾는지만 명시가능한 선언적 언어임(=비절차적). 정말 무슨 데이터 찾는지만 표현 가능하고 그 연산 절차는 표현 못함. DBMS의 표준 언어인 SQL의 이론적인 기반을 제공. 관계대수로 표현된 식은 관계해석으로 표현이 가능함. 수학의 집합기호와 유사한 기호를 사용해서 정말 찾고자 하는 데이터만 표현하는거임.
참고: 릴레이션은 카티전 프로덕트의 부분집합임.
[카티전 프로덕트 A*B]의 부분집합의 개수는 2^( |A| * |B| )임.
관계대수 연산자
순수관계 연산자란? 관계 데이터 모델만을 위해 고안된 연산자
순수 관계 연산자: 셀렉션, 프로젝션, 조인, 디비전, 개명
일반 집합 연산자란? 기존에 이미 수학 집합 이론에 있던 연산자를 가져온 것.
일반 집합 연산: 합집합, 차집합, 교집합, 카티전 프로덕트
이외에도 피연산자(릴레이션)의 개수에 따라 단항/이항 연산자로 나눌 수 있음.
혹은 기본연산자(셀/프/합/차/카)와
기본연산자 다섯개로부터 유도가 가능한 유도 연산자로 구분됨.
관계대수식
관계대수식은 대상이되는 릴레이션과 관계대수 연산자로 표현된 수식을 말함.
셀렉션은 튜플을 추출하는 용도이며, 복합조건을 달 수 있음. EX) 가격<=8000 ^ 도서번호>=3
=> ^ 말고 and로 명시해도 됨. 복합조건을 사용하기 위한 기호 종류는 세가지. and/or/not==^/v/ㄱ
프로젝션은 속성을 추출하기 위한 용도. 그냥 파이기호 적고 속성 나열하면 됨.
집합연산자들은 수학의 집합이론에서 가져온 것이므로 집합연산 기호 그대로 사용함.
합집합은 두 개의 릴레이션을 세로로 이어서 중복 튜플을 제거함. 단, 테이블의 속성 순서가 일치해야 함.
교집합은 두 릴레이션을 대상으로 공통된 튜플만 담긴 릴레이션을 뽑아냄. => 교집합은 기본연산자가 아님.
차집합과 합집합으로 교집합을 유도 가능함.
차집합은 말 그대로 한쪽에만 속한 튜플들을 담은 릴레이션을 뽑아냄.
카티전프로덕트는 두 릴레이션을 연결시켜서 하나로 합칠 때 사용함.
=> 기본적인 결과물의 형태는 다음과 같음. 첫번째 테이블의 한개의 튜플의 오른쪽에 두번째 테이블의 모든 튜플을 붙임
=> 결과 릴레이션의 차수(속성개수)는 두 릴레이션의 차수 합. 카디널리티(튜플의 개수)는 두 릴레이션의 카디널리티의 곱
=> 즉, 카티전 프로덕트로 나온 릴레이션은 속성명이 같고 도메인이 같은 속성들이 있어도 한쪽을 지우지 않음.
왜냐하면, 서로 다른 릴레이션에서 나온 속성들이므로 비록 속성명이 같고 도메인이 같더라도 의미하는게 다를 것이기 때문임.
조인은 두 릴레이션의 공통 속성을 기준으로 속성 값이 같은 튜플을 수평으로 결합하는 방법임. 여기서 공통속성이라는 말은 서로 동일한 도메인으로 구성되어야 한다. 일반적으로 조인연산은 동등조인을 가리킨다.
일단, 조인은 기본적으로 카티전 프로덕트와 셀렉션으로 유도할 수 있는 유도 연산자임. 합쳐서 조건에 맞는 튜플만 추출.
그런데, 그 조인 연산안에서 크게 기본연산과 확장된조인연산으로 나눠서 부르는데, 기본연산은 세타,동등,자연 조인임.
확장된 조인 연산은 세미(왼,오),외부(왼,오,양) 조인임.
일반적으로 조인(동등조인)의 형태는 다음과 같다고 말할 수 있다.
기본 조인 연산
세타조인은 조인의 c조인조건이 명시되는 부분에 조건의 연산자로 {=,≠,≤,≥,<,>} 중 하나가 있는 경우를 말함. 이때, c조건의 피연산자들로 두 릴레이션의 각각의 속성들이 한개씩 있어야 함.
동등조인은 세타조인 중에서도 연산자로 =을 사용한 조인을 말함. 조인조건 c로 (고객.uid=주문.uid) 이렇게 표기하면 됨. 그냥 조인이라고 하면 동등조인을 말함. 그래서 조인의 결과 릴레이션의 차수가 양쪽 차수 더하기라고 하는거임. 동등조인은 동일 속성을 지우지 않고 내비둠.
자연조인은 동등조인에서 중복돼서 이미 나온 속성은 지움. 자연조인의 조인조건c는 다음과 같이 명시함. N(고객.uid=주문.uid)
확장된 조인 연산
외부조인은 자연조인의 확장임. 외부조인은 왼쪽,오른쪽,완전 외부조인 세가지로 나뉨.
일단, 자연조인을 수행하고 자연조인 매칭에 실패한 튜플을 모두 보여주고, 값이 없는 속성에는 NULL을 채운다.
여기서 왼쪽 외부조인이라면, 일단 자연조인을 수행하고 매칭되지 않는 왼쪽 릴레이션의 튜플들은 그대로 결과 릴레이션의 튜플로 추가하고, 비어있는 속성값으로 NULL을 채운면 됨.
이때, 완전 외부조인 같은 경우는 상관없지만, 왼쪽 혹은 오른쪽 외부조인은 결과 릴레이션을 만들때, 기준이 되는 방향의 릴레이션의 비교속성을 포함시킨다.
기호에서 입구가 기다란 쪽 기준임.
=> 왼쪽 외부조인이면, 왼쪽 릴레이션의 한 튜플을 기준으로 잡고 오른쪽 릴레이션 중에 조건을 만족하는 튜플들을 모두 오른쪽에 이어서 보여줌. 그리고 왼쪽 릴레이션의 다음 튜플로 이동하고 짝이 없으면 해당 튜플에 NULL을 채워서 적음.
=> 오른쪽 왼부조인이면, 오른쪽 릴레이션의 한 튜플을 기준으로 잡고 왼쪽 릴레이션 중에 조건을 만족하는 튜플을 모두 왼쪽에 이어서 보여줌. 만약 짝이 없으면 해당 튜플에 NULL을 채워서 적음.
=> 오른쪽 외부조인이면, 일단 왼쪽 외부조인처럼 행동하고 마지막에 오른쪽 릴레이션에서 아직 언급된 적 없는 튜플들에 NULL값을 채워서 모두 아래에 이어 붙힘.
세미조인은 자연조인(카티전 프로덕트하고 셀렉션으로 남기고 중복 속성 제거)을 해서 나온 결과 릴레이션에서, 입구가 열린쪽의 릴레이션 속성들을 방출 즉, 제거 시키는 조인임. 왼쪽 세미조인과 오른쪽 세미조인이 있음.
세미조인의 연산자 기호는 비교연산자를 쓰지 않고 그냥 기호(테이블1.속성,테이블2.속성) 으로 표현함.
디비전
디비전은 연산 방법이 좀 독특함. 릴레이션R ÷ 속성값집합S. 조인 연산의 조합으로 디비전 연산을 유도 가능함.
=> 위 식에서 부모릴레이션은 분모 쪽에 위치한 속성값집합S가 된다.
풀어 설명하면 부모 릴레이션에 포함된 튜플의 값을 모두 갖는 튜플을 자식릴레이션에서 추출하는것임.
즉, 디비전 연산은 특정 값들을 모두 갖고 있는 튜플을 찾을 때 사용함.단, 이 S에 속한 속성은 결과 릴레이션에서 제거하고 중복도 제거해야 함.
실전 문제 풀이 팁
팁: 조인은 카티전 프로덕트와 셀렉션으로 유도 가능한 연산이라고 했음. 하지만, 조인을 쓰는게 카티전프로덕트와 셀렉션을 절차적으로 수행해서 결과를 내는 것보다 좋음.
이유) 카티전 프로덕트를 수행하면 메모리 터질 수 있음. 두 릴레이션을 곱한다는게 말도 안되는 연산 수임.
참고 도서: MySQL로 배우는 데이터베이스 개론과 실습