외래키 제약조건을 사용하지 않는 이유?
제가 아직 경험이 적은 개발자라 이해를 못해서 그런건지는 잘 모르겠습니다.
외래키 사용에 관련하여 궁금증이 있습니다.
일단 제가 데이터베이스에 관해 배울때는 1:1 관계나 1:다 관계를 맺고 있는
테이블 간엔 외래키를 사용하여 관계를 정의하고, 또한 참조무결성을 위해 외래키 제약 조건 준다
이렇게 배웠습니다.
테이블간 관계 정의 다 되어 있고, 어떤키를 외래키로 사용하는지 등도 다 정의는 되어있지만...
제약조건을 거는 경우를 한번도 보지 못하였습니다.
왜그런가요?
성별 컬럼의 값은 항상 남 또는 여 중 하나여야 한다.
전화번호 칼럼의 값은 숫자로만 이루어져야 하며, 0으로 시작해야 한다.
이런 것도 제약조건이지만, 제약조건이 이런 것만 있는 건 아닙니다.
어떤 키를 외래키로 사용한다는 건 그 키가 다른 테이블에도 있어야 한다는 제약조건입니다.
일단 서비스나 데이터의 특성마다 다르기 때문에 각각의 상황에 맞춰서 해야 합니다.
일반적으로만 말씀드리면, DB단에서도 외래키(foreign key)는 걸어주는게 좋습니다. 애플리케이션단에서 코드로 잘못된 데이터가 들어가지 못하도록 막아주기는 하지만, DB에서 막는게 질문자님께서 말씀하신 것처럼 데이터 정합성이 확실히 보장되니까요.
단, FK가 있으면 데이터를 Insert/Update할 때 이를 체크하게 되는데, 데이터의 양이 매우 많은 상황에서는(Row가 몇억 단위) 이게 성능에 영향을 미치게 되는 경우가 발생할 수 있습니다. 그래서 이런 이유 때문에 쓰지 않는 경우도 있어요.
실제 사용하고있는 운영하는곳 사이트나 영업정보시스템은 테이블이 변경이 이라던지 수정요청에 자주 발생하기 때문에
연관을 맺어버리면 특정 테이블의 alter라든지 변경으로인한 영향도가 너무크므로 제약조건을 안하는 경우가 매우가 많습니다.