목차

옮긴이의 글
한국어판 지은이의 글

<b>1장 개요</b>
 1.1 대상 독자
 1.2 이 책에 있는 내용
 1.3 이 책에 없는 내용
 1.4 일러두기
 1.5 예제 데이터베이스
 1.6 감사의 글

<b>2장 무단횡단</b>
 2.1 목표: 다중 값 속성 저장
 2.2 안티패턴: 쉼표로 구분된 목록에 저장
 2.3 안티패턴 인식 방법
 2.4 안티패턴 사용이 합당한 경우
 2.5 해법: 교차 테이블 생성

<b>3장 순진한 트리</b>
 3.1 목표: 계층구조 저장 및 조회하기
 3.2 안티패턴: 항상 부모에 의존하기
 3.3 안티패턴 인식 방법
 3.4 안티패턴 사용이 합당한 경우
 3.5 해법: 대안 트리 모델 사용

<b>4장 아이디가 필요해</b>
 4.1 목표: PK 관례 확립
 4.2 안티패턴: 만능키
 4.3 안티패턴 인식 방법
 4.4 안티패턴 사용이 합당한 경우
 4.5 해법: 상황에 맞추기

<b>5장 키가 없는 엔트리</b>
 5.1 목표: 데이터베이스 아키텍처 단순화
 5.2 안티패턴: 제약조건 무시
 5.3 안티패턴 인식 방법
 5.4 안티패턴 사용이 합당한 경우
 5.5 해법: 제약조건 선언하기

<b>6장 엔터티-속성-값</b>
 6.1 목표: 가변 속성 지원
 6.2 안티패턴: 범용 속성 테이블 사용
 6.3 안티패턴 인식 방법
 6.4 안티패턴 사용이 합당한 경우
 6.5 해법: 서브타입 모델링

<b>7장 다형성 연관</b>
 7.1 목표: 여러 부모 참조
 7.2 안티패턴: 이중 목적의 FK 사용
 7.3 안티패턴 인식 방법
 7.4 안티패턴 사용이 합당한 경우
 7.5 해법: 관계 단순화

<b>8장 다중 칼럼 속성</b>
 8.1 목표: 다중 값 속성 저장
 8.2 안티패턴: 여러 개의 칼럼 생성
 8.3 안티패턴 인식 방법
 8.4 안티패턴 사용이 합당한 경우
 8.5 해법: 종속 테이블 생성

<b>9장 메타데이터 트리블</b>
 9.1 목표: 확장 적응성 지원
 9.2 안티패턴: 테이블 또는 칼럼 복제
 9.3 안티패턴 인식 방법
 9.4 안티패턴 사용이 합당한 경우
 9.5 해법: 파티션과 정규화

<b>10장 반올림 오류</B>
 10.1 목표: 정수 대신 소수 사용
 10.2 안티패턴: FLOAT 데이터 타입 사용
 10.3 안티패턴 인식 방법
 10.4 안티패턴 사용이 합당한 경우
 10.5 해법: NUMERIC 데이터 타입 사용

<b>11장 31가지 맛</b>
 11.1 목표: 칼럼을 특정 값으로 제한하기
 11.2 안티패턴: 칼럼 정의에 값 지정.
 11.3 안티패턴 인식 방법
 11.4 안티패턴 사용이 합당한 경우
 11.5 해법: 데이터로 값을 지정하기

<b>12장 유령 파일</b>
 12.1 목표: 이미지 또는 벌크 미디어 저장
 12.2 안티패턴: 파일을 사용해야 한다고 가정한다
 12.3 안티패턴 인식 방법
 12.4 안티패턴 사용이 합당한 경우
 12.5 해법: 필요한 경우에는 BLOB 데이터 타입을 사용하라

<b>13장 인덱스 샷건</B>
 13.1 목표: 성능 최적화
 13.2 안티패턴: 무계획하게 인덱스 사용하기
 13.3 안티패턴을 인식하는 방법
 13.4 안티패턴 사용이 합당한 경우
 13.5 해법: 인덱스를 MENTOR하라

<b>14장 모르는 것에 대한 두려움</b>
 14.1 목표: 누락된 값을 구분하기
 14.2 안티패턴: NULL을 일반 값처럼 사용
 14.3 안티패턴 인식 방법
 14.4 안티패턴 사용이 합당한 경우
 14.5 해법: 유일한 값으로 NULL을 사용하라

<b>15장 애매한 그룹</b>
 15.1 목표: 그룹당 최댓값을 가진 행 얻기
 15.2 안티패턴: 그룹되지 않은 칼럼 참조
 15.3 안티패턴 인식 방법
 15.4 안티패턴 사용이 합당한 경우
 15.5 해법: 칼럼을 모호하게 사용하지 않기

<b>16장 임의의 선택</b>
 16.1 목표: 샘플 행 가져오기
 16.2 안티패턴: 데이터를 임의로 정렬하기
 16.3 안티패턴 인식 방법
 16.4 안티패턴 사용이 합당한 경우
 16.5 해법: In No Particular Order

<b>17장 가난한 자의 검색 엔진</b>
 17.1 목표: 전체 텍스트 검색
 17.2 안티패턴: 패턴 매칭 사용
 17.3 안티패턴 인식 방법
 17.4 안티패턴 사용이 합당한 경우
 17.5 해법: 작업에 맞는 올바른 도구 사용하기

<b>18장 스파게티 쿼리</b>
 18.1 목표: SQL 쿼리 줄이기
 18.2 안티패턴: 복잡한 문제를 한 번에 풀기
 18.3 안티패턴 인식 방법
 18.4 안티패턴 사용이 합당한 경우
 18.5 해법: 분할해서 정복하기

<b>19장 암묵적 칼럼</b>
 19.1 목표: 타이핑 줄이기
 19.2 안티패턴: 지름길만 좋아하면 길을 잃는다
 19.3 안티패턴 인식 방법
 19.4 안티패턴 사용이 합당한 경우
 19.5 해법: 명시적으로 칼럼 이름 지정하기

<b>20장 읽을 수 있는 패스워드</b>
 20.1 목표: 패스워드를 복구하거나 재설정하기
 20.2 안티패턴: 패스워드를 평문으로 저장하기
 20.3 안티패턴 인식 방법
 20.4 안티패턴 사용이 합당한 경우
 20.5 해법: 패스워드의 소금 친 해시

<b>21장 SQL 인젝션</b>
 21.1 목표: 동적 SQL 쿼리 작성하기
 21.2 안티패턴: 검증되지 않은 입력을 코드로 실행하기
 21.3 안티패턴 인식 방법
 21.4 안티패턴 사용이 합당한 경우
 21.5 해법: 아무도 믿지 마라

<b>22장 가상키 편집증</b>
 22.1 목표: 데이터 정돈하기
 22.2 안티패턴: 모든 틈 메우기
 22.3 안티패턴 인식 방법
 22.4 안티패턴 사용이 합당한 경우
 22.5 해법: 극복하라

<B>23장 나쁜 것 안 보기</B>
 23.1 목표: 코드를 적게 작성하기
 23.2 안티패턴: 짚 없이 벽돌 만들기
 23.3 안티패턴 인식 방법
 23.4 안티패턴 사용이 합당한 경우
 23.5 해법: 에러에서 우아하게 복구하기

<b>24장 외교적 면책특권</b>
 24.1 목표: 관례 따르기
 24.2 안티패턴: SQL을 2등 시민으로 만들기
 24.3 안티패턴 인식 방법
 24.4 안티패턴 사용이 합당한 경우
 24.5 해법: 초당적 품질 문화 확립

<b>25장 마법의 콩</b>
 25.1 목표: MVC에서 모델 단순화하기
 25.2 안티패턴: 액티브 레코드인 모델
 25.3 안티패턴을 인식하는 방법
 25.4 안티패턴 사용이 합당한 경우
 25.5 해법: 액티브 레코드를 가지는 모델

<B>부록 A 정규화 규칙</b>
 A.1 관계형의 뜻
 A.2 정규화에 대한 미신
 A.3 정규화란?
 A.4 상식

<b>부록 B 참고문헌</b>