#title 참조무결성 규칙 [[TableOfContents]] ==== 참조 무결성 규칙의 정의 ==== 벌써 옛날일이다. 성수대교 붕괴사고(1994. 10. 21)가 있었다. 성수대교의 붕괴는 “트러스구조물의 철구조물제작 및 용접과정에서의 원천적인 부실시공과 준공이후 설계하중을 초과하는 과부하의 지속과 취약한 접합부위의 방치등 관리잘못이 복합적으로 작용해 일어난 것으로 밝혀졌다.(한국건설기술연구원, http://www.kict.re.kr/)”고 원인 분석이 되었다. 건축자제와 자제를 연결하는 과정에서 부실한 연결을 하였고, 설계당시 미래의 예측을 하지 못한 것, 문제점이 발견되었는데 불구하고 유지보수를 하지 않은 것이 문제였다. 정보시스템도 이와 거의 똑같다. 각각의 요소가 튼튼히 연결되지 못하고, 문제점이 발견되면 유지보수를 하여야 하는데 그저 그때만 넘기면 된다는 식이 ‘소프트웨어 위기’라는 용어를 만들어 낸 것이다. 이 ‘성수대교 붕괴 사고’에서 이야기 하고자 하는 것은 바로 건축 구조물의 연결이다. 관계형 데이터베이스에서 엔티티 집합과 엔티티 집합간의 관계를 보장하는 것이 참조 무결성이다. 참조 무결성은 물리적으로 구현되었을 때‘외부키’로 구현된다. 참조 무결성은 실제로 물리적인 데이터베이스에 데이터를 입력, 수정, 삭제할 때 일어날 수 있는 문제를 발생하지 않도록 데이터베이스를 지켜준다. 일반적으로 참조 무결성 규칙은 다음과 같다. * 입력 참조 무결성 * DEPENDENT * AUTOMATIC * DEFAULT * CUSTOMIZED * NULL * NO EFFECT * 삭제/수정 참조 무결성 * RESTRICT * CASCADE * DEFAULT * CUSTOMIZED * NULL * NO EFFECT 참조 무결성은 테이블 생성시에 각각의 DBMS 제품이 지원여부 따라서 지정해 주어야 한다. 여러분 각각의 DBMS가 지원하는 참조 무결성의 종류를 숙지하고 이를 최대한 이용하여야 한다. 이러한 것을 모른다면 자연스레 저장 프로시저나 트리거 또는 어플리케이션에서 제어를 하게 되는데 이것은 어려운 개발 방법이다. 특히나 모든 데이터의 처리를 어플리케이션쪽에서 한다는 것은 데이터베이스를 단지 데이터의 저장소라는 개념으로 본다는 것이다. 단지 테이블 생성시 한 라인의 코드만 추가해 주면 될 것을 수십, 수백라인의 코딩을 거친다는 것은 참으로 안타깝다. DBMS는 데이터의 처리에 특화된 소프트웨어다. 이를 적극적으로 이용하지 못한다면 비용이 낭비된다. 그러나 때로는 데이터베이스와 어플리케이션의 부하 분산이 필요할 때도 있다. 정답은 없다. ==== 입력 참조 무결성 규칙 ==== 다음은 입력 참조 무결성 규칙에 대한 설명을 표로 요약한 것이다. ||입력 참조 무결성||설명|| ||DEPENDENT||참조되는 테이블에 PK가 존재할 때만 입력 허용|| ||AUTOMATIC||참조되는 테이블에 PK가 없는 경우 PK를 생성 후 입력|| ||DEFAULT||참조되는 테이블에 PK가 없는 경우 지정된 기본값으로 입력|| ||CUSTOMIZED||특정한 조건이 만족할 때만 입력 허용|| ||NULL||참조되는 테이블에 PK가 없는 경우 외부키를 Null 값으로 처리|| ||No EFFECT||조건 없이 입력을 허용|| 다음은 입력 참조 무결성에 대한 예다. “부서” 와 “사원”이 그림과 같은 관계를 맺고 있을 때 각각의 입력 참조 무결서 규칙을 적용했을 때를 나타내고 있다. 여기서 참조하는 테이블은 다측의 테이블 즉, “사원” 테이블이고, 참조되는 테이블은 “부서” 테이블이다. attachment:reference_rule01.jpg ==== 삭제/수정 참조 무결성 규칙 ==== 다음은 삭제/수정 참조 무결성 규칙에 대한 설명을 표로 요약한 것이다. ||삭제/수정 참조 무결성|| 설명|| ||RESTRICT||참조하는 테이블에 PK가 없는 경우 삭제/수정 허용|| ||CASCADE||참조되는 테이블과 참조하는 테이블의 외부키를 연쇄적 삭제/수정|| ||DEFAULT||참조되는 테이블의 수정을 항상 허용하고, 참조하는 테이블의 외부키를 지정된 기본값 바꿈|| ||CUSTOMIZED||특정한 조건이 만족할 때만 수정/삭제 허용|| ||NULL||참조되는 테이블의 수정을 항상 허용하고, 참조하는 테이블의 외부키를 NULL 값으로 수정|| ||No Effect||조건 없이 삭제/수정 허용|| attachment:reference_rule02.jpg ==== 마무리 ==== 참조 무결성 규칙에 대해서 감이 안 올 수 있다. 그러나 이것을 현실과 연관해서 생각해 보면 아주 쉽다. 그림에서 처럼 “각각의 사원은 반드시 하나의 부서에 소속되어야 한다” 와 “각각의 부서는 반드시 한명이상의 사원이 소속되어야 한다.” 라는 현실이 있다면 입력규칙에서는 사원이 소속될 부서가 없으면 입력되지 않고, 만약 한 부서를 없앤다고 했을 때는 그 부서에 소속된 사원을 다른 부서로 옮기던지 퇴사를 시키던지 해야 할 것이다. 여러분이 SQL을 다루실 때 이러한 점을 생각해 주어야 한다. 만약 테이블을 생성할 때도 무조건 1측의 테이블부터 생성하고 그 다음에 다측의 테이블을 생성한다는 것을 하나의 문법이라고 생각하지 말고, 위에서 살펴본 것처럼 현실을 반영하고 있기 때문이란 것을 항상 생각해야 한다. 데이터베이스는 현실을 반영한다고 했다. 가만히 생각해 보면 데이터베이스가 어떻게 현실을 반영하는지 알 수 있을 것이다.