Java나 Python 같은 애플리케이션 코드는 상대적으로 수정하기 쉽다. 최신 프레임워크와 아키텍처 패턴 덕분에 기능 개선이나 코드 리팩토링이 과거보다 훨씬 유연해졌다. 하지만 데이터베이스 스키마, 즉 테이블의 구조는 한번 잘못 만들어지면 바로잡는 데 엄청난 비용과 시간이 소요된다.
'나쁜 설계'가 실제로 어떤 재앙을 불러오는지 구체적인 사례를 통해 알아보자.
이제 막 시작한 스타트업 '쇼핑몰'이 있다고 가정하자.
빠르게 서비스를 출시하기 위해 고객과 주문 정보를 관리하기 위해 다음과 같이 orders 테이블 하나에서 모든 정보를 관리하고 있다.
orders 테이블 구조
order_id : 주문 번호customer_id : 고객 아이디customer_name : 고객 이름customer_address : 고객 주소product_id : 상품 번호product_name : 상품 이름product_price : 상품 가격ordered_at : 주문 날짜겉보기에는 문제가 없어보인다. 지금부터 이 설계가 어떤 문제를 안고있는지 하나씩 살펴보자.
바로 데이터 무결성 훼손, 성능 저하, 그리고 유지 보수 비용 증가다.
1. 데이터 무결성 훼손 (신뢰도 하락)
2. 성능 저하
orders 테이블 전체를 뒤져야 한다. 고객 정보, 상품 정보, 주문 정보가 모두 한 테이블에 섞여 있으니 테이블이 '뚱뚱'해진다.3. 유지보수 비용 증가(확장성 저하)
orders 테이블에 customer_grade라는 컬럼을 추가해야 한다.고객은 주문을 할 수 있고, 주문에는 여러 개의 상품이 포함될 수 있다는 식의 관계를 그림으로 표현한다.CREATE TABLE ...)개념, 논리, 물리 각각의 설계 모델에서 사용하는 용어
| 구분 | 개념 모델 | 논리 모델 | 물리 모델 | 액셀 비유 | 쇼핑몰 예시 |
|---|---|---|---|---|---|
| 저장 구조 | 엔티티(Entity) | 릴레이션(Relation) | 테이블(Table) | 시트(Sheet) | 회원(user) |
| 세부 항목 | 속성(Attribute) | 속성(Attribute) | 열, 컬럼(Column) | 열(Column) | 회원의 이름, 주소 (user.name) |
| 데이터 단위 | 인스턴스(Instance) | 튜플(Tuple) | 행(Row, Record) | 행(Row) | '김병태'회원 |
각 모델링 단계마다 용어가 다른 이유는 각 단계가 가진 고유한 목표와 바라보는 관점이 다르기 때문이다.
참고:
릴레이션(Relation)
릴레이션은 관계형 데이터 베이스의 이론적 모델에서 '테이블(Table)'을 부르는 공식적인 이름이다.
릴레이션은 데이터가 저장되는 2차원 테이블 그 자체로 수학적 집합 개념을 의뜻한다.
관계형 데이터베이스는 '릴레이션(테이블)의 집합으로 구성된 데이터베이스'를 의미하며, 이 릴레이션들을 이용해 데이터간의 관계(Relationship)를 표현하는 것이다.