데이터 무결성(integrity) 조건과 ERD(Entity Relationship Diagram)
Table of contents
데이터의 무결성 제약조건이란?
무결성이란, 신뢰할 수 있는 서비스 제공을 위해서 의도하지 않은 요인에 의해 데이터, 소프트웨어, 시스템 등이 변경되거나 손상되지 않고 완전성, 정확성, 일관성을 유지함을 보장하는 특성을 말한다.
즉, 신뢰할 수 있는 릴레이션으로 유지하기위해, 릴레이션에서 기본적으로 지켜야 할 조건과 제약을 무결성 제약조건이라고 한다.
예를 들어, 특정 튜플을 식별할 수 없는 키가 없거나 속성에 맞지 않는 데이터가 저장되면 신뢰할 수 없는 릴레이션이 되기 때문이다.
제약조건의 종류와 특징
1. 엔티티(Entity) 무결성 제약 조건 (엔티티란, 데이터의 집합을 의미한다.)
튜플을 식별할 수 있는 속성인 슈퍼키들 중 최소의 갯수로 이루어진 키를 후보키, 그리고 후보키 중 하나를 고른 것이 기본키 ,기본키를 제외한 후보키를 대체키 라고 했었다.
즉, 기본키로 정한 속성의 데이터는 NULL, 빈 값이 들어갈 수 없다. 왜냐하면, 튜플들을 식별할 수 있어야 하기 때문이다.
2. 키 무결성 제약 조건
키로 정한 속성이라면, 그 속성에 해당하는 데이터는 중복데이터가 존재해서는 안된다.
이 경우 역시, 튜플 간 식별을 할 수 없어지기 때문이다.
3. NOT NULL 무결성 제약조건
튜플을 구성하는데 필수적인 속성인 경우 NULL이면 안된다는 조건이다.
예를 들어, 회원 릴레이션이 있을 경우, 키에 해당하는 속성이 아니여도, 회원 이름에 대한 정보가 NULL이라면 릴레이션에서 중요한 데이터가 비어있는 것이기 때문에 신뢰할 수 없는 릴레이션이 된다.
4. 도메인 무결성 제약조건
속성은 최소 단위로 나누어져있어야 하며, 해당 속성과 일치하지 않는 데이터가 입력되면 안된다는 조건이다.
예를 들어, 나이와 성별 이라는 속성은 나이 / 성별 로 나누어질 수 있으므로 도메인 무결성 제약조건을 위반한 것이며,
나이 속성 데이터로서 숫자가 아닌 다른 형태의 데이터가 입력되어 있다면, 이 경우 역시 무결성 제약조건을 위반한 것이다.
5. 의미적 무결성 제약조건
의미적으로 허용되지 않는 값이 입력되면 안된다는 조건이다.
도메인 무결성 제약조건과 유사한데, 예를 들어, 나이 속성 데이터로서 -10 은 숫자 데이터는 맞지만, 의미상으로 나이가 음수일 수는 없다.
6. 참조 무결성 제약 조건
릴레이션 간 연결 역할을 하는 외래키는, 참조하는 릴레이션에 존재하는 데이터를 참조되는 릴레이션이 가져야 한다. 혹은, 참조하는 릴레이션에서(참조되는 릴레이션 X ) NULL값을 가져야 한다는 조건이다. 참조하는 릴레이션에서 외래키가 NULL값인 경우는 예외적인 경우가 있으므로 허용된다.
ERD(Entity Relationship Diagram) 설계하기
요구사항에 따라, 데이터와 데이터간의 관계를 생각하여 데이터베이스를 모델링 한다.
특히, 릴레이션을 생각하고, 해당 릴레이션에 포함되어 있어야 하는 속성들이 무엇이 있는지 생각해봐야 한다.
예를 들면, 회원 릴레이션이 있다고 생각하면, 회원 번호, 회원 아이디, 회원 이름, 성별 등등의 속성이 필요한 것 처럼 말이다.
설계하기전에 요구 사항이 무엇인지 확실히 정리하는 것이 중요하다.
요구사항에 따른 데이터 속성, 항목 정리를 끝낸 후. ERD(Entity Relationship Diagram)을 만든다.
ERD 란, 릴레이션과 속성간의 관계를 쉽게 파악할 수 있는 데이터 관계 다이어 그램을 말한다.
ERD를 만드는 방식은 대표적으로 Peter Chen 스타일과 Crow’s Foot 방식 두개가 있다.
Peter Chen 스타일은 형태 자체는 마인드맵과 유사하다.
데이터의 집합을 설명할 수 있는 엔티티는 사각형으로 그리고 속성이 될 수 있는 것들은 타원으로 표시한 뒤 연결시킨 모습이다.
유도된 속성이라는 개념이 존재하는데, 이는 명시적인 속성은 아니지만, 생년월일 이라는 속성을 통해서 나이를 유추할 수 있듯이 한 속성에서 유도할 수 있는 속성을 유도된 속성이라고 한다.
유도된 속성은 데이터베이스에 저장되는 생년월일 데이터를 통해서 계산할 수 있어, 따로 저장하지 않으며, 점선으로 표시한다.
많은 속성들을 추가하는 방향보다는, 최소한의 필수 속성들을 정의하고, 그 안에서 추출할 수 있는 속성(유도된 속성)이 뭐가 있을지 판단하면 메모리적 관점에서 좋을 것 같다는 생각이 든다.