DATOR


관계를 모두 외래키(FK)로 만들어야 하나요? 관계


 논리 모델의 엔터티와 속성이 물리 스키마에서는 무엇이 되는지를 물어보면 전산을 업으로 하는 대부분의 사람들은 테이블과 컬럼이라고 자신있게 대답한다. 그런데, 논리 모델의 관계가 물리 스키마에서 무엇이 되는지를 물어보면 정도는 답을 하지 못하고 나머지 반의 대부분은 외래키(정확히 표현하면 외래키 제약조건 - foreign key constraint)가 된다고 대답한다. 결론적으로 완전히 잘못된 답은 아니나 정확한 답변이라 보기도 어렵다.

 기본적인 답은 '컬럼' 된다는 것이다. ERwin에서 1:1 또는 1:M 관계를 생성하면 먼저 선택한 엔터티의 식별자가 상대 엔터티에 속성으로 전달되는 것을 있다. DataWare DA에서도 식별자 상속 모드를 선택하면 동일한 변화를 확인할 있다. 아래 모델에서 주소나 주문 엔터티의 고객번호(FK) 속성은 고객 엔터티와의 관계에 의해 고객 엔터티의 식별자 상속받은 것이다. 이렇게 관계는 이미 논리 모델에서 속성으로 표현되며, 결국 이들은 물리 스키마에서 컬럼이 된다.

 

관계-고객-주소2.JPG

 

 그런데 일반 속성도 컬럼이 되므로, 관계가 컬럼이 된다고만 하기에는 뭔가 중요한 것을 놓친 느낌이. 사실 관계가 속성이 되고 속성이 컬럼이 되는 과정에서 우리는 알게 모르게 엔터티 간의 연결고리를 만들었다. 주소 엔터티의 고객번호 속성은 고객 엔터티의 식별자이므로 특정 주소 인스턴스에 해당하는 고객명을 얻기 위해서는 인스턴스의 고객번호 값을 가지고 고객 엔터티를 검색하 된다. 반대로 특정 고객의 주소 내역을 알려면 고객의 고객번호 값을 활용하여 주소 엔터티를 검색하면 된다. 정리하자면 관계는 관련된 인스턴스 간에 상호 검색을 위해서 1 엔터티의 식별자를 상대 엔터티에게 전달하여 물리 스키마의 컬럼 되도록 한다. 이렇게 되는 과정은 자연스럽게 약엔터티(상위 엔터티가 존재하는 엔터티 : http://www.dator.co.kr/jslee/92572)식별자를 지정하는 과정이 되기도 한다.(앞으로 추가 논의 예정)

 약간 질문을 달리해서, 모든 관계는 외래키 제약조건을 만들어야 하는지에 대해 생각해 보자. 사실 많은 모델러가 부분에 대해 고민하고 있을 것이다.

 어떤 서적에는 외래키 제약조건을 만들어야 하는 경우에 관계를 논리 모델에 표기하라고 설명하고 있는데, 이것은 논리 모델의 목적을 물리 스키마의 생성에만 있다라고 생각하는 경우에나 합리적인 판단이다. 그러나, 물리 모델링을 진행하다가 외래키 제약조건을 만들기 매우 어려운 상황이 되었다고 논리 모델의 관계를 삭제하면, 관계가 표현하고 있는 데이터 구조 대한 정보도 같이 없어지는 일이 발생하는데, 이것은 결코 바람직한 모델링 절차라 없을 것이다.

 논리 모델은 데이터의 물리적 저장 방식과는 별개로 구성되어야 한다즉, 논리 모델링 단계에서 물리 데이터 구조가 어떤 DBMS 사용할지 신경쓰지 않아도 된다는 말이다. 또, RDB가 아닌 HDB를 사용해도 되고, 엑셀파일이나 파일시스템을 사용해도 된다. 심지어 종이에 적어서 기록해도 괜찮다는 말이다. 그런데 DBMS를 사용하지 않은 데이터 구조라면 DBMS에서 제공하는 제약조건을 생성할 수도 없을 것이다. 따라서, 외래키 제약조건의 구현 여부나 구현 방식은 선택의 문제로 보아야 한다. 만약 외래키 제약조건 기능을 지원하는 DBMS 사용하고, 성능이나 데이터 보존 등의 측면에서 제약조건을 생성할 있는 상황이라면 DBMS 기능을 사용하고, 그렇지 못한 상황이라면 데이터를 입력/수정/삭제하는 프로그램에서 기능을 구현하면 된다. 여러 상황을 감안해 보았더니 도저히 불가능한 상황이라면 데이터 정합성은 특정 주기를 두고 일괄 체크하기로 하고, 프로그램에서도 구현하지 않을 수도 있는 것이다.

 또, DBMS에서 지원하는 기능으로는 외래키 제약조건을 생성할 없는 관계도 있다. 예를 들어 between 관계는 부모의 식별자를 자식에게 상속해주지 못하지만 간의 데이터 정합성을 유지하기 위해서는 체크가 필요하다. 아래 그림과 같이 수표책 엔터티와 발행수표 엔터티는 발행수표 엔터티의 수표번호가 수표책 엔터티의 시작수표번호와 종료수표번호 사이인 경우에 해당 인스턴스 간의 관계가 존재한다라고  있다.   수표책 엔터티의 식별자인 수표책일련번호 속성을 발행수표에 상속하지 않더라도 발행수표 엔터티의 식별자인 수표번호 만으로 수표책 엔터티의 관계된 인스턴스를 찾을 있다. 반대로 수표책 엔터티의 시작수표번호와 종료수표번호 속성의 값을 이용하여 발행수표 엔터티의 인스턴스를 검색할 있다. 이런 관계에서도 발행수표 엔터티의 모든 인스턴스의 수표번호가 수표책 엔터티의 인스턴스 시작수표번호와 종료수표번호 사이인 인스턴스가 반드시 단 하나만 존재하는지를 체크해야만 데이터 정합성을 유지할 있을 것이다. 일반적인 외래키 제약조건 기능으로는 이런 조건을 체크할 없으므로 이와 같은 제약 사항의 구현은 프로그램 레벨에서 해야 한다.

 

수표책2.JPG 

 

TAG

Leave Comments