10.관계형데이터베이스설계 - 테이블관계

2008. 9. 13. 01:58Study/Database

1. 관계는 왜 중요한가

 관계는 관계형 데이터베이스의 중요한 구성 요소다.

- 논리적으로 서로 연관된 한 쌍의 테이블들 사이의 연결을 설정한다.

- 테이블 구조를 더 정제하고 이중 데이터를 최소화하도록 도와준다.

- 여러 테이블들로부터 동시에 데이터를 추출할 수 있도록 해 주는 메커니즘이다.


2. 관계의 종류

1) 일대일 관계

 일대일 관계는 보통 부분 집합 테이블을 수반한다.


2) 일대다 관계

 데이터베이스 내의 한 쌍으 테이블들 사이에 존재하는 가장 일반적인 관계이다. 데이터 무결성 관점에서 이중 데이터를 제거하고 중복 데이터를 절대적으로 최소화해 주기 때문에 중요하다.


3) 다대다 관계

 다대다 관계의 문제

- 테이블들 중 하나로부터 정보를 추출하는 것이 지루하고 다소 어렵다.

- 테이블들 중 하나가 대량의 중복 데이터를 포함한다.

- 양 테이블에 이중 데이터가 존재한다.

- 데이터를 삽입.갱식.삭제하기 어렵다.


4) 자기 참조 관계

 테이블 내의 주어진 레코드가 테이블 내의 다른 레코드와 연관될 때 테이블은 자기 자신과 자기 참조 관계를 가진다. 자기 참조 관계도 일대일, 일대다, 다대다 관계를 가질 수 있다.


3. 현존하는 관계 식별하기

1) 테이블 관계 식별 행렬 만들기

- 데이터베이스의 모든 테이블드? 행렬을 만드는 것으로 관계 식별 작업을 시작한다.

- 테이블 목록의 테이블명을 행과 열에 동일한 순서로 차례로 적는다.

- 왼쪽 위에서 부터 각각의 테이블 쌍이 갖는 직접적인 관계를 판단한다.


2) 테이블 쌍이 갖는 관계를 식별시, 관점

-  연결적(associative)

 a) 첫번째 테이블 내의 한 레코드는 두 번째 테이블 내의 하나 이상의 레코드들과 연관될 수 있는가?

 b) 테이블 내의 한 필드는 다른 필드와 연관될 수있는 가?

- 상황적(contextual)

 첫째 테이블에 의해 표현되는 주제의 하나의 인스턴스를 둘째 테이블에 의해 표현되는 주제의 여러 인스턴스들과 대조한다. 여기서 소유 지향과 행위지향의 두 범주가 있다.

 a) 소유 지향 질문 : '소유하다', '가지다', '~의 부분이다', 및 '포함한다'와 같은 문구를 포함한다.

 b) 행위 지향 질문 : '만들다', '방문하다', '놓다', '가르치다', '출석하다'와 같은 행위를 수반한다.


3) 행렬 상에서 한 쌍의 테이블 사이의 관계를 식별하기 위해 사용할 절차

- 한 쌍의 테이블들을 선택하고 첫째 테이블과 둘째 테이블 사이의 교차점의 항목을 적는다.

- 현재 작업 중인 행렬의 같은 쪽에 앴는 둘째 테이블에 위치를 잡고, 이것과 행렬의 반대쪽에 있는 첫째 테이블과의 사이에 있는 교차점의 항목을 적는다.

- 이 두 항목들에 적절한 공식을 적용하여, 테이블들 사이의 공식적인 관계를 식별한다.

- 적절한 방법으로 관계를 그린다.

- 행렬에서 두 항목을 삭제한다.


4. 각각의 관계 설정하기

일대일 또는 일대다 관계에 참여하는 테이블들 사이에 연결을 설정하기 위해서 주키와 외래 키를 사용한다.

1) 일대일 관계

부모 테이블의 주 키의 복사본을 취해서 자식 테이블의 구조에 포함시킴으로 일대일 관계를 설정한다. 자식테이블의 외래키는 자식테이블에서 주키 역할을 수행한다.


2) 일대다 관계

관계의 인 테이블에서 주 키의 본사본을 취하고 측에 포함시킨다.


3) 다대다 관계

연결 테이블로 다대다 관계를 설정한다.

- 다대다 관계 설정 절차

a) 관계의 각 테이블로부터 주 키의 복사본들을 취하고, 테이블의 구조를 만들기 위해 이 키들을 사용하여 연결 테이블을 정의한다. 연결 테이블에서 이 필드들은 다음과 같은 두 개의 서로 다른 목적으로 사용된다. 합쳐져서 테이블의 복합 주 키를 구성하고, 각각은 부모 테이블과 연결 테이블 사이의 관계를 설정하기 위한 고유한 외래 키다.

b) 연결 테이블에 두 테이블들 사이의 관계의 성질을 나타내는 이름을 부여한다.

c) 연결 테이블을 최종 테이블 목록에 추가하고, 테이블 종류와 테이블 설명을 위해 적절한 항목을 입력한다.

- 연결 테이블을 만드는 것이 가지는 결과

 a) 다대다 관계가 해소 된다.

 b) 연결 테이블은 두 개의 외래 키들을 포함한다.

 c) 연결 테이블은 두 개의 외래 키로 구성되는 복합 주 키를 가진다.

 d) 연결 테이블은 중복 데이터를 절대적으로 최소화하는데 도움을 준다.

 e) 연결 테이블의 이름은  이 연결 테이블이 설정하는데 도움을 주는 관계의 목적을 반영한다.


4)  자기참조 관계

- 일대일과 일대다

주 키와 외래 키를 사용한다. 외래키가 이미 테이블 구조의 일부인 경우가 종종 있으며, 만약 아직 없다면 만들기만 하면된다.

- 다대다 관계

연결 테이블을 사용한다. 그러나 연결 테이블을 만드는데 사용되는 필드들이 같은 부모 테이블에서 나온다는 것이 다른 점이다.


5) 각 테이블의 구조 검토하기

테이블들 사이에 관계를 설정한 뒤에 모든 테이블 구조를 검태한다. 다시 이상적 테이블의 요소들을 따르는지 확인한다.


5. 모든 외래 키 정제하기

1) 외래 키의 요소들

- 복사되온 주 키와 같은 이름을 가진다.

- 복사되온 주 키를 위한 필드 명세의 복제를 사용한다.

- 참조하는 주 키로부터 값을 도출한다.


6. 관계 특성 설정하기

관계의 특성들은 레코드를 삭제할 때 어떤일이 벌어지는지, 관계에서 각 테이블이 사용하는 참여의 종류, 관계에서 각 테이블이 어느 정도로 참여하는지를 나타낸다.

1) 각 관계를 위한 삭제 규칙정의하기

주어진 관계의 부모 테이블에서 주어진 레코드를 삭제하기 위해, RDBMS가 뭇엇을 해야 하는지를 결정한다. 삭제 규칙은 관계 수준의 무결에에 중요하다.

- 거부(deny)

부모 테이블의 레코드를 삭제하지 않고 유지하면서 비활성으로 지정한다.

- 제약(restrict)

자식 테이블에 연관 레코드들이 있으면 부모테이블의 레코드를 삭제하지 않는다.

- 연속(cascade)

부모 테이블의 레코드를 삭제하고, 자식 테이블의 모든 연관레코드를을 자동적으로 삭제한다.

- 널화(nullify)

부모 테이블의 레코드를 삭제하고, 자식 테이블의 연된 레코드들의 외래 키 값을 널로 갱신한다.

- 기본값 설정(set default)

부모 테이블의 레코드를 삭제하고, 자식 테이블의 연관된 레코드들의 외래 키 값들을 외래 키의 필드 명세의 현재의 기본값 요소로 갱신한다.

* 주어진 관계를 위해 어떤 삭제 규칙이 적절한지 판단하는 최선의 방법은 관계 다이어그램을 검토한다.

 eg) 부모 테이블의 레코드가 삭제될 때, 자식 테이블의 연관된 레코드들에는 어떤일이 발생하는가?


2) 각 테이블의 참여 종류 식별하기

- 참여 종류

 a) 강제적(mandatory)

  연관된 테이블에 레코드를 입력하기 전에 이 테이블에 어떤 레코드가 반드시 있어야 한다.

 b) 선택적(optional)

  연관된 테이블에 레코드를 입력하기 전에 이 테이블에 어떤 레코드가 있어야 할 필요가 없다.

* 참여의 종류가 명백하거나 상식적이거나 특별한 표준을 따를 때, 참여 종류를 설정할 수 있지만, 대부분의 참여 종류는 업무 규칙을 정의할 때 결정한다.


3) 각 테이블의 참여 수준 식별하기

참여수준은 연관된 테이블의 한 레코드와 연관되어야 하는 최소 레코드 수와, 연관된 테이블의 한 레코드와 연관될 수 있는 최대 레코드 수를 나타낸다.


4) 사용자 및 관리자들과 테이블 관계 검증하기

- 각 관계를 올바르게 식별했는지 확인한다.

- 각 관계를 올바르게 설정했는지 확인한다.

- 각 외래 키가 외래 키의 요소들을 따르는지 확인한다.

- 각 관계를 위해 적절한 삭제 규칙을 설정했는지 확인한다.

- 이중 테이블 관계의 각 테이블과 자기 참조 관계의 적절한 키 필드들을 위해 올바른 참여의 종류를 식별했는지 확인한다.

- 이중 테이블 관계의 각 테이블과 자기 참조 관계의 적절한 키 필드들을 위해 올바른 참여 수준을 식별했는지 확인한다.


7. 관계 수준의 무결성

관계 수준의 무결성은 다음을 보장한다.

1) 관계 내의 두 테이블 사이의 연결이 정상적이다. 일대일 또는 일대다 관계를 설정하기 위해 주 키와 외래 키를 사용하고, 다대다 관계를 설정하기 위해 연결 테이블을 사용함으로써 이것을 달성한다.


2) 의미 있는 방법으로 각 테이블에 새 레코드를 삽입할 수 있다. 관계 내의 각 테이블를 위한 적절한 참여의 종류를 지정함으로써 이것을 보장한다.


3) 어떤 역효과도 만들지 않고 기존의 레코드를 삭제할 수 있다. 관계를 위한 적절한 삭제 규칙을 할당함으로써 이것을 보장한다.


4) 관계 내에서 상호 연관될 수 있는 레코드들의 수에 의미 있는 제한이 있다. 관계내의 각 테이블을 위한 적절한 참여의 수준을 지정함으로써 이것을 구현한다.


--------------------------
출처 - 위 글은 byung8lim의 다음블로그 Blog.daum.net/byung8lim에서 가져온 것입니다.