データベースのリファクタリングについての調査
掲題の通りに仕事で扱っているデータベース構造に問題があると考えていて、数万行のXMLやJSONが1フィールド、それが1レコードに複数カラム存在する状態になっている。
無駄なレコードは多い(参照されないデータが多すぎる)し、その影響でデータが肥大化して低速化の一因に、というか主たる原因になっている。
そこで、それらを見直すとともに、利用されていないテーブルなどが多数ある現状を改善できないか、ということで調査をする。
まずWiki。日本語文献が思ったよりも少なく、厳しそう。
JSONをMySQLで扱うことについて記述した記事。結構古いけど。
MySQLのアップデートに関して。
追加、非推奨項目
サイボウズにおける移行の動機と経過など
MySQL8系統のJSON関数を利用すれば、数万行のJSONをうまく扱えるかもしれない。
DBリファクタリングを調べる以前に、DB設計について勉強した方が良い気がしているので、とりあえず「達人に学ぶDB設計」を読む。
そもそもデータベースの設計原則に、現行のものは則っているのか。
以下、ミック著「達人に学ぶDB設計」を読んで学んだこと。
正規化
第1正規形
- 前述の書の言葉を借りれば、「1つのセルに、値が1つのみ含まれていること」
- また正規化の過程で、「(主)キーは一部であってもNULLを含んではならない(p 88より)」。
- キーフレーズ:「関数従属性」
第2正規形
- 完全関数従属であること。部分関数従属ではならない。
- つまり主キーに従属する列があると、部分関数従属になるので、第2正規化はそれを無くしテーブルを分割すること。
- キーフレーズ:「可逆性」
→テーブルなどの具体例を見ればわかるが、まだ「部分関数従属」などの言葉が腹落ちしていない。
第3正規形
- キーフレーズ:「推移的関数従属」
- つまり、関数従属が段階的になっていて、連鎖していること。
- やることは第2正規化と同じテーブルの分割。
- また同様にこちらも「無損失分解」になる
↑の書籍を読んだ結果、まずは第3正規化までを最低基準として実施しようとのことだった。それから、業務の中で非正規化も考慮するくらいの心構えだと良いみたい。
それから、実業務では各種アンチパターンやグレーゾーンに入るような手法も多数あるので、アンチパターンには正規化やテーブルの妥当な分割などを行うべき、だと。
そしてグレーゾーンにも当然トレードオフがあり、時にパフォーマンスへの重大な負担をかける可能性があるので、慎重に選択すべきとのこと。
有益そうなリンクを見つけた。
「達人に学ぶDB設計」の著者が執筆しているブログで、DB設計に関するおすすめの書籍を漁っていたら上記のサイトを発見した。
これをまず読む。
書籍の「詳解データベース」が良さそうだが、なにしろ高いのと翻訳の質に不安があるので、見送っている。
リファクタリングに限らず、アンチパターンを避けて、改善を続けることで品質の一部であるパフォーマンスも合わせて向上する。
パフォーマンスを改善することが、「より良い」実装につながると考える。
その際に参考になったのが、「達人が教える Webパフォーマンスチューニング」の、データベースに関する5章だ。
本書はLINEが主催するISUCONでの知見を踏まえた書籍で、Webアプリケーションのパフォーマンスチューニングに関して総合的に解説している。負荷試験、モニタリング、分析、改善について、具体的な実装を踏まえて解説されているのでとても参考になっている。
イミュータブルデータモデルについて学ぶ必要あり。
正規化も大事だが、何より重要なのは「1テーブルが1つの状態を保持すること」だ。
実務での経験から上記が分かったので、イミュータブルデータモデリングについてぼちぼち勉強して、追記していく。
以下は参考サイト及び書籍