データベース設計:正規化の背反

RDBMSの論理設計の基本の概念は正規化であり、それは『データ整合性を保持する』ために行っている。一方で正規化による背反として、『SQLのパフォーマンス劣化』を引き起こす。

正規化を行うと基本的にテーブルが増えていく。よって、SQL文を実行する際には、結合(JOIN)が必要になるが、この結合がSQL文の処理としては高コストなものになるため、多用するとSQL文の速度が悪化する。

その対処法に非正規化があるが、『正規化によるデータ整合性』と『非正規化による検索パフォーマンス』はトレードオフの関係のため、最良策にはならない。

『じゃあ、どうするの🤔』ってことだけど、原則として非正規化は許さないという立場で良いとのこと。他の手段によってパフォーマンスの向上が図れないかを、最後の最後まで検討し、それでもダメなら非正規化を行う。その時にも可能な限り高次元の正規化をするということが大事らしい。

それくらいデータベースにとって整合性は大事という知見の表れなのだと感じた😅まぁ、確かに非正規化を行うとデータが冗長になることでデータ更新時などに不整合が起きやすくなってしまうし、冗長データの同期タイミングなど色々考慮しなきゃいけなくなってしまう。

参考