shiodaifuku.io

データベースを聖域化しないためのアイデア

この記事はしおだいふく Advent Calendar 2020 17日目の記事です。

聖域化するデータベース

近年、業務でWeb開発に携わっていてデータベースを一切使わずにアプリケーションを開発することはないと思います。 あらゆるアプリケーションにおいて、データベースが重要な役割を担っていることは間違いありません。

「データベースはアプリケーションの土台!」などと言って、データベースありきでアプリケーションを設計してしまう人が後を絶ちませんが、 こういう考え方ではデータベースへの依存度が異様なまでに高くなりがちです。

そうなってしまうと、アプリケーションの設計がすべてデータベースの都合に引きずられるようになってしまいます。 プロダクトの成長に合わせてデータベースのスキーマ変更がしたくても難易度が高くなってしまったり、 なんらかの事情でデータベースを変更したくてもできなかったり、みたいなことが起こります。

このような状態になってしまったデータベースを僕は勝手に「聖域化したデータベース」と読んでいます。 避けるためには、(我々が普段から工夫しているのと同じ要領で)データベースとアプリケーションの間の結合をシンプルに保ち、 かつデータベースの柔軟さ1を高く維持する変更可能な状態に必要があります。

データベースを変更可能にするためアイデア

誰がどうやってもデータベース絡みの変更は大変なのは間違いないのですが、それは工夫を放棄する理由にはなりませんよね。 必要になったときに余計な苦労をしなくても済むようにするためのアイデアをご紹介します。

これは絶対の法則というわけではないので、必ずこうしたほうがいい!と強くおすすめするものではありませんが、 みなさまにとって有益な部分を選んでつまみ食いしてもらえればいいかなと思います。

整然データを扱う

整然データというのは近年データアナリティクスの界隈で使われている概念らしいです。 あまりWeb界隈では使われてない概念のような気がします。 整然データとは何かに詳しい解説がありますので、初見の方はリンク先を読んでおいてください。

というわけで、データベースに格納するデータは整然データとすると扱いやすいと思われます。 NoSQLにはRDBの正規化と同じ概念はいまのところ確立されていませんが、整然データを目指すのが目標としてはいいのかなと思います。

なお、整然データは必ずしも人間にとって理解しやすいことを意味しませんので、あまりこだわりすぎると(結合が発生するので主に性能面で)苦戦します。 画面に表示するデータはそのための加工をどのレイヤーが担うかが設計上重要になります。 本記事の意図するところは「こういう加工処理をデータベースに任せると聖域化するよ」という話なので、立場としては整然データにしておくのがいいよとしておきます。

同じ意味のデータを異なる形式で表現しない

「0とnullは同じ意味」とか「空文字列とnullは同じ意味」とか「テーブルAのstatusカラムのhogeとテーブルBのstatusカラムのfugaは同じ意味」とかしないでください。 無意味なクエリ上の工夫とかアプリケーション側でのマッピングとかが必要になり、アプリケーションの保守運用にあたって要求される知識が増えます。

アプリケーションが持つべき機能をデータベースの機能で実現しない

全文検索をとかデータの変換とか計算とか、できれば集計とかもDBでやるのはやめたほうがいいです。 この辺の機能はDBMSの標準的な機能ではないので、「○○ができないからこのデータベースプロダクトは使えない」みたいな話の源泉になります。

検索に関しては専用のソリューションをつかってください。 どうせ遠くない将来にDBの機能では足りなくなって性能面でのボトルネックになります。

データの変換とか計算はアプリケーション側でやったほうがいいでしょう。 集計は悩ましいところですが、集計した結果が必要なら集計した状態で(必要なら集計前のデータとは別に)データベースに保存しておくほうがいいと思います。

まとめ

データはアプリケーションの要求を忘れて汎用性が高い状態になっているほうが取り回しが良くなります。

最近のデータベースはクエリが高機能なので、アプリケーションでやったほうがいいこともなんか色々できちゃったりしますし、 結合を減らすとか表示の都合とかであえて正規化を崩したりデータ重複を許したりすることもありますが、 その裏でなにを犠牲にしているかとか、他にもうちょいうまいやり方がないのかとかはあらかじめ考えてからやったほうがいいですよ。

このへんあまり考えずにやってしまうと後世のエンジニアを苦しめますよ。ええ。


  1. スキーマの拡張が簡単にできたり、テーブルの分割が簡単にできたり、他のデータベースへのデータ移行が簡単にできたりすること。

最新記事

  1. Cloud RunでgRPC streamingができるようになったので動かしてみたりした
  2. 2020年の執筆業まとめ
  3. アーキテクチャを設計する仕事とは
  4. 決済システムを設計するときに忘れてはならないたった1つの大切なこと
  5. third-party cookieと2020年