데이터베이스
테이블을 어떻게 나눌지, 나눈 데이터를 어떻게 다시 꺼낼지에 대한 기록입니다. 정규화는 정의를 외우는 것보다 어떤 이상현상을 막으려고 그 규칙이 생겼는지를 따라가는 편이 이해가 빨랐습니다. 쿼리 쪽은 널리 알려진 통념이 실제 실행 계획과 맞는지 직접 실행해 확인한 글이 많습니다. MySQL, MariaDB, Oracle을 다룹니다.
14개의 글
-
데이터베이스 정규화 (9): 정규화 절차와 역정규화, 나눈 뒤에 되돌리는 선택
1편부터 8편까지의 정규화를 한 절차로 모읍니다. 각 단계가 어떤 종속을 찾아 어떻게 나누는지, 어디서 멈추는지, 그리고 나눈 테이블에 중복을 다시 넣는 역정규화가 정규화하지 않은 상태와 무엇이 다른지를 MariaDB에서 확인한 갱신 이상과 함께 다룹니다.
-
VARCHAR를 255자 넘게 잡으면 느려질까?
컬럼 길이를 100자에서 1000자로 늘려 달라는 요청에 "255자를 넘기면 성능이 달라진다"는 말이 나왔습니다. MariaDB 11.4.2에서 재 보니 255는 글자가 아니라 바이트에 붙은 숫자였고, 실행 시간을 가르는 선은 메모리 임시 테이블이 감당하는 512자에 있었습니다.
-
데이터베이스 정규화 (8): 제4정규형과 제5정규형, 함수적 종속 너머의 중복
BCNF를 만족하는 테이블에도 중복이 남습니다. 함수적 종속으로는 설명되지 않는 그 중복의 이름인 다치 종속과 조인 종속, 자명한 종속을 조건에서 빼는 이유, 제4정규형과 제5정규형의 정의와 분해 절차, 그리고 도메인키 정규형과 제6정규형까지 정리합니다.
-
데이터베이스 정규화 (7): 자연키와 대리키, 무엇을 기본키로 삼을 것인가
자연키와 대리키(surrogate key)를 다룹니다. 용어의 출발과 Codd가 1979년에 지적한 자연키의 세 가지 문제, 두 방식의 장단점, JPA에서 자연키를 어디에 적어야 하는지, 그리고 자연키가 없으면 정규화를 못 한다는 오해까지 정리합니다.
-
collation이 뭐길래 조인만 실패할까?
이력 테이블을 코드 테이블과 조인하지 못해 데이터팀 작업이 막혔습니다. 원인은 collation 불일치였습니다. collation이 문자 집합과 무엇이 다른지, 왜 컬럼끼리 비교할 때만 Illegal mix of collations가 나는지, 그리고 한국어와 코드 값을 다루는 곳에서 utf8mb4_general_ci를 컨벤션으로 두면 무엇이 나은지 정리했습니다.
-
집계용 중간 결과 테이블을 Global Temporary Table로 바꾸기
집계 중간 결과를 일반 테이블 하나에 담고 매 실행 앞에서 DELETE로 비우면 비용이 세 군데서 나옵니다. Global Temporary Table이 그중 무엇을 없애고, redo 감소는 왜 조건부인지 Oracle 12c 문서를 근거로 정리합니다.
-
버스 노선 공간 데이터에서 정류장 간 구간 형상 만들기 (Linear Referencing)
버스 노선의 선형과 정류장 좌표로 정류장 간 구간 형상을 만드는 과정을 설명합니다. Linear Referencing으로 정류장을 Measure로 바꾸고 두 Measure 사이를 추출합니다.
-
억울한 EXISTS, 정말 IN보다 느릴까?
EXISTS를 IN으로 바꾸면 빨라진다는 통념을 따져봅니다. 성능 개선과 원인 입증은 다른 문제라는 것, 그리고 동등한 서브쿼리 IN과 EXISTS가 현대 MySQL에서 같은 최적화 후보가 되는 것을 로컬 실측으로 확인합니다.
-
데이터베이스 정규화 (6): 보이스-코드 정규형(BCNF), 모든 결정자를 후보키로
보이스-코드 정규형(BCNF)을 다룹니다. 3NF가 남긴 빈틈, 모든 결정자가 후보키여야 한다는 조건, 후보키가 겹치는 구조에서 생기는 중복을 예시와 함께 정리합니다.
-
데이터베이스 정규화 (5): 제3정규형(3NF), 이행적 함수적 종속 제거
제3정규형(3NF)을 다룹니다. 이행적 함수적 종속의 의미, Codd의 1971년 원문 정의, 그리고 키가 아닌 속성을 거쳐 생기는 중복을 제거하는 방법을 예시와 함께 정리합니다.
-
데이터베이스 정규화 (4): 제2정규형(2NF), 함수적 종속과 부분 함수적 종속 제거
제2정규형(2NF)을 다룹니다. 2NF의 토대인 함수적 종속성을 완전 함수적 종속, 부분 함수적 종속으로 나누어 설명하고, 복합키에서 생기는 부분 함수적 종속을 어떻게 제거하는지 예시와 함께 정리합니다.
-
데이터베이스 정규화 (3): 제1정규형(1NF), 원자값과 반복 그룹
제1정규형(1NF)을 자세히 다룹니다. 원자값의 의미와 흔한 오해, 반복 그룹을 분리하는 방법, 그리고 1NF가 아직 보장하지 못하는 것까지 예시와 함께 정리합니다.
-
데이터베이스 정규화 (2): 이상현상과 함수적 종속성, 왜 정규화가 필요한가
삽입, 갱신, 삭제 이상현상을 예시로 설명하고 MariaDB에서 직접 재현해, 데이터베이스가 막아주는 이상현상과 조용히 지나가는 이상현상을 구분합니다. 세 단계 분류를 컬럼 세 개에 저장한 실제 계약 테이블에서 갱신 이상이 어떻게 해마다 복제됐는지도 함께 다룹니다.
-
데이터베이스 정규화 (1): 정규화 전에, 데이터 무결성과 키부터
정규화를 둘러싼 흔한 오해 세 가지에서 출발해, 정규형에 들어가기 전 토대가 되는 개념을 정리합니다. 데이터 무결성의 종류(개체, 참조, 도메인)와 키의 계층(슈퍼키, 후보키, 자연키, 대리키), 그리고 키가 제약조건으로 동작하는 방식을 설명합니다.