MySQL 애호가가 PostgreSQL을 추천하는 이유: 애플리케이션 구현 편의성
저자는 MySQL을 오랫동안 사용했지만, 현재는 PostgreSQL을 새로운 프로젝트에 추천
MySQL 8의 기능 개선에도 불구하고, PostgreSQL의 ON CONFLICT DO NOTHING, RETURNING, VALUES 등의 기능이 애플리케이션 구현을 더 쉽게 만듦
부분 인덱스(Partial Indexes), 외래키(Foreign Keys), pgvector 등 PostgreSQL의 강력한 기능은 MySQL에 비해 명확한 이점 제공
관리형 서비스(Managed Services) 환경에서 PostgreSQL의 단점이 줄어들고, MySQL 8의 개선에도 불구하고 PostgreSQL의 장점이 부각됨
ON CONFLICT DO NOTHING vs INSERT IGNORE
본문에 따르면 MySQL의 INSERT IGNORE는 중복을 무시하는 데 특화된 기능이 아니므로, ON CONFLICT DO NOTHING(ON CONFLICT DO NOTHING)과 같은 명확성을 제공하지 못한다.
ON CONFLICT DO NOTHING: 고유 제약 조건(Unique Constraint) 위반 시 삽입을 명시적으로 방지하여 코드 가독성(Code Readability) 향상
INSERT IGNORE: 오류를 경고로 처리하여 예상치 못한 데이터 삽입(Unintended Data Insertion)을 허용
이러한 차이는 코드 검토(Code Review) 및 잠재적 오류 방지 측면에서 PostgreSQL이 유리하다.
RETURNING 절의 강력함
저자는 PostgreSQL의 RETURNING 절을 통해 삽입/수정/삭제 후 변경된 결과를 즉시 반환할 수 있다는 점을 강조한다.
LAST_INSERT_ID(): AUTO_INCREMENT ID만 반환하여 다양한 컬럼(Column) 반환 및 복잡한 데이터 처리(Complex Data Handling)에 한계
RETURNING: 삽입된 ID, 기본값(Default Values), 생성된 컬럼(Generated Columns)을 포함한 전체 행(Row) 반환 가능
활용 사례: UUID(UUID) 기반 PK 사용, API 응답(API Response)으로 전체 행 반환, 업서트(Upsert) 결과 직접 반환
결과적으로 RETURNING은 애플리케이션 구현 방식을 근본적으로 변화시킨다.
VALUES 절의 유연성
PostgreSQL의 VALUES 절은 작은 상수 테이블(Constant Table)을 즉석에서 생성하고, 이를 JOIN 또는 UPDATE에 직접 연결하는 방식으로 활용된다.
UPDATE ... FROM: 애플리케이션에서 받은 값을 기반으로 업데이트 처리(Update Processing)를 간결하게 구현
JOIN 활용: 애플리케이션에서 받은 값을 JOIN 타겟(Join Target)으로 활용하여 데이터 처리 유연성(Data Processing Flexibility) 확보
MySQL 8.0.19 이후 VALUES 지원: ROW()를 사용하고, 컬럼명(Column Name)이 자동 생성되어 가독성(Readability) 저하
PostgreSQL은 자연스러운 컬럼명(Column Name)을 부여하여 구현 편의성(Implementation Convenience)을 높인다.
부분 인덱스(Partial Indexes)의 차별점
저자는 PostgreSQL의 부분 인덱스가 MySQL에 비해 명확한 기능적 차이를 제공한다고 설명한다.
부분 인덱스: 특정 조건(WHERE 절)을 만족하는 행에만 인덱스를 생성하여 인덱스 크기(Index Size) 및 업데이트 비용(Update Cost) 절감
MySQL의 생성된 컬럼(Generated Columns) 또는 함수 기반 인덱스(Functional Indexes): 모든 행에 대해 표현식을 평가하고 인덱싱하므로 의도(Intent)의 명확성 부족
활용 사례: 소프트 삭제(Soft Delete) 패턴에서 활성 사용자(Active Users)에 대한 검색 성능 향상
결과적으로 부분 인덱스는 데이터베이스 성능 최적화(Database Performance Optimization)와 유지보수성(Maintainability)을 동시에 개선한다.
외래키(Foreign Keys)의 성숙도
저자는 PostgreSQL의 외래키가 테스트, 마이그레이션, 데이터 로딩(Data Loading) 과정에서 더 나은 유연성을 제공한다고 강조한다.
DEFERRABLE 제약 조건: 트랜잭션(Transaction) 종료 시점까지 제약 조건 검사 연기 가능
MySQL: NO ACTION(RESTRICT)만 지원하여 데이터 로딩 및 마이그레이션(Migration) 과정에서 제약 조건 위반 문제 발생 가능성 증가
테스트 용이성: PostgreSQL은 테스트 코드(Test Code)에서 외래키 제약 조건(Foreign Key Constraint)을 유지하면서 데이터 삽입 순서(Data Insertion Order)를 유연하게 관리
결론적으로 PostgreSQL의 외래키는 데이터 무결성(Data Integrity)을 유지하면서 개발 생산성(Development Productivity)을 향상시킨다.