データベースの目的
前回の記事までは、性能の観点から正規化について解説いたしました。
ここからは少し話題を変えて、設計の観点から正規化について解説していきます。
今回はまず原点に立ち返って、データベースの目的について整理したいと思います。
お恥ずかしい話ですが、私はかつてデータベースについて「検索機能のついたデータの入れ物」という程度の認識しか持っていませんでした。
昔はデータを自力でファイル管理することも一般的だったので、データの形など「仕様と性能を満たせばそれでよい」という程度の考え方でした。
またデータベースにも種類と変遷があり、カード型データベース・リレーショナルデータベース・オブジェクト指向データベース・XMLデータベースなど、流行り廃りで使っていました。
このスタンスではデータベースを十分に活用しているとは言えず、そのせいで複雑で無駄の多いシステムを生産していたというのが、今の反省点です。
残念なことに、このようなスタンスで設計されたシステムを数多く見てきました。これには私と全く関係ないベンダが手掛けたシステムも含まれています。逆に理想的な設計と思った事例は、皆無と言ってよいほどです。
したがってこれは一部の企業や顧客ではなく、日本のIT業界全体の傾向であると思います。
最近「DX化」や「2025年の崖」と言われる課題についても、この問題が多くの部分を占めていると私は考えています。
状況が変わったのは、職場での何気ない会話でした。
当時、オブジェクト指向データベースがもてはやされており、何故かそれを使うこと自体がプロジェクトの目的と化していました。しかし、私はなかなか上手い使い方を見つけられず、思わずつぶやきました。
私 「データベースって、何のために使っているんだろう?」
同僚「それは、データの再利用のためでしょう」
この答えは教科書通りだったのかもしれませんが、目的が分からなくなっていた私には、この単純な一言は非常に腑に落ちました。それまで学習した技術がつながり、「データ中心主義」という体系として理解できた瞬間でした。
「データの再利用」の観点からデータベースの目的を整理すると、次のようになると思います。
- データは、単一の目的ではなく、汎用的な目的で再利用できるように管理すべきである
- そのための最適な形が正規形である
- 正規形のデータは、冗長性を排除した最も無駄のない形式である
- 正規形のデータは、プログラムが処理しやすいように最適化した形式である
- 適切に設計された正規形データは、要件や仕様を超えて利用可能な応用性を備える
- 正規形データに基づくプログラムの実装は、シンプルかつ効率的になる
リレーショナルデータベースと正規形は、数学的な集合論に基づいて構築されています。したがってこの考え方には厳密性があり、時代が進んでも不変であろうと直感しました。
一方でオブジェクト指向データベースは、「プログラム言語と同様に、データと処理を一緒に持てば便利ではないか」というアイデアに基づいています。
しかしこのアイデアに厳密な裏付けはなく、どうデータを定義すべきかについての理論もありません。ロジックの塊であるコンピュータの仕組みとして意外かもしれませんが、実は数学的裏付けまで備えたものばかりではないのです。
現在もオブジェクト指向データベースは一部残っていますが、主流となることはありませんでした。
その後NoSQLも登場していますが、これはリレーショナルデータベースと相互に補完し合うものであり、この考え方に矛盾するものではありません。
したがって、リレーショナルデータベースと正規化の概念は、今後もITシステムの中核であり続けるでしょう。
まとめ
データベースの目的を「データを再利用するため」と定義すると、正規化の意味を理解できるととともに、設計の重要な指針となります。
私はこの考え方を実践するようになってから約20年になりますが、それ以降のシステム開発は極めて良好に進むようになり、失敗や大きな問題を抱えることはなくなりました。正規化を進めて行き詰まったという事例は一度もなく、現在も順調に稼働しています。
さてここまで書くと、おそらく色々な議論が出てくると思います。
- 正規化してみたが、どうもうまくいかない
- O/Rマッピングの問題があるから全然シンプルじゃない
- SQLより他のプログラム言語で実装する方が慣れている
- SQLには方言があるのでDBMS依存になるのが好ましくない
- デッドロックに悩まされたのであまりDBに依存したくない
- 非正規形を正規形に直すのは大変すぎる
私もこれらの議論に実際に触れ、適切と思う答えを探して選択してきました。これらの議論を一度に進めることは難しいので、今後の記事でひとつずつ触れていきたいと思います。
考え方や状況は人それぞれですから、その上で一番と思う方法を選択して頂ければ良いと思います。