티스토리 뷰

데이터베이스

[Database] 2. 관계데이터모델

망나니개발자 2017. 11. 14. 20:21
반응형

[ 본 사진은 쉽게 배우는 오라클로 배우는 데이터베이스 개론과 실습 ppt에서 캡처했습니다. ]


1. 관계 데이터 모델의 개념


[ 릴레이션 ]

  • 릴레이션: 행과 열로 구성된 테이블

  • 속성(Attribute): 세로 값으로 열(Column)이라고도 한다.

  • 튜플(Tuple): 가로 값으로 행(Row)이라고도 한다.

  • 차수: 속성의 수

  • 카디날리티: 튜플의 수

  • 인스턴스: 정의된 스키마에 따라 테이블에 실제 저장된 데이터의 집합

  • 스키마: 릴레이션이 어떻게 구성되는지, 어떤 정보를 담고 있는지에 대한 기본적인 구조를 정의(첫 행 헤더)



위의 그림과 같이 릴레이션이란 데이터를 행과 열로 구성된 테이블로 표현한 것입니다. 세로의 값을 속성, 가로의 값을 튜플이라고 하고 여기서 도서번호, 도서이름, 출판사, 가격때문에 차수가 4가 되며, 5개의 가로줄을 가지므로 카디날리티가 5가 됩니다.


[ 스키마의 구성요소 ]

  • 속성(Attribute): 릴레이션 스키마의 열

  • 도메인(Domain): 속성이 가질 수 있는 값의 집합

  • 차수(Degree): 속성의 개수

위의 그림에서 속성은 도서번호, 도서이름, 출판사, 가격 그리고 차수는 4가 되는데 그렇다면 도메인은 무엇일까요? 도메인은 쉽게 말해 문법적인 개념과 같습니다. 예를 들면 Integer, Varchar(10)과 같이 값이 가질수 있는 범위 및 집합을 의미합니다.

이러한 스키마는 릴레이션 이름(속성1: 도메인, 속성2: 도메인2, ....) 이런식으로 표현하는데 일반적으로는 도메인을 제외하고 릴레이션 이름과 속성만을 적어서 도서(도서번호, 도서이름, 출판사, 가격)과 같이 표현합니다.


[ 인스턴스의 구성요소 ]

  • 튜플(Tuple): 릴레이션의 행

  • 카디날리티(Cardinality): 튜플의 수

여기서 투플이 가지는 속성의 개수는 릴레이션 스키마의차수와 동일하고, 릴레이션 내의 모든 튜플은 서로 중복되지 않아야 합니다. 예를 들어 설명하자면 튜플이 이름: '홍길동', 성별: '남자', 연락처: '010-1234-5678'과 같이 3개의 속성을 가지면 릴레이션 스키마 역시도 3개의 차수를 가져야 하며, 한 릴레이션 내에서 '홍길동', 성별: '남자', 연락처: '010-1234-5678'이 같은 내용으로 두번 나오면 안된다는 것입니다.


[ 릴레이션의 특징 ]

  • 속성은 단일 값을 가진다

  • 속성은 서로 다른 이름을 가진다

  • 한 속성의 값은 모두 같은 도메인 값을 가진다

  • 속성의 순서는 상관이 없다

  • 릴레이션 내의 중복된 튜플은 허용하지 않는다

  • 튜플의 순서는 상관없다

기본적으로 속성은 단일값을 가져야 합니다. 예를 들어 아래와 같은 릴레이션에서 하나의 책은 하나의 가격을 가져야지 7000, 8000과 같이 2개의 값을 동시에 가질 수 없음을 의미하고, 이것을 쪼개지지 않는 하나의 값만 가진다고 하여 원자값을 가진다고도 얘기합니다. 또한 한 릴레이션 내에서 이름, 이름, 이름 과 같이 동일한 속성이름은 올 수 없으며, 가격이 정수의 값을 가진다면 가격에는 '칠천원'과 같은 VARCHAR형태의 값이 올 수는 없습니다. 속성의 순서나 튜플의 순서는 무관하고, 아래의 그림에서 보이듯이 모든 속성의 값이 동일한 튜플은 한 릴레이션내에 존재할 수 없습니다.




[ 관계 데이터 모델 ]

  • 릴레이션

  • 제약조건

  • 관계대수

관계 데이터 모델은 데이터를 2차원 테이블 형태인 릴레이션으로 표현한 것으로 릴레이션에 대한 제약조건(Constraints)와 관계 연산을 위한 관계대수(Algerbra)를 정의하였습니다. 그리고 이러한 관계 데이터 모델을 컴퓨터에 구현하면 관계 데이터베이스 시스템이 됩니다.





2. 무결성 제약조건


[ 키(KEY) ]

  • 특정 튜플을 식별할 때 사용하는 속성 혹은 속성의 집합

  • 키가 되는 속성(혹은 속성의 집합)은 값이 반드시 달라서 튜플들을 구별할 수 있어야 함

  • 키는 릴레이션간의 관계를 맺는 데도 사용됨

한 릴레이션에서 중복되는 튜플들은 존재할 수 없습니다. 그러므로 각각의 튜플에 포함된 속성들 중 어느 하나(혹은 하나 이상)은 값이 달라져야 하고 각각의 튜플을 식별하는 역할을 키(Key)가 담당합니다. 일반적으로 키는 단일 속성으로 지정하지만 아래의 그림처럼 그렇지 못하는 경우에는 두개 이상의 속성을 묶어 키로 사용합니다. 아래의 릴레이션에서는 (고객번호, 도서번호) 나 (고객번호, 주문일자)와 같은 집합을 키로 사용할 수 있습니다.


[ 슈퍼키 ]

  • 퓨플을 유일하게 식별할 수 있는 하나의 속성 혹은 속성의 집합

튜플을 식별할 수 있으면 모두 슈퍼키가 될 수 있습니다. 아래와 같은 고객 릴레이션의 경우에는 이름이나 주소(가족 관계)는 동일한 값이 올 수 있고, 핸드폰의 경우에는 핸드폰이 없는 사람도 있을 수가 있으므로 고객번호 또는 주민번호가 슈퍼키가 될 수 있습니다. 그러므로 고객 릴레이션은 고객번호 또는 주민번호를 포함한 모든 속성의 집합이 슈퍼키가 될 수 있습니다.

(주민번호), (주민번호, 이름), (고객번호, 이름, 주민번호, 주소, 핸드폰) 등 여러 개가 슈퍼키가 될 수 있습니다.



[ 후보키 ]

  • 튜플을 유일하게 식별할 수 있는 속성의 최소 집합

아래와 같이 주문 릴레이션에서 단일 속성으로는 튜플을 유일하게 식별하는 것이 불가능하므로 2개의 속성을 합한(고객번호, 도서번호)가 후보키가 되며 이렇게 2개 이상의 속성으로 이루어진 키를 복합키(Composite Key)라고 합니다.




[ 기본키 ]

  • 여러 후보키 중 하나를 선정하여 대표로 삼는 키

후보키가 하나뿐이라면 그 후보키를 기본키(Primary Key)로 사용하면 되고, 후보키가 여러개라면 릴레이션의 특성을 반영하여 하나를 선택하면 됩니다. 아래의 도서 릴레이션에서는 도서번호 또는 도서이름이 후보키가 되고, 두 속성 중 하나의 속성을 기본키로 선정하면 됩니다.(도서의 이름이 중복되지 않는다고 가정) 릴레이션 스키마를 표현할 때 기본키는 밑줄을 그어 표시합니다. 도서 릴레이션의 경우에는 도서(도서번호, 도서이름, 출판사, 가격)처럼 표시하면 됩니다.




[ 기본키 선정 시 고려사항 ]

  • 릴레이션 내 튜플을 식별할 수 있는 고유한 값을 가져야함

  • NULL값은 허용하지 않음

  • 키 값의 변동이 일어나지 않아야 함

  • 최대한 적은 수의 속성을 가진것이여야 함

  • 향후 키를 사용하는 데 있어서 문제 발생 소지가 없어야 함

기본키가 NULL값이 되면 다른 튜플과 식별할 수 없으므로 안됩니다. 또한 키 값의 변동이 일어나지 않아야 하는 이유는 기본키가 변경되면 릴레이션내에서 기본키를 제외하고 나머지 속성이 같았던 튜플이 기본키를 바꿈으로 중복될 수 있기 때문입니다.


[ 대체키 ]

  • 기본키로 선정되지 않은 후보키

대체키(Alternate Key)는 기본키로 선정되지 않은 후보키로 고객 실레이션에서 고객번호와 주민번호 중 고객번호를 기본키로 정하면 주민번호가 대체키가 됩니다.


[ 외래키 ]

  • 다른 릴레이션의 기본키를 참조하는 속성

위에서 키는 관계를 맺는데 활용될 수 있다고 하였는데, 외래키(Foreign Key)가 바로 그런 경우입니다. 주문 릴레이션에서 우리는 고객 릴레이션의 기본키인 고개번호와 도서릴레이션의 기본키인 도서번호를 참조하여 쓰는데 주문릴레이션에서는 고객번호와 도서번호가 외래키가 되고, 주문번호가 기본키(Primary Key)가 됩니다.


외래키를 사용할 때 참조하는 릴레이션과 참조되는 릴레이션이 다를 필요는 없습니다. 즉, 한 릴레이션에서 자기자신의 기본키를 외래키로도 가질수가 있습니다. 아래의 그림에서는 선수번호라는 기본키를 자기 자신의 릴레이션에서 멘토번호로 참조하고 있습니다. 멘토릴레이션에는 이미 선수번호라는 기본키가 존재하기 때문에 외래키는 NULL값이 되어도 상관이 없습니다.


[ 요약 ]



[ 무결성 제약조건 ]

  • 데이터 무결성(Integrity)은 데이터베이스에 저장된 데이터의 일관성과 정확성을 지키는 것을 말함

  • 도메인 무결성 제약조건

  • 개체 무결성 제약조건

  • 참조 무결성 제약조건

도메인 무결성 제약조건은 도메인 제약(Domain Constraint)이라고도 하며, 릴레이션 내의 튜플들이 각 속성의 도메인에 지정된 값만을 가져야 한다는 조건입니다. SQL문에서 데이터 형식(Type), 널(Null/Not Null), 기본 값(Default), 체크(Check) 등을 사용하며 지정할 수 있습니다. 예를 들어 VARCHAR형으로 선언된 Name이라는 변수에는 정수형 Integer 값이 올 수 없는 경우를 의미합니다. 개체 무결성 제약조건은 기본키 제약(Primary Key Constraint)라고도 합니다. 릴레이션은 기본키를 지정하고 그에 따른 무결성 원칙 즉, 기본키는 NULL값을 가져서는 안되며 릴레이션 내에 오직 하나의 값만 존재해야 한다는 조건입니다. 기본키는 릴레이션내에서 튜플들을 구별할 수 있게 해주는 속성이므로 자연스럽게 개체 무결성 제약조건이 등장하게 되었습니다. 참조 무결성 제약조건은 외래키 제약(Foreign Key Constraint)라고도 하며, 릴레이션 간의 참조 관계를 선언하는 제약조건입니다. 자식 릴레이션의 외래키는 부모 릴레이션의 기본키와 도메인이 동일해야 하며, 자식 릴레이션의 값이 변경될 때 부모 릴레이션의 제약을 받는다는 것입니다. 자세한 내용은 아래에서 설명하도록 하겠습니다.



[ 개체 무결성 제약조건 ]

  • 삽입: 기본키 값이 같으면 삽입이 금지됨

  • 수정: 기본키 값이 같거나 NULL로도 수정이 금지됨

  • 삭제: 특별한 확인이 필요하지 않으며 즉시 수행함

아래의 그림과 같이 학번을 기본키로 갖는 릴레이션에서 이미 학번 501을 가진 학생이 존재할 때 중복된 학번 501을 가진 학생을 삽입하려고 하거나 501로 다른 학생의 학번을 수정하려고 하거나, 학번이 NULL값인 튜플을 삽입하려고 하는 경우에 삽입이 거부됩니다. 그에 반해 삭제 연산은 기본키의 중복 또는 NULL의 염려가 없으므로 즉시 수행됩니다. 




[ 참조 무결성 제약조건 ]

  • 부모릴레이션에 삽입: 정상적으로 진행됨

  • 자식릴레이션에 삽입: 참조받는 테이블에 외래키 값이 없으므로 삽입 금지

  • 부모릴레이션의 삭제: 참조하는 테이블을 같이 삭제할 수 있어서 금지하거나 추가작업이 필요

  • 자식릴레이션의 삭제: 바로 삭제 가능함

  • 수정: 삭제와 삽입의 연속 수행으로 각 삭제와 삽입의 제약을 고려하여 진행됨

예를 들어 아래의 릴레이션에서 부모에 3001의 학과코드를 가진 학과를 추가하는 것은 문제가 없지만 자식 릴레이션에 부모 릴레이션에 존재하지 않는 3001의 학과코드를 삽입하려고 하는 경우에는 문제가 발생합니다. 부모릴레이션에서 삭제를 하는 경우에는 해당 키를 다른 릴레이션에서 사용하고 있을 수 있으므로 삭제에 제한이 걸리지만 자식릴레이션은 바로 삭제를 할 수 있습니다. 수정 연산은 부모 릴레이션의 수정이 일어날 경우 삭제 옵션에 따라 처리된 후 문제가 없으면 다시 삽입 제약조건에 따라 처리됩니다.




3. 관계 대수(Relation Algebra)


[ 관계대수 ]

  • 관계대수: 릴레이션에서 원하는 결과를 얻기 위해 연산을 이용하여 질의하는 방법을 기술하는 언어

  • 관계대수는 어떤 데이터를 어떻게 찾는지에 대한 처리 절차를 명시하는 절자적인 언어로, DBMS 내부의 처리 언어로 사용됨

  • 관계해석: 어떤 데이터를 찾는지만 명시하는 선언적인 언어로 관계대수와 함께 관계 DBMS의 표준 언어인 SQL의 이론적 기반 제공

  • 관계대수와 관계해석은 모두 관계 데이터 모델의 중요한 언어이며 동일한 표현능력을 가지고 있음


A= {2, 4}, B={1, 3, 5} 일 때 AxB = { (2,1), (2,3), (2,5), (4,1), (4,3), (4,5)} 이며 릴레이션 R은 타티전 프로덕트(Cartesian Product)의 부분집합으로 정의됩니다. 예를 들면 R1 = { (2,1), (4,3) } , R2 = { (2,1), (2,3), (4,5) } 원소 개수가 n인 집합 S의 부분집합의 개수는 $2^n$이므로, 카티전 프로덕트 AxB의 부분집합의 개수는 $2^{|A|*|B|}$ 입니다. 카티전 프로덕트의 기초 집합 A, B 각각이 가질 수 있는 값의 범위를 도메인(Domain)이라고 하며 A의 도메인은 {2, 4}가 됩니다. 릴레이션도 역시 집합이므로 합집합, 교집합, 카티전 프로덕트 등의 연산을 수행할 수 있습니다.




[ 관계대수 연산 ]

  • 단항 연산자: 연산자<조건> 릴레이션

  • 이항 연산자: 릴레이션1 연산자<조건> 릴레이션2





[ 조인(Join) ]

  • 두 릴레이션의 공통 속성을 기준으로 속성 값이 같은 튜플(Tuple)을 수평으로 결합하는 연산

  • 조인을 수행하기 위해서는 두 릴레이션의 조인에 참여하는 속성이 서로 동일한 도메인으로 구성되어야 함

  • 조인 연산의 결과는 공통 속성의 속성 값이 동일한 튜플만을 반환함

  • 세타조인, 동등조인, 자연조인, 세미조인, 외부조인 등이 존재

세타조인(theta join)은 조인에 참여하는 두 릴레이션의 속성 값을 비교하여 조건을 만족하는 투플만 반환합니다. 동등 조인(equi join)은 세타조인서 =연산자를 사용한 조인을 지칭합니다. 자연 조인(Natural join)은 동등 조인에서 조인에 참여한 속성이 두 번 나오지 않도록 두 번째 속성을 제거한 결과를 반환합니다. 외부 조인(Outer Join)은 자연조인 시 조인에 실패한 튜플을 모두 보여주되 값이 없는 대응 속성에는 NULL 값을 채워서 반환합니다. 모든 속성을 보여주는 기준 릴레이션의 위치에 따라 왼쪽 외부조인, 오른쪽 외부조인, 완전 외부조인으로 나뉩니다. 세미 조인(Semi join)은 자연 조인을 한 후 두 릴레이션 중 한쪽 릴레이션의 결과만 반환하며 기호에서 닫힌 쪽 릴레이션의 튜플만 반환합니다. 




[ 디비전(Division) ]

  • 릴레이션의 속성 값의 집합으로 연산을 수행함

  • 형식: R $\div$ S











관련 포스팅

  1. 데이트베이스 시스템 (1/8)

  2. 관계데이터 모델 (2/8)

  3. SQL 기초 (3/8)

  4. SQL 고급 (4/8)

  5. 데이터베이스 프로그래밍 (5/8)

  6. 데이터 모델링(Data Modeling) (6/8)

  7. 정규화(Normalization) (7/8)

  8. 트랜잭션, 동시성 제어, 회복 (8/8)


반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/04   »
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
글 보관함