データベースを考える

2023/11/14作成

とてつもなく大層なタイトルをつけてしまいましたが、内容はしょぼいです。って、そこまで卑屈になることもないんですが。まあ、要するにデータベースについて適当に思いつくことをつらつらと書いていこうというだけの記事です。

多くのシステムはデータベースとプログラムの組み合わせからなります。データベースとして RDBMS や NoSQL を使っていなくても、ファイルやメモリに記録しているものもありますから、それらも含めると大抵のシステムがそうだとも言えそうですね。

そんなデータベースとプログラムですが、連携して動作することから密接に関わっています。が、密結合かというとそこまででもない。疎結合と言えるほど遠くはないけれども。データベースもプログラムも、切り離して単独では動かすことは出来ないけれど、それぞれ差し替えることは出来る程度には疎結合です。

例えば同じデータベースを参照する新プログラムを稼働させるなんてことはよくあります。データベースはどのプログラムに対しても平等ですからね。プログラムをリニューアルするってこともあります。新旧のプログラムを同時に用意しておいて、リニューアルのタイミングでスパッと切り替えちゃうんですね。それに対してデータベースの新旧切り替えはだいぶ大変です。プログラムを新旧両方に書き出すように修正し、次に読み出しを新DBに切り替え、最後に旧DBへの書き出しを止めてから旧DBの切り離しがようやく出来るようになります。こういうステップを踏まないなら、データ移行のためにシステムを長時間止めるという手もなくはないです。ともあれ、データベースとプログラムは一応切り離すことが出来るってわけですね。

となると、プログラムとデータベースの寿命の違いってのが一つ気にしなきゃいけないポイントかなと思います。多分ですが、データベースの方が寿命が長い。プログラムはどっかのタイミングでスパッとリニューアルしやすいけれども、データベースはなかなかリニューアル出来ないので、メンテナンスをしながら長期間使い続けるという選択になりやすいかなと。であれば、長期間使えるように気を使って設計・構築・運用しなきゃねって話でもありますね。サクッと捨てれるプロトタイプなら適当に設計しても問題ありませんが、10年使われるなら、それなりに考えておいた方がよさそうです。10年使う積りだったけど半年で廃棄ってこともよくある話ではありますが。

データベースを長く使うということを考えると、データベースにも技術的負債って蓄積されるんじゃないかと思うんですよ。プログラムの技術的負債は随分と議論されるようになりましたが、データベースについてはまだあんまりされてない印象があります。私が知らないだけかもしれませんが。

プログラムにおいてはリーダブルコードを始めとして、そもそも最初から綺麗に読みやすく書きましょうという啓もう活動があります。それと同じようにデータベースについてもリーダブルスキーマってあるんじゃないかと思うんですね。スキーマ設計については正規化という話はよくされますけれども、それ以外はあんまり聞かない気がします。そんなことないかな。

個人的にはフラグとステータスの話とかIDとコードの話なんて記事を書いたこともあります。長く運用してるデータベースだと、"なんとか2"とか"なんとかnew"みたいなテーブル名やカラム名を見かけることがありますよね。これ、良くないことだと思うんですよ。ちゃんと意味が分かる命名をしましょうよと。まさにプログラムに対してリーダブルコードが書いていることなんですけれども。

その他にも、使わなくなったカラムやテーブルが放置されてることもよくありますよね。完全に放置されているのなら障害の原因になることはなさそうですが、影響範囲調査などで常に余計なコストを払わなければならなくて大変になります。出来れば掃除しておきたい。

そういうスキーマの技術的負債のほかに、レコードの負債も当然にあります。使わなくなったけれど、削除されずに放置されているレコード。ディスク容量が貴重だった昔ならこうしたレコードは積極的に削除されていましたが、ディスクが事実上無限に使えるようになった現代では放置されがちです。まあ、何かあった時にいちいちバックアップからリストアする手間を考えたら消さずに全部置いておこうというのも適切な判断であるとも言えますけれども。

不要になったレコードが残っていると検索や統計処理の時間がかかるという問題もありますが、それはどちらかというとスキーマ設計やインデックス戦略が不適切だって可能性が高そうですしね。ということで、レコードの負債についてはそれほど問題ではないかもしれない。個人的には整理整頓されているのが好きなので、ちょっともやもやしますけどね。そのもやもやを解消するために手間をかけるかというと、それは業務で行っているなら難しいとは思います。

データ自体が腐るということもあります。単体としての値が不適切なレコードというのもあるし、リレーションが不整合なデータが放置されていることもある。酷いところになると、クエリを叩くたびにデータベースから warning がログに吐かれてるけど放置されてるとか。長年運用されているデータベースだとあるあるですよね。こういうのも出来ればメンテナンスして綺麗にしておきたいところです。