릴레이션은 DB에서 하나의 테이블을 가리킨다. 릴레이션은 아래와 같은 특성을 가진다.
릴레이션에서 키는 하나의 인스턴스를 유일하게 식별할 수 있는 하나의 어트리뷰트, 혹은 둘 이상의 어트리뷰트 속성 집합을 나타낸다. 키는 유일성과 최소성을 만족하는지에 따라 그 종류가 달라지므로 유일성과 최소성을 이해할 필요가 있다.
[ 유일성과 최소성 ]
아래 예시 릴레이션을 예로 유일성과 최소성을 알아보자.
- 유일성
- 어트리뷰트가 인스턴스를 유일하게 식별할 수 있는지를 나타낸다.
- 예를 들어 인스턴스를 유일하게 식별할 수 있는 어트리뷰트 집합은 (친구 번호), (친구 번호, 이름, 생년월일), (이름, 성별) 등이 있다.
- 최소성
- 인스턴스를 식별할 때 사용된 어트리뷰트가 꼭 필요한 요소인지를 나타낸다.
- 예를 들어 (친구번호, 이름, 생년월일)은 인스턴스를 유일하게 식별할 수 있으므로 유일성은 만족한다. 하지만 인스턴스 식별에 '이름'과 '생년월일' 어트리뷰트는 사용되지 않아도 되므로 최소성은 만족하지 못한다.
따라서 유일성과 최소성을 모두 만족하는 키는 (친구 번호)이다.
유일성과 최소성을 이해했다면 키의 종류에 대해 알아보자. 키의 종류는 아래와 같다.
슈퍼키 : 유일성 O, 최소성 X
인스턴스를 유일하게 식별할 수만 있다면 어떤 조합이던 슈퍼키가 될 수 있다.
후보키 : 유일성 O, 최소성 O
인스턴스를 유일하게 식별하는 최소한의 어트리뷰트 집합이다. 모든 릴레이션에는 후보키가 하나 이상 존재한다.
복합키 : 유일성 O, 최소성 O
두 개 이상의 어트리뷰트로 구성된 후보키를 가리킨다. 복합키는 후보키의 한 종류이므로 최소성을 만족한다.
★★★ 기본키 ★★★ : 유일성 O, 최소성 O
후보키 중 하나를 선정하여 해당 릴레이션에서 대표로 삼는 키를 가리킨다. 릴레이션의 특성을 고려하여 기본키를 선정하고 마땅한 어트리뷰트가 없는 경우 일련번호를 만들어 인위적으로 기본키를 삽입할 수도 있다.
대체키
기본키로 선정되지 못한 후보키를 가리킨다.
★★★ 외래키 ★★★
다른 릴레이션의 기본키를 참조하는 어트리뷰트이다. 관계 데이베이스에서 릴레이션 간의 관계를 나타내며, 외래키는 참조하는 기본키와 동일한 도메인을 가져야 한다.
[ 기본키와 외래키]
외래키는 다른 릴레이션의 기본키를 참조하는 어트리뷰트이다. 참조되는 키(기본키)가 변경되면 참조하는 키(외래키)도 변경된다.
각 키의 포함관계는 아래와 같다.
출처 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=gongtong&logNo=150135665812
데이터베이스에서 키는 3가지 속성을 갖는다. 이를 통합하여 라고 표현하며 는 아래와 같다.
또한 가능한 키는 데이터에 의미 가지지 않는 것(=Dataless) 으로 선정한다.
[ 생각해볼 주제 ]
주민등록번호를 키로 사용하는 것은 적절할까?
데이터 무결성이란 DB에 저장된 데이터의 일관성과 정확성을 지키는 것을 의미한다. DB에 변경사항이 있을 때 DBMS가 자동으로 검사한다. 무결성 제약조건은 세 가지가 있다.
도메인 제약조건
어트리뷰트 값들은 반드시 하나의 값을 가져야하며 도메인에 부합하는 값만을 가져야 한다. 데이터 타입, Null, 기본값(default), check 등을 사용하여 도메인 제약조건을 제시할 수 있다.
개체 무결성 제약조건(=기본키 제약조건)
릴레이션에는 기본키가 있어야하며, 기본키의 값은 Null을 가질 수 없고 릴레이션 내에서 중복될 수 없다.
참조 무결성 제약조건(=외래키 제약조건)
두 릴레이션에 연관된 인스턴스 사이의 일관성을 보장하는데 사용되는 제약조건이다. 참조하는 어트리뷰트는 참조되는 어트리뷰트의 도메인과 같아야하고, 참조하는 어트리뷰트를 변경할 때에는 참조되는 어트리뷰트의 제약을 받는다.
참조하는 어트리뷰트 값이 참조되는 어트리뷰트 값 안에 존재할 때 참조 무결성 제약조건이 성립한다.(=기본키에 없는 값을 외래키가 가질 수 없음)
※ 강의 노트에 키 제약조건과 엔티티 무결성 제약조건을 합친 것이 개체무결성 제약조건이다.
데이터가 삽입, 삭제, 수정될 때 DBMS는 무결성 제약조건을 자동으로 판단한다. 아래 그림을 예로 살펴보자. 참조하는 릴레이션은 친구 릴레이션이고, 참조 되는 릴레이션은 학과 릴레이션이다.
삽입 시 무결성 제약조건 판단
학과 릴레이션: 도메인, 개체 무결성 제약조건은 위반될 수 있다.
친구 릴레이션 : 도메인, 개체, 참조 무결성 제약조건이 모두 위반될 수 있다.
삭제 시 무결성 제약조건 판단
학과 릴레이션 : 참조 무결성 제약조건이 위반될 수도 있다.
친구 릴레이션 : 제약조건 위반 없다.
수정 시 무결성 제약조건 판단
값을 수정하려는 어트리뷰트가 기본키인지 외래키인지 우선적으로 판단한다. 기본키와 외래키가 아닌 경우에는 제약조건 위반이 없다. 수정하는 어트리뷰트가 기본키나 외래키인 경우 참조 무결성 유지를 위한 DBMS 옵션이 동일하게 수행된다.
[ 참조 무결성 유지를 위한 DBMS 옵션 ]
옵션 이름 동작 제한 제약조건을 위반하는 연산을 중단 연쇄 참조되는 튜플 삭제(변경) 후 참조하는 튜플도 동일한 연산 진행 널(Null)값 참조되는 튜플 삭제(변경) 후 참조하는 튜플에 Null값 삽입 디폴트(default) Null대신 기본 설정된 값 삽입
기업에서 제공하는 모든 서비스는 데이터에 기반하고, 데이터를 정확하고 효율적으로 저장하는 것이 데이터베이스이므로 데이터베이스는 매우 중요하다. 데이터베이스를 설계할 때 중요한 점은 설계한 데이터베이스와 현실세계와 일치해아 한다는 점, 모든 사용자가 요구하는 데이터와 데이터 사이에 관계가 적절히 표현되어야 한다는 점이다.
데이터베이스를 설계하고 구현하는 과정은 아래 이미지와 같은 과정을 거친다.
출처 : 오라클로 배우는 데이터베이스 개론과 실습
요구사항 수집 및 분석
기존 문서 조사나 현업자 인터뷰 및 설문조사 등이 시행된다. 각 업무와 관련된 모든 부분을 살펴보며 어떤 엔티티가 있는지, 엔티티에 포함된 어트리뷰트는 무엇인지, 엔티티 간에는 어떤 관계를 갖는지 등을 파악한다.
개념적 설계
요구사항 분석을 토대로 개념적 스키마(ER 다이어그램)을 만든다. ER 다이어그램에서는 엔티티가 갖는 어트리뷰트, 엔티티와 엔티티 사이의 관계를 대략적으로 나타낸다. ER 다이어그램의 예는 아래와 같다.
※ 개념적 설계 이후 DBMS를 선정한다. 해당 과정은 생략
[ 물리적 설계 시 고려할 사항 ]
- 응답 시간은 최소화 해야한다.
- 한 번에 얼마나 많은 트랜젝션을 처리할 수 있는지 파악해야 한다.
- 데이터 저장에 효율성을 가져야 한다.
ER모델이란 현실 세계를 엔티티, 관계, 어트리뷰트로 표현한 것을 말한다. ER모델은 데이터베이스 설계 과정 중 개념적 설계 단계에서 그리며 ERWin, ERD Plus 등 ER모델을 그릴 수 있는 프로그램이 다양하다.
엔티티는 사람, 장소, 사물 등 독립적으로 존재하며 개별적으로 식별 가능한 존재이다. 엔티티는 요구사항에서 주어가 되고 데이터의 주체가 되는 것들로 선정한다. 개별 엔티티들은 엔티티 타입(집합)으로 묶인다. 다만 엔티티와 엔티티 타입을 구분할 필요는 없다.
엔티티는 ER모델에서 직사각형으로 표현되며 강한 엔티티 타입, 약한 엔티티 타입으로 구분된다.
출처 : 오라클로 배우는 데이터베이스 개론과 실습
강한 엔티티 타입은 독자적으로 존재할 수 있는 엔티티이다. 자신만의 고유한 키를 가질 수 있다.
약한 엔티티 타입은 키를 형성하기에 충분한 어트리뷰트가 없는 엔티티 타입이다. 강한 엔티티 타입의 키와 결합해야만 인스턴스를 고유하게 식별할 수 있다.
위의 예에서 직원 '김지우'는 직원 ID로 충분히 식별이 가능하다. 그런데 '김지우'의 가족 정보는 어떨까? '김지우'의 가족 정보는 회사 데이터베이스에 저장하기에 그 의미가 확실하지 않다. 그래서 직원의 가족정보는 직원 ID를 결합하여 데이터를 저장한다.(약한 엔티티는 참고 자료 같은 느낌)
어트리뷰트는 엔티티가 가지는 성질을 나타낸다. 어트리뷰트는 요구사항에서 명사나 형용사로 표현된다. 하나의 엔티티에는 하나 이상의 어트리뷰트를 갖는다. ER모델에서 어트리뷰트를 표현할 때에는 타원형으로 그리고 엔티티와 실선으로 연결한다. 어트리뷰트의 종류는 아래와 같다.(어트리뷰트는 속성이라고도 한다.)
출처 : 오라클로 배우는 데이터베이스 개론과 실습
위 종류 중 눈여겨 볼 점은 아래와 같다.
※ 우리 학교 교재에서 단일값 어트리뷰트, 저장된 어트리뷰트는 단순 어트리뷰트와 동일하다. 비교 대상에 따라 이름만 다른 것 뿐이다.
관계는 한 엔티티가 다른 엔티티와 어떻게 연관이 되어있는지를 나타낸다. 관계는 요구사항에서 동사로 표현된다. ER모델에서는 사다리꼴로 나타내고, 연관이 있는 엔티티와 실선으로 연결한다.
★★★관계는 M:N 관계일 때 어트리뷰트를 가질 수 있다.★★★ 하지만 관계는 키 어트리뷰트를 가질 수는 없다. 이 부분은 (이 부분은 매우매우 중요하므로 꼭 여러 번 볼 것 권장함)
약한 엔티티는 강한 엔티티와 관계를 나타낼 때 이중 마름모로 나타낸다.
관계 맺는 엔티티 타입의 개수를 차수로 나타낸다. 4진 관계부터는 잘 사용하지 않는데, 데이터 구조가 너무 복잡해질 우려가 있기 떄문이다.
출처 : 오라클로 배우는 데이터베이스 개론과 실습
관계에 참여하는 개별 엔티티의 개수는 카디날리티로 표현한다. 카디날리티는 1:1, 1:N, M:N 관계로 구분되며 ER모델에서는 관계를 나타내는 실선 위에 표시한다.(표시법도 다양함)출처 : 오라클로 배우는 데이터베이스 개론과 실습
ER모델에는 엔티티 타입이 필수적으로 참여하는지 여부도 나타낼 수 있다.
출처 : 오라클로 배우는 데이터베이스 개론과 실습
[ 순환적 관계(=1진 관계)의 이해 ]
엔티티 타입은 자기 자신과 관계를 맺을 수도 있다. 예를 들어 아래와 같은 릴레이션이 있다고 가정하자.위 릴레이션을 ER모델로 그리면 다음과 같다.
그런데 이렇게 순환적 관계일 때에는 카디날리티 파악이 매우 헷갈린다. 이럴 때는 어떻게 하면 좋을까? 개인적인 방법이지만 순환적 관계를 2진 관계로 나눠주어 생각해보면 쉽다.
한 명의 상사는 적어도 부하직원이 한 명 이상있다. 한 명의 부하직원은 상사가 없을 수도 있고 있다면 한 명만 상사로 갖는다. 따라서 ER 관계를 완성하면 아래와 같아지고, 이를 토대로 다시 순환적 관계로 바꿔주면 된다.