보통 외래키는 관계형 데이터베이스에서 무결성을 유지하기 위해서 사용합니다. 저는 테이블 간의 관계를 명시하기 위해서 사용하기도 하였습니다.
아직까지는 진행하는 프로젝트들이 규모가 작고 개인으로 하는 것들이 위주라서 주로 MySQL을 사용해왔습니다. mysql은 관계형 데이터베이스다보니 테이블의 개수가 많아지면 외래키를 사용하는 경우가 가끔 있었는데 외래키와 관련된 무결성 제약조건 때문에 애를 먹었던 적이 많았습니다.
얼마 전에 친구가 mysql 외래키에 대해서 물어봤을 때 다 까먹어서 제대로 대답하지 못했습니다. 그래서 자료를 찾다가 왜 외래키를 사용하는지 궁금해졌습니다. 그리고 흥미로운 사실을 알 수 있었습니다.
현업에서는 외래키를 잘 사용하지 않는다는 것이었습니다. 대부분 로직이 수시로 바뀌어서 프로그램이 바뀌면 무결성 때문에 DB의 구조도 바꿔야 되서 업무량이 엄청 늘어나기 때문이었습니다. 저도 웹 프로젝트를 진행하면서 미숙한 설계로 프로그램에 변동이 자주 있었는데 그 때마다 FK로 걸었던 참조 무결성이 가끔씩 오류를 터뜨려줘서 꽤나 고생했어서 공감이 되었습니다.
당연히 현업에서 DB를 논리적 설계 단계에서는 FK가 존재합니다만 그것을 실제로 DB에서 구현할 때에는 명시하지 않고 프로그램의 로직을 무결성을 유지하도록 짠다고 합니다. 그리고 JOIN 등을 이용하여 FK를 사용한 것과 같은 기능을 구현할 수 있다고 합니다.
이렇게 하는 이유는 현실적인 번거로움 뿐만 아니라 성능 개선의 측면도 있습니다. SELECT, DELETE를 할 때에는 상관 없지만 INSERT, UPDATE를 할 때 FK를 사용하면 약간 느려진다고 합니다.
하지만 결제 시스템과 같이 굉장히 중요한 데이터를 다룰 때에는 무결성을 유지하기 위해서 FK를 사용한다고 합니다. 즉, 상황에 따라 융통성있게 사용한다는 것이죠. 그리고 DB에서 무결성을 보장해주지 않는 대신 어플리케이션 단에서 확실히 처리를 해야할 것입니다.
사실 제가 진행하는 프로젝트는 규모가 그렇게 크지도 않고 성능 차이가 확 와닿을 정도로 데이터가 많은 것도 아니라서 FK를 사용할 생각이기는 합니다만... 왠만하면 중요한 테이블에만 달고 다른 것들에는 편의를 위해서 생략하지 않을까 생각합니다.
'데이터베이스' 카테고리의 다른 글
우분투 16.04 msyql 설치 및 utf-8 설정 (0) | 2016.12.20 |
---|---|
[데이터베이스] mysql join (0) | 2016.12.05 |
회복 다시 정리 (0) | 2016.11.29 |
트랜잭션과 회복 (0) | 2016.11.16 |