[SQL] 외래키를 안 쓰는 3가지 이유

제가 일하는 회사도 그렇고 여러 프로젝트를 보면 대부분 외래키를 사용하지 않습니다.
분명 관계형 데이터베이스를 사용하는 이유는 데이터 간의 관계를 통해
사용자에게 의미있는 데이터를 서비스하기 위함일텐데 왜 외래키를 사용하지 않을까요?
외래키를 이용해 연관된 데이터를 일괄 업데이트 하는 등 좋을 것 같은데 말이죠.
회사에서의 경험과 커뮤니티 사이트의 내용을 종합해 뽑아본 세 가지 이유를 살펴보겠습니다.

1. 데이터베이스 설계 수정 시 발생하는 업무 로드와 휴먼 에러

대부분의 경우 설계 단계에서 완벽한 데이터베이스 설계를 완성하는 것은 굉장히 어렵습니다.
최초 설계 후 개발 중 더 좋은 설계가 나오기도 하고, 개발이 불가능한 경우도 있습니다.
이 때, 외래키가 걸려있는 컬럼을 지우거나, 테이블을 지우거나,
새로운 관계가 생기거나 혹은 새로운 더미 데이터를 삽입하는 경우가 있는데,
이 경우 참조 무결성 제약조건으로 인해 원하는대로 동작하지 않을 수 있습니다.

  • 참조 무결성 제약조건 : 외래키는 참조되는 부모의 기본키 또는 후보키와 쌍으로 존재해야 한다

물론! 데이터베이스 설계를 잘 이해하고 있다면 일어나지 않겠지만, 아무래도 쉽지 않죠.
결국 개발자가 데이터베이스 설계를 다시 이해하는 시간과 그에 맞게 질의를 다시 개발하는 시간이 추가됩니다.

사실 저도 이 내용은 머리로는 이해가 잘 되지 않긴 합니다만… 가슴으로는 참 이해가 잘 됩니다.
아무래도 사람이 하는 이상 어쩔 수 없죠
특히 DBA와 소프트웨어 개발자는 보통 다른 사람이기 때문에
관련 내용 전파가 안 되거나 서로 이해한 내용이 다르다면 충분히 발생 가능합니다.

  • DBA : 데이터베이스 관리자를 말합니다.

2. 질의 실행 계획 예측 불가

DBA나 개발자는 작성한 질의가 어느 정도 시간동안 실행될 지 예측하고 싶어하고, 예측해야 합니다.
트랜잭션 관리 측면이나, 성능 관리 등 여러가지 이유로 말이죠.

이런 경우를 상상해봅시다.
부모 데이터를 한 줄 날렸을 때 연관되는 자식 테이블의 데이터들이 어마어마하게 많이 삭제되는 경우,
질의 실행 전에 데이터의 lock을 걸어야 할 지, 어느 정도의 시간동안 실행될 지 예측이 가능할까요?
  • lock : 데이터베이스 동시성을 위해 데이터와 DB 오브젝트에 접근을 제한하거나 공유하는 것

아무래도 쉽지 않을 것입니다.
동시에 여러 사람에게 서비스해야하는 데이터베이스의 동시성을 위해서는
트랜잭션을 잘게 나누고, lock을 최소화하고 싶을텐데, 여러모로 도움이 안 됩니다.

이를 해결하기 위해 데이터 접근 로직을 자식부터 접근하도록 하는 등 참 피곤한 개발을 하게 됩니다.

3. 비즈니스 로직의 구현 위치

사실 데이터베이스의 관계도 비즈니스 로직의 일부입니다.
비즈니스 로직을 모델링 하다보니 데이터베이스의 관계가 발생한다는 것이죠.
다시 생각해보면 관계는 논리적 스키마 관점에 존재하는 것이지 물리적 스키마 개념일 필요는 없다는 것입니다.
(이 부분은 좀 더 생각해봐야겠지만, 저는 일부 동의합니다.)

개발 패턴을 적용하여 만들어진 프로젝트는 모두 비즈니스 로직을 처리하도록 정해진 위치가 있습니다.
MVC의 M, spring의 business layer처럼 말이죠.
이 비즈니스 로직 구현 위치에서 데이터베이스의 관계를 잘 구현면
아무래도 좀 더 유연하게 관계를 맺을 수 있고, 개발자가 DBA의 협조 없이 쉽게 관계를 맺고 끊을 수 있게 되죠.

물론 어플리케이션을 통하지 않고 직접 DB의 데이터를 수정하게 된다면
연관된 데이터를 찾아 수정하는 것은 개발자의 몫이 됩니다!

하지만 이를 감수하더라도 소스에서 데이터베이스의 관계를 구현하는 것이 훨씬 편한 것이 사실입니다.
아무래도 DBA는 싫어할지도 모르지만요!

정리

위 세 가지 이유를 제외하고도, 인덱스나 UPDATE, DELETE에서의 성능저하와 같은 이유도 있습니다.
하지만 DBA의 입장에서는 정합성과 무결성 측면에서 외래키는 분명 필요한 기능이 맞습니다.
완벽한 설계와 완벽한 정규화를 바탕으로, 앞으로 설계의 변경이 별로 없는 프로그램이라면
외래키는 유지보수 측면에서 굉장히 편리한 기능으로 활용할 수 있을 것 입니다.

하지만 그게 아니라면…. 굳이?! 라는 것이 제 결론입니다.

적다보니 아무래도 어렵고 재미없는 글이 되어버린 것 같은데, 분명 생각해볼만한 주제인 것 같습니다!
다들 내 서버는 어떤 지, 왜 필요/불필요할까 생각해보는 시간을 가지면 좋겠습니다.


참고사이트

카테고리:

업데이트:

댓글남기기