관계형 데이터 베이스는 많이 사용되고 있지만 객체지향 프로그래밍과의 불일치로 인한 문제가 계속 거론됐다.
객체 지향 프로그래밍(Object-Oriented Programming, OOP)과 관계형 데이터 베이스 관리 시스템(Relational Database Management System, RDBMS)의 데이터 표현 방식과 처리 방식의 차이로 인해 발생되는 문제를 의미한다.
예를 들면, OOP에서는 데이터를 객체로 표현하고 객체는 속성(field)과 동작(methods)을 포함한다. 객체간에는 서로 계층적이고 연관성을 가진다.
반면 RDBMS에서는 데이터를 테이블로 표현하며 테이블 간의 관계를 키로 연결하고 정규화된 형태로 저장된다.
이러한 특징으로 인해 다음과 같은 차이가 발생한다.
OOP에서는 데이터를 객체로 표현하며 객체는 속성과 메서드를 포함하고 있지만 RDBMS에서는 데이터를 테이블 형식으로 저장하며, 행과 열로 구성되어있기 때문에 데이터 베이스와 주고 받을 때 복잡한 매핑 처리가 필요하다.
객체의 상속을 통해 다른 객체로 확장하여 사용하지만 RDBMS에서는 복제하거나 확장할 수 없다.
1번에서와 마찬가지로 객체의 상속 구조를 단일 테이블이나 조인된 테이블로 표현하지만 그만큼 복잡성이 증가한다.
CREATE TABLE productTypes (
ProductTypeUuid VARCHAR(32) PRIMARY KEY,
ProductTypeName VARCHAR(255) NOT NULL UNIQUE
);
CREATE TABLE products (
ProductUuid VARCHAR(32) PRIMARY KEY,
ProductName VARCHAR(255) NOT NULL UNIQUE,
ProductType VARCHAR(32) NOT NULL,
FOREIGN KEY (ProductType) REFERENCES productTypes(ProductTypeUuid) ON DELETE CASCADE
);
이러한 테이블 구조에서 제품(products)은 제품 유형(productTypes)을 참조하고 있다.
객체 지향 코드에서는 이러한 관계를 객체간의 참조로 직접 표현할 수 있지만, 관계형 데이터 베이스에서는 외래키와 JSON 연산을 통해 이러한 관계를 지어야 한다.
객체는 상태를 메모리에 유지하지만 RDBMS는 영속성(persistence)을 관리하기 때문에 동기화하는 과정에서 불일치가 생길 수 있다.
간단하게 어쩔 수 없는 차이라고만 생각하는 것이 아니라 이러한 차이로 극복하기 위해 내가 수정해야할 코드나 생각해야할 부분은 무엇인가 생각해야한다.
폴더 구조도 기계적으로 만들고 있지 않은지, 데이터 베이스의 테이블 구조를 복잡하게 만들고 있지 않은지 검토해야한다.