지금은 서버나 클라이언트나 예전에 비해 엄청난 발전을 이루었다. 그래서 조금 잘못되고, 어플리케이션의 성능이 최선은 고사하고 좀 떨어지더라도 하드웨어의 성능이 많은 것을 메꾸어준다. 물론 그마저 사용자가 많아지면 - 흔히 말해서 임계점을 돌파하면 소프트웨어의 성능을 개선하지 않으면 해결되진 않지만 말이다. 하지만 이런 정도의 문제는 개발단계에서 테스트되지 않으므로 개발업체는 그대로 빠지고, 후에 유지보수를 맞는쪽에서 피박을 쓰게 되지만 말이다.
뭐, 오늘 하려는 말은 다름이 아니라 DB 어플리케이션의 가장 기본이 될수 있는 ERD이다. ERD를 그릴때 쉽게 범하는 실수중에 하나는 될 것 같으니깐 하는거다. 그리고, 이렇게 하면 개발이 더 쉬울 것이라고 쉽게 지레짐작하는 것이다. 지금은 어떤 이유로 사라져버린 포스팅에서 잠깐 언급했었지만, 쉽게 생각되는 꼼수는 나중에 두배 세배의 손품/발품/머리품을 팔아야 한다는 것을 명심해야 한다. 그리고 생각하기 쉬운 꼼수하나는 바로 PK의 선정을 무조건 적게 하려는 것이다.
물론 너무 많은 PK컬럼이 선정된다면 정규화나 아키텍쳐 부분에서 잘못된 것이 없는지 고민해야 한다.
여기 개발자 A씨가 있다. A씨는 3-5개정도의 PK 컬럼을 JOIN 해서 사용하는 것에 대해 불만스럽다 그래서 고안해내는 것이 Oracle Object인 SEQUENCE이다. 일련번호는 그 자체로 UNIQUE하므로 PK 및 UNIQUE Key의 역할을 충분히 해낼수 있다. 그래서 부모테이블에 SEQUENCE를 KEY로 활용하고 자식테이블에 그 KEY를 물려줄 생각을 하게 된다. 이로써 A씨는 JOIN은 한컬럼만 하고서도 충분히 구현할 수 있다고 믿었다.
A씨는 그 두개의 테이블에서 데이터를 조회하며, 충분히 만족했다. (본인의 생각에는)필요없이 많은 컬럼을 조인하지 않고도 충분히 원하는 결과를 이끌어 낼수 있었던 것이다. 그러나 A씨는 UPDATE문을 작성하면서, 해당데이터가 있는지 두건 이상 존재할수도 있다는 사실에 에러처리를 해야했다(PK에서 당연히 해줘야할 중복에러를 SEQUENCE로는 해결할 수 없으므로). INSERT를 하면서도 기존에 "실제" KEY가 있지는 않은지 체크해서 있으면 UPDATE로직으로 돌려야 했다. 원래대로라면 ORACLE의 Constraints로 해결되어야 할 문제들을 본인이 짠 로직으로 작성해야 하기 시작한 것이다. 또 DELETE문을 처리하면서 자식테이블에는 부모의 "실제" KEY가 없는 관계로 항상 부모테이블을 뒤져서 자식테이블의 부모 SEQUENCE를 찾아내야했다.
관계된 테이블의 두개일 경우 이문제는 견딜만 했다. 하지만 관계된 테이블이 3개 4개로 되면 될수록 3중 4중으로 코드량이 늘어났다.
그리고 A씨는 개발이 완료된 이후, 데이터를 마이그레이션하면서 A씨는 상심에 빠졌다. 자식테이블에 SEQUENCE로 부모의 값을 집어넣다보니 마이그레이션이 제대로 되었는지 검증하기가 어려워진 것이다. 자식테이블의 Identity를 확인하기 위해서는 항상 부모테이블을 뒤져야 했고 결국 이는 성능문제로 이어졌다.
SEQUENCE는 일련번호일 뿐이지 Identity가 아니다. 나를 숫자로 표현할 수 없듯이 테이블의 데이터도 단순한 일련번호로는 의미가 없다. 아, 물론 그렇게 처리해도 무방한 데이터가 있기도 하다. 하지만 대부분의 경우는 아니고, 다른 Key를 가지는게 훨씬 효율적일 것이다.
대부분의 개발에서 제일먼저 작성되는 것은 SELECT이고, 이를 위해 저런 생각을 하는 사람은 심심찮게 많다(진짜다). 하지만 이는 나중에 더 큰 비용을 치뤄야 한다. 꼭 자신은 아니라도 자신의 일을 물려받는 후배나, 다른 업체나 누구던지 그 문제로 더 많은 시간을 뺏기며 그렇게 설계를 한 당신을 욕하고 있을 것이다.
###원래는 적당한 그림을 추가하고 싶으나.. 귀찮은 관계로 그림은 나중에..;; ###