2022. 10. 15. 02:35ㆍ강의 내용 정리/데이터베이스
관계 데이터 모델과 제약조건
1. 관계 데이터 모형의 개념
1) 관계 데이터 모델이란?
가장 개념이 단순한 데이터 모델 중 하나로 테이블 형태로 DB를 표현하는 모델이다.
System R은 판매용이 아닌 시제품으로 등장했고, 이후 여러 데이터 모델들이 등장했지만 현재까지 가장 많이 사용되는 DBMS이다.
동일한 구조(릴레이션)의 관점에서 모든 데이터를 논리적으로 구성하고 있다. 릴레이션을 사용해 논리적으로 구조를 정의한다. 기존 데이터 모델의 단점은 링크나 포인터를 사용한다는 점이었다. 관계 데이터 모델은 대신 외래키를 사용해 서로 다른 릴레이션의 객체를 표현한다.
선언적인 질의어를 통해 데이터 접근을 제공한다. 사용자가 원하는 데이터만 명시하고, 어떻게 이 데이터를 찾을 것인가는 명시할 필요가 없다. 이에 따라 가장 빠르게 답만 찾을 수 있게 된다. 응용 프로그램은 데이터 베이스 내의 레코드들이 어떤 순서를 가지든지 상관없다.
2) 관계 데이터 모델이 큰 성공을 거둔 요인
- 바탕이 되는 데이터 구조로서 간단한 테이블을 사용한다. 표 형태의 데이터는 평상 시에도 많이 사용해왔기에 간단하다.
- 중첩된 복잡한 구조가 없다.
- 집합 위주로 데이터를 처리한다.
- 관계 데이터베이스 설계와 효율적인 질의 처리 면에서 뛰어난 장점을 가진다.
- 표준 데이터베이스 응용에 대해 좋은 성능을 보인다. 산업계에서 널리 사용되는 인사/회계/재무 등에서 사용되기도 한다.
3) 관계 데이터 모델의 기본 용어
- 릴레이션: 2차원 테이블로 스프레드 시트와 유사하다.
- 레코드: 릴레이션의 각 행을 지칭하는 용어
- 튜플: 레코드를 공식적으로 지칭하는 용어
- 애트리뷰트: 릴레이션의 각 열을 지칭하는 용어
- 카디날리티: 행들의 개수를 지칭하는 용어
- 차수: 열들의 개수를 지칭하는 용어
차수와 카디날리티
유효한 릴레이션의 최소 차수는 1이상이어야하고, 유효한 릴레이션은 카디날리티 0을 가질 수 있다. 처음 릴레이션을 처음 만들고 나면 튜플의 개수는 0이지만 이 또한 유효한 릴레이션으로 여겨진다. 차수는 릴레이션의 스키마와 관련이 있기에 시간이 흘러도 잘 바뀌지 않는다. 반면 카디날리티의 값은 쉽게 변한다.
기본키
각각의 레코드를 구분하기 위해 존재하는 키를 지칭하는 용어이다. 이는 밑줄을 그어서 표현하고, 어트리뷰트 하나만 가지고 이를 표현할 수 있고, 여러 개의 어트리뷰트를 포함해서 이를 구현할 수도 있다.
도메인
한 어트리뷰트에 나타날 수 있는 값들의 집합으로 이 값은 원자값이어야한다. 예를 들어 이름이라는 어트리뷰트의 도메인은 이름으로 만들 수 있는 모든 값을 의미한다. 이는 프로그래밍에서의 데이터 타입과 유사하다.
동일한 도메인이 여러 애트리뷰트에서 사용될 수 있다.
ex) 나이를 도메인으로 설정 후 사원의 나이, 부양 가족의 나이 등등
복합 애트리뷰트와 같이 서브 애트리뷰트에는 사용할 수 없다. 또한 다치(multivalued) 애트리뷰트는 허용하지 않아서 중복된 값을 가지는 것은 허용되지 않는다.
cf) 화일 시스템과 데이터베이스 용어
대부분 릴레이션은 하나의 화일과 대응된다. 하지만 여러개의 릴레이션이 하나의 화일에 들어갈 때가 있다. 자주 사용하는 용어 뿐만 아니라 화일 시스템의 용어가 혼용해서 사용하는 경우가 많다.
널 값
알려지지 않거나 적용할 수 없는 값을 나타낼 때 사용한다. 따라서 값은 존재하지만 데이터를 입력하는 시점에서는 아직 알려지지않은 값은 널값으로 존재한다. 특정 도메인의 값과는 다르기에 숫자 0, 공백문자나 공백문자열 등과는 다른 의미를 가진다.
ex) 사원 릴레이션에 새로운 사원에 관한 튜플을 입력하는데, 신입 사원의 DNO(부서번호)가 결정되지 않을 수 있다.
cf) NA는 Not Available, Not Applicable을 의미한다.
릴레이션 스키마
릴레이션의 이름과 릴레이션의 애트리뷰트들의 집합을 의미한다. 릴레이션을 위한 틀을 의미하며 순서가 없고, 중복을 허용하지 않는다는 특징이 있다. 기본키는 밑줄을 표시한다. 릴레이션 스키마는 내포라고 한다.
릴레이션 인스턴스
릴레이션에 어느 시점에 들어있는 튜플들의 집합이다. 시간의 흐름에 따라 계속 변하고, 일반적으로 릴레이션에는 현재의 인스턴스만 저장된다. 릴레이션 인스턴스는 외연이라고 한다.
cf) Temporal Database와 Spatio-Temporal Database
Temproal Database는 과거의 데이터를 모두 가지고 있다. 이는 이력을 관리하기 위한 데이터베이스이다.
Spatio-Temporal Database는 시공간적인 데이터를 모두 가지고 있다. 지도 연산을 가능케하는 것이 공간 데이터인데, Spatio-Temporal Database는 시간과 상관없이 이를 다루기 위한 데이터베이스이다.
하나 이상의 릴레이션의 스키마를 모은 것이 관계 데이터베이스의 스키마이고, 여러 릴레이션의 인스턴스를 모은 것이 관계 데이터베이스의 인스턴스이다.
2. 릴레이션의 특성
1) 릴레이션의 특성
- 각 릴레이션은 오직 하나의 레코드 타입만 포함한다.
- 한 애트리뷰트 내의 값들은 모두 같은 유형이다.
- 애트리뷰트들의 순서는 중요하지 않다.
- 동일한 튜플은 두 개 이상 존재하지 않는다. 이에 따라 두 개의 튜플을 고유하게 구분할 수 있는 '키'가 존재하게 된다.
- 한 튜플의 각 애트리뷰트는 더 이상 쪼갤 수 없는 원자값을 가진다. 따라서 집합의 값들은 사용할 수 없다. 만약 여러 값을 가지고 있어야 하는 경우에는 해당 값들에 대한 테이블을 하나 더 만들어서 키값을 통해 릴레이션의 관계를 표현하면 된다.
- 애트리뷰트의 이름은 한 릴레이션 내에서만 고유하다.
- 튜플의 순서는 중요하지 않다.
만약 튜플을 여러개로 쪼개서 사용하는 경우에는 레코드를 저장할 때 중복된 데이터가 많이 발생한다. 이에 따라 메모리 공간에 대한 비용도 더 많이 발생하고, 한 데이터를 수정할 때도 문제가 발생할 수도 있기에 유지보수의 문제가 발생한다.
3. 릴레이션의 키
1) 릴레이션의 키란?
(1) 개념
각 튜플을 고유하게 식별할 수 있는 하나 이상의 애트리뷰트들의 모임
키는 현재 인스턴스를 기준으로 잡는 것이 아니라 앞으로 생길 수 있는 인스턴스들을 고려해 설정해야한다.
(2) 키의 종류
슈퍼 키
후보 키
기본 키
대체 키
외래 키
2) 슈퍼키
한 릴레이션 내의 특정 튜플을 고유하게 식별하는 하나의 애트리뷰트 또는 애트리뷰트들의 집합
예를 들어 신용 카드 회사의 고객 릴레이션에서는 고객을 구분하기 위해 (신용카드번호, 주소) 또는 (주민등록번호, 이름)(주민등록번호), (신용카드번호) 등을 사용해 이를 구분할 수 있다. 이것의 원소는 각각 키가 될 수 있다. 즉, 여러 개의 어트리뷰트가 키가 될 수 있다.
위에서 본 예시대로 슈퍼키의 특징 중 하나는 튜플을 식별하기 위해 꼭 필요하지 않은 어트리뷰트도 포함될 수 있다. 하지만 불필요한 어트리뷰트를 포함해 튜플을 식별할 필요가 없이게 minimality의 특징을 포함한 후보키가 등장한다.
3) 후보키
각 튜플을 고유하게 식별한느 최소한의 애트리뷰트들의 모임을 의미한다. 릴레이션의 특징 상 튜플은 구분할 수 있다. 따라서 모든 릴레이션에서는 최소한 한 개 이상의 후보키가 있다. 후보키도 두 개 이상의 어트리뷰트로 이뤄질 수 있으며 이런 경우에 복합 키(composite key)라고 부른다. 또한 후보키도 두 개 이상이 될 수 있다.
4) 기본키
후보 키들 중 하나를 선택해 각 튜플을 고유하게 식별할 수 있는 키로 사용하는 키를 의미한다. 후보 키가 두 개 이상 있으면 설계자나 데이터베이스 관리자가 이들 중에서 하나를 기본키로 선정한다. 기본키는 자연스럽게 튜플을 구분할 수 있는 어트리뷰트를 설정해 사용한다. 자연스럽지 않은 어트리뷰트만 존재한다면 인위적으로 일련번호와 같은 키를 만들어서 사용할 수 있다.
여러 어트리뷰트를 합쳐서 기본키를 만드는 경우에는 그 어트리뷰트의 쌍이 유일해야한다는 의미를 갖게 된다.
ex)
name birthdate dept
김철수 01999 컴공
김철수 01998 소융
홍길도 01999 전자
위의 경우에는 name이나 birthdate를 각각 하나만 기본키로 구성하는 경우에는 중복된 값이 존재할 수 있기에 name과 birthdate를 함께 기본키로 설정해야지 위의 문제에서는 유일성을 보장할 수 있다.
5) 대체키
기본키가 아닌 후보키를 의미한다.
6) 외래키
어떤 릴레이션의 기본키를 참조하는 어트리뷰트이다. 이는 관계 데이터베이스에서 릴레이션들 간의 관계를 나타내기 위해서 사용된다. 외래키는 참조되는 릴레이션의 기본 키와 동일한 도메인을 가져야한다. 이는 참조되는 릴레이션의 기본키의 이름과는 달라도 된다.
자체 릴레이션의 기본 키를 참조하는 외래키도 있을 수 있다. 즉, 동일한 릴레이션 내에서 존재하는 기본키값을 사용하는 경우도 있다.
또한 외래 키들을 합쳐서 기본 키가 될 수도 있다. 더 복잡한 구조로는 외래키와 외래키가 아닌 것들을 모아서 기본키를 만들 수 있다.
여러 개의 어트리뷰트가 합쳐져서 하나의 기본키를 만들 수 있기에 외래키 또한 두개 이상의 어트리뷰트 쌍을 참조할 수 있다. 이러한 경우에는 어트리뷰트 리스트를 적어야한다
참조하는 릴레이션은 REFERENCES 키워드를 통해 적어줄 수 있다.
4. 무결성 제약 조건
1) 데이터 무결성이란?
데이터가 지켜야할 조건으로 데이터의 정확성이나 유효성을 의미한다. 이는 릴레이션을 생성할 때 규칙을 적어주는 식의 명시적으로 적을 수도 있고, 묵시적으로 이를 나타낼 수도 있다. DBMS는 수정연산이 발생할 때마다 그 규칙들이 지켜졌는지 자동으로 검사한다. 문제가 발생하면 오류를 내보낸다.
읽기 연산을 진행할 때는 무결성 제약조건이 깨질 가능성이 없다. 하지만 데이터를 업데이트할 때는 무결성 제약조건이 깨질 가능성이 높다. 즉, 튜플이 삭제되거나 튜플이 생성되거나, 튜플이 갱신되는 경우에 대해서 무결성 제약조건이 깨질 수 있다.
2) 무결성 제약조건의 종류
(1) 도메인 제약조건
- 각 어트리뷰트의 값이 반드시 원자값이어야한다. (묵시적)
- 어트리뷰트 값의 디폴트값이나 가능한 값의 범위를 지정할 수 있다.
- 데이터 형식을 통해 값의 유형을 제한하고, check 제약 조건을 통해 값들의 범위를 제한할 수 이다.
- sql2는 도메인을 명시적으로 정의하는 것을 허용하지만 오라클은 지원하지 않는다.
예시 코드
not null을 넣지 않으면 디폴트 값이 null이고 null은 널값을 허용하는 것을 의미한다.
(2) 키 제약조건
- 키 어트리뷰트에 중복된 값이 존재해서는 안된다.
어떤 어트리뷰트가 기본키인지 지정할 수 있다. 이는 고유한 값을 가져야한다. 만약 기본키가 여러개인 경우에는 constrant 키워드를 사용해 기본키를 설정할 수 있다. 이 경우에는 용도_테이블이름의 식으로 constrant의 이름을 설정한다.
기본키로 설정하면 유일성을 보장하고, 조금 더 효율적으로 저장되어 질의처리를 빠르게 할 수 있게 된다.
cf) UNIQUE
해당 애트리뷰트값이 고유해야한다는 것을 명시하는 제약조건이다. 즉, 데이터가 삽입될 때 중복된 값이 있는지 확인한다.
(3) 엔티티(하나의 튜플) 무결성 제약조건
기본키는 튜플을 식별하기 위해 사용되기에 릴레이션의 기본키를 구성하는 어떤 어트리뷰트도 널값을 가질 수 없다.
예시)
Persons(ID, last_name, Age)
primary key: ID, last_name
355, Tom, 34
366, NULL, 35
367, NULL, 37
인 경우 기본키에 포함되는 어트리뷰트 중 하나가 NULL이기에 두번째, 세번째 튜플은 삽입 자체가 불가능하게 된다. 기본키는 무조건 NULL 값을 가질 수 없다.
(4) 참조 무결성 제약조건
참조되거나 참조하는 릴레이션에서 데이터가 삽입, 삭제, 갱신될 때의 무결성 제약조건을 의미한다.
- 참조하는 테이블에서 데이터를 삽입, 갱신할 때는 참조되는 릴레이션에 있는 값을 사용해야한다.
- 참조되는 테이블에서 데이터를 삭제, 갱신할 때는 참조하는 릴레이션에 있는 값을 삭제하거나 갱신할 수 없다.
즉 이를 포멀하게 정리하면 다음과 같다.
- 외래 키의 값은 R1(참조하는 릴레이션)의 어떤 튜플의 기본 키 값과 같다.
- 외래 키의 값은 널 값을 가질 수 있다. 단, 별다른 제약조건이 없어야한다. 예를 들면 외래 키가 자신을 포함하고 있는 릴레이션의 기본 키를 구성하고 있지 않는 경우나 not null이 아닌 경우에만 널 값을 가질 수 있다.
3) 무결성 제약조건의 유지
(1) 삽입 연산
- 제한: 삽입 연산에서 무결성 제약조건에 위배된 경우에는 DBMS가 거절함으로서 무결성 제약조건을 유지한다. 이를 제한이라고 표현한다.
(2) 삭제 연산
ON DELETE 키워드를 사용해 삭제 연산에 대해 옵션을 지정할 수 있다.
- 제한(no action): 삽입 연산과 마찬가지로 제한을 둘 수 있다.
- 연쇄(cascade): 참조되는 릴레이션에서 튜플을 삭제한다면 이와 같은 값을 가지는 외래키의 튜플을 삭제한다.
- set null: 참조되는 릴레이션에서 삭제되는 튜플의 값과 같은 외래키는 null로 바꾼다.
- set default: 참조되는 릴레이션에서 삭제되는 튜플의 값과 같은 외래키는 defaulr 값으로 바꾼다.
어트리뷰트를 생성할 때 디폴트 값을 설정할 수 있다. null 값 대신에 사용할 값을 의미한다.
(3) 수정 연산
수정은 논리적으로 봤을 때는 삭제 연산과 삽입 연산이 연달아 수행되는 것으로 고려해볼 수 있다. 따라서 위의 삽입/삭제 연산에 대해서 고려할 수 있다.
'강의 내용 정리 > 데이터베이스' 카테고리의 다른 글
데이터 베이스(6), DML, 트리거와 주장 (0) | 2022.10.21 |
---|---|
데이터베이스(5), SELECT문 (0) | 2022.10.21 |
데이터 베이스(4), SQL 개요 및 데이터 무결성 (0) | 2022.10.21 |
데이터 베이스(3), 관계 대수와 SQL (0) | 2022.10.19 |
데이터 베이스(1), 데이터베이스 시스템 (2) | 2022.09.19 |