데이터베이스는 최소한의 중복을 지향한다. 하지만 아직까지도 중복된 속성을 Primary Key로 사용하는 곳이 많이 있다. 예를 들면 '상품번호 + 주문일 + 일련번호'와 같은 주문번호가 그것이다. 문자열로 표현하면 '099-871023-0891'과 같은 형태일 것이다. 문자열로 15Btye를 사용해야 한다. 그래서 어떤 개발자는 다음과 같은 생각을 할 수도 있을 것이다.
- 상품은 200개다. 주문일은 'YYMMDD'형식이다. 각 상품당 최고 재고량은 999999이다. 하루 주문 건수는 최대 50만 건 정도다.
- 상품: 1Byte, 주문일: 3Byte[* YY, MM, DD 각 1Byte], 일련번호: 3Byte
- 주문번호를 7Byte로 만들면 주문테이블에 어떤 상품이 언제 또는 어떤 기간에 몇 개나 팔렸는지 주문번호 1개로 모두 알아낼 수 있을꺼야!
- 그러므로 주문테이블의 상품번호, 주문일 컬럼은 삭제해도 되겠다.
- 아싸! 난 천재야!
* 날짜의 경우 bit단위로 연산을 하면 더 줄일 수 있다.DD(5bit), MM(4bit), YY(7bit) = 15bit 이므로 16bit를 사용한다고 하면 2byte면 된다.
아마도 처음에는 뿌듯해 할 것이다. 하지만 시간이 지날수록 원인도 모른채 주문 테이블에 쌓여가는 Row수 만큼 사용자들의 불만도 쌓일 것이다. 이것이 여러분이 복잡하게 여러 의미를 내포하고 있는 '주문코드'나 '부서코드'의 역사적 배경이다. 어떤 경우는 주문코드만 봐도 어떤 매장에서 어떤 상품이 주문되었는지 알 수 있으므로 매우 의미있다고 할 수 있을 것이다. 하지만 이것은 오로지 '너'만 아는 것이다. 쉽지 않은 것은 데이터베이스에서는 '악'이다. (나도 계속 악행을 일삼고 있지만..)