각 사실은 한 자리에만
Normalization은 데이터를 여러 테이블로 쪼개서 사실 하나가 딱 한 번만 저장되게 만드는 일이야. 반대쪽인 denormalized 데이터는 같은 사실을 여러 row에 복사해두니까, 뭘 고칠 때마다 사본을 전부 찾아 바꿔야 해.
blog post와 author를 두 방식으로 놓고 비교해보자.
- Denormalized —
posts테이블에author_name,author_email,author_bio가 직접 들어가. Alice가 글을 100개 썼으면 그 정보가 100번 저장돼. 이메일을 바꾸려면 row 100개를 건드려야 하고, 하나라도 빠뜨리면 데이터가 어긋나. - Normalized —
posts에는author_idFK만 두고authors테이블에 author마다 row 하나를 둬. 이메일 바꾸기는 row 하나 고치면 끝이야.
Normalization의 대가는 join이야. 다음 lesson들에서 실컷 보게 될 거고. Denormalization의 대가는 업데이트가 어긋나는 사고와 낭비되는 저장 공간이지. 앱 데이터는 대개 먼저 normalize하고, read 쪽 병목을 실제로 측정한 다음에만 골라서 denormalize해.
Principle: write를 위해 normalize하고, read를 위해 denormalize해. 단 측정한 뒤에만. SQLite 앱에서 미리 denormalize해둔 건 대개 query 시간을 아낀 것보다 update 버그 값이 더 비싸게 나와.