데이터이야기

DB 노하우, 데이터직무, 다양한 인터뷰를 만나보세요.

관계형 데이터 구조 - 나머지 네 가지

데이터 이야기
작성자
dataonair
작성일
2014-04-15 00:00
조회
8002


3. 각 행은 유일하다.

수학적 의미의 집합(set)은 분별할 수 있는 원소의 모임이기 때문에 한 집합에 분별할 수 없는 똑 같은 원소가 중복해서 포함될 수 없다. 이것을 튜플(Tuple)의 유일성이라 한다. 즉, 두 개의 똑 같은 튜플(행-Row)은 한 릴레이션(테이블)에 포함될 수 없다. 이것은 릴레이션(테이블)의 인스턴스가 튜플(행-Row)을 원소로 갖는 집합이라는 데서 나오는 당연한 성질이다. 이 튜플(행-Row)의 유일성은 릴레이션(테이블)을 조작하기 위해 튜플(행-Row)을 접근하고 식별하는 방법의 기본이 된다. 관계형 모델에서는 이러한 성질을 실체 무결성(Entity Integrity)이라 한다.

dbin_237.jpg

데이터 무결성(Data Integrity)이란 사용자가 관계형 테이블에 입력, 수정, 삭제, 조회의 데이터 조작을 수행할 때 데이터의 일관성(Consistency)과 정확성(Correctness)을 유지할 수 있도록 하는 일련의 업무 규칙(Set of Business Rules)을 말한다고 하였다.

실체 무결성의 정의는 “식별자(Identifier)는 널(Null) 값을 포함하지 않는다.”라고 하고 있다. 즉, 물리적으로는 프라이머리 키(PK: Primary Key)에 대한 것을 규정하고 있다. 프라이머리 키(P K)를 가지지 않으면 이는 테이블로 간주하지 않는다.

널(Null)이라는 값은 논리적으로는 “모르는 값”이라는 의미를 가진다. 우리가 현실 세계에서 어떤 하나의 개체 또는 실체를 인식하고자 할 때, 그 개체 또는 실체를 인식할 수 있는 어떤 값(컴퓨터, 시계, 책상 등등 모든 사물에 대한 값)이 주어져 있지 않더라도 어떤 형태만 있다면 그 개체를 인식할 수 있다. 설령 그 개체의 이름을 모른다 하더라도 인식할 수 있는 것이다. 이 떠오르는 그 무엇이 그 개체의 형상(Image)이든, 어떤 숫자이든 상관 없이 그것은 Null(모르는 것)이 아니라는 것이다. 이런 이유에서 테이블에서 하나의 개체 또는 실체를 인식하려면 Null(모르는 것)이어서는 안 되는 것이다.

dbin_238.jpg

식별자 즉, 프라이머리 키(PK)가 Null값을 가지면 어떤 현상이 발생하는가 T1 테이블의 PK가 Null값을 갖는다고 가정을 해보자.

관계 연산자를 이용하여 T1 테이블에서 T2 테이블과 T3 테이블을 만든 후 조인(Join)을 하여 T4라는 테이블을 만들면 원래는 두 개의 행(Row)만 있었는데 조인을 하면서 NULL은 모르는 값이므로 조인 조건에 빠지게 되어 원래는 2개였던 행(Row)이 1개의 행(Row)만 생긴다(빨간색 행이 없어짐). 이런 경우도 우리는 무결성(Integrity) 깨졌다고 한다.

그런데 필자가 베토벤이라는 것에 대해서 얘기하고 있다고 가정을 해보자. 여기에서 필자가 말하는 베토벤을 어떤 사람은 음악가 베토벤으로 인식할 것이고, 어떤 사람은 영화에 나오는 개 베토벤이라고 인식할 수 있다. 인간은 전후 문맥이나, 전체적인 상황을 판단하면서 이것이 음악가를 얘기하는 것인지 영화에 나온 개를 얘기하는 것인지를 판단할 수 있는 지적 능력을 보유하고 있다. 하지만 컴퓨터는 이러한 인간이 지니고 있는 지적 능력을 가지고 있지 않다. 단지 인간의 명령에 의하여 컴퓨터의 임무를 수행할 뿐이다. 컴퓨터는 베토벤이라는 것으로만 정보를 찾으려면 이 베토벤이 악성 베토벤인지 영화에 출연한 개 베토벤인지를 구별 못한다. 이러한 이유로 식별자는 반드시 유일해야 한다는 것이다. 그러므로 식별자를 선정 할 때는 무엇인가 값을 가지며(Not Null), 항상 유일(Unique)한 값을 가져야만 하나의 개체 또는 실체를 정확하게 찾아낼 수 있는 것이다. 식별자가가 유일하지 않으면 어떤 현상이 발생하는가 T1 테이블의 프라이머리 키(PK)가 유일하게 구성되지 않았다고 가정을 해보자.

dbin_239.jpg

관계 연산자를 이용하여 T1 테이블에서 T2 테이블과 T3 테이블을 만든 후 조인(Join)을 하여 T4라는 테이블을 만들면 원래는 두 개의 행(Row)만 있었는데 조인을 하면서 2 * 2 = 4 인 곱 집합이 생겨 원래는 없었던 2 개의 행(Row)이 더 생겼다. 이런 경우도 우리는 무결성(Integrity)이 깨졌다고 한다.

이러한 특성 외에 우리가 별도로 Primary Key의 선정 기준을 좀 더 살펴보면 Primary Key를 구성하는 각각의 컬럼 수를 최소한의 집합(Minimal Set)으로 할 것과, 값의 수정이 없는 것, 업무적으로 활용도가 높은 것 등을 들 수 있다. 최소한의 집합이 아니면 유일성(Unique)이 깨질 수 있으며, 값의 수정이 있는 것은 상기의 예에서 지점코드가 통폐합에 의해서 바뀐다던가 상품이 증가하여 자릿수가 늘어난다든가 하면, 자식 테이블에 미치는 영향이 많으므로 될 수 있으면 이런 컬럼들은 Primary Key 선정에서 제외한다. 식별자의 구성 속성이 최소한의 속성으로 구성되지 않으면 어떤 현상이 발생하는지를 알아보자.

dbin_240.jpg

그림 식별자는 최소한의 속성으로 구성에서 오른쪽을 보면 식별자가 사원번호와 사원명으로 구성되어 있다. 물론 현실에서 이렇게 구성하는 예를 찾아 보기는 힘들겠지만 이해를 돕고자 간단한 예를 든 것이니 개념을 이해하기 바란다.

최소한의 속성으로 구성되어야 할 식별자가 최소한의 속성으로 구성되지 않아 우리가 업무적으로 유일성을 보장해야 하는 특성이 파괴되고 있는 것이다. 만약에 예로든 사원번호를 가지고 다른 테이블과 조인을 하게 된다면 카티젼 프러덕트(다:다의 곱 집합)가 발생하여 상기의 경우에는 데이터가 2배로 증가되어 보여질 것이다.



4. 열(Column)의 순서는 의미가 없다.

이것을 애트리뷰트(attribute)의 무순서성이라 한다. 이 성질은 한 릴레이션의 스킴이 일정 수의 애트리뷰트 집합으로 정의되는 데서 나오는 결과인 것이다.

dbin_241.jpg

고객(CUSTOMER) 릴레이션의 정의를 다시 분석하여 보면 이정의는 고객 릴레이션이 고객번호, 성명, 생년월일, 주민등록번호, 전화번호의 5개의 애트리뷰트(attribute)로 구성 된다는 것을 정의한 것이지 애트리뷰트의 물리적인 위치나 상대적 위치, 즉 나열 순서까지 정의한 것은 아니다. 따라서 고객번호 애트리뷰트는 고객 릴레이션에 속하는 애트리뷰트이지 제일 먼저 기술되었다고 해서 첫 번째 애트리뷰트라는 의미는 아니다. 따라서 릴레이션을 나타내는 테이블의 맨 위에 기술되어 있는 열(Column) 이름들은 이 릴레이션의 스키마(scheme - 구조)의 한 표현인 것이다. 원래 튜플(tuple ? row)은 <애트리뷰트 이름: 값> 쌍의 집합으로 표현하면 충분한 것이지 이 쌍들간에 어떤 순서가 존재하는 것은 아니다. 보통 한 튜플을 나타내는 테이블의 한 행은 애트리뷰트 이름을 일일이 나열하지 않고 값만을 기술한 것인데 이것은 값의 순서(왼쪽에서 오른쪽으로)를 가지고 대응되는 애트리뷰트 이름을 알 수 있게 하는 편의상이 표현 방법에 불과하다.

파일이나 계층형 모델에서는 우리가 프로그램을 통하여 데이터에 접근할 경우 반드시 FD(FILE DEFINITION)문에서 파일이나 계층형 모델의 세그먼트(Segment) 구조와 동일하게 정의를 해야만 한다. 하지만 관계형 모델에서는 SELECT LIST절에 속성을 테이블에 있는 컬럼(Column)의 순서와 상관없이 우리가 먼저 보고자 하는 컬럼(Column) 명을 기술만 하면 되는 것이다. 파일의 구조와 똑같이 기술 안 해도 데이터 조작을 할 수 있으니 그만큼 생산성이 증가할 수 있는 것이다.



5. 행(Row)의 순서는 의미가 없다.

수학적 의미의 한 집합의 원소 사이에는 순서가 없는데 릴레이션은 바로 튜플을 원소로 하는 집합이기 때문에 이 튜플 사이에는 순서가 있을 수 없다. 이것을 튜플(tuple)의 무순서성이라 한다. 이 성질 역시 릴레이션은 본질적으로 집합이라는 것 때문이다. 즉, 이것은 두 릴레이션의 튜플들이 그 순서만 다르다고 해서 상이한 릴레이션이 될 수 없다는 뜻이다.

dbin_242.jpg

예를 들어, 상기의 고객 릴레이션에서 튜플들의 순서를 밑에서 위로 표현하여 고객1 릴레이션이라고 표현한다 하더라도 고객과 고객1 릴레이션이 본질적으로 달라지는 것이 아니다. 즉, 테이블의 표현은 서로 다를지 모르지만 고객 릴레이션이 나타내는 내용(튜플)과 고객1 릴레이션이 나타내는 내용(튜플)은 모두 같기 때문에 이 두 릴레이션은 같은 것이다.

결국 릴레이션과 테이블의 차이는 추상적 개념(의미)과 이를 밖으로 나타내는 구체적 표현의 차이로서 릴레이션은 추상적 개념이고 테이블은 이 릴레이션을 외부로 기술하는 하나의 구체적 표현인 것이다. 그런 의미에서 사실상 하나의 릴레이션은 여러 가지 상이한 형태의 테이블로 표현될 수 있는데 이것은 하나의 개념을 설명하는 방법, 즉 구현 방법은 항상 여러 가지가 있을 수 있다는 것을 의미한다.



6. 각 열(Column)은 유일한 이름을 가진다.

이 특성은 “열(Column)의 순서는 의미가 없다.”는 것의 연장선상에서 생각을 하자. 즉, 열의 순서는 중요하지 않기 때문에, 열(Column)은 그것의 위치에 의해서가 아니라 열의 이름에 의해서 그 값을 찾을 수 있는 것이다. 일반적으로 열의 이름은 데이터베이스 관리 시스템(DBMS)의 전체 또는 주어진 데이터베이스에서 조차 유일할 필요는 없다. 하지만 열(Column)이 표현되는 테이블 내에서는 반드시 유일한 이름을 가져야 한다.

dbin_243.jpg













출처 : 한국데이터베이스진흥원

제공 : DB포탈사이트 DBguide.net