← メディア一覧

データベースビューの裏側設計思想と活用法

11分27秒 | DB基礎FE

基本情報技術者試験の頻出テーマを解説した音声コンテンツです。

トランスクリプト(字幕テキスト)

さて、今回のテーマはデータベースのビュー機能です。 データを整理しようと正規化を進めたら、テーブルがどんどん分割されて、 いざ使う時にはもう5つも6つもテーブルをジョインしないといけなくて、クエリがすごく複雑になる、なんて経験ありませんか? 今回はこの面倒を解決してくれる、ビューという仕組みについて、いただいた資料を元に深く探っていきたいと思います。 ええ、その複雑さとの戦いは、まあ多くの開発者も一度は通る道ですからね。 ビューというのはそのための何ていうか、非常にエレガントな武器になるんですよ。 単に便利なだけじゃなくて、データベース設計のもっと深い思想みたいなものが背景にあるんですよ。 思想ですか。ああ、それ面白いですね。資料を読んでいてまず目に付くのが、「ビューは仮想的なテーブル」という言葉なんですけど、 この「仮想」っていうのがちょっと引っ掛かりまして。結局、ビューにアクセスするたびに裏でSQLが動くんだったら、 パフォーマンス的には直接テーブルを叩くより遅くなるんじゃないかなって。そのオーバーヘッドが少し気になりますね。 ああ、いいポイントですね。いきなり核心です。確かに理屈の上ではその通りで、ビューを1枚挟む分、ごくわずかなオーバーヘッドはあります。 ただ今のデータベースって、クエリオプティマイザが非常に賢いので、多くの場合内部で上手いこと最適化してくれるんですよ。 なので、パフォーマンスが問題になるケースっていうのは昔に比べてずっと減りました。それよりもビューがもたらすメリットの方が遥かに大きいんです。 と言いますと? 仮想的というのはまさに仰る通りで、ビュー自体はデータを一切持っていないからなんです。 その実体は保存されたSQL文、つまりデータを抽出するためのレシピだけなんですね。 レシピですか。 ええ。ユーザーがビューという名前の「料理」を注文すると、データベースがその都度、レシピ通りに元のテーブル、 基底テーブルという食材からリアルタイムで料理を作って出してくる、そんなイメージです。 データの実体は持たないので、ディスク容量もほとんど使いません。 なるほど、レシピか。毎回あの複雑なジョインの呪文を唱えなくても、「いつものやつ」って短い名前で注文できるわけですね。 これは確かにチームで開発してる時なんかは絶大な効果がありそうです。誰が書いても同じレシピだから、同じ結果が保証される。 まさにその通りです。人為的なミスを防いでロジックを共通化できる。これがビューの第一の顔、「便利なショートカット」としての側面です。 で、このロジックを共通化できるっていう点が、実は次の話に自然と繋がっていくんですよ。 と言いますと?ああ、なるほど。共通の窓口が一つあるなら、その窓口で見せるものを制限すれば、それがそのままアクセス制御になると。 セキュリティ機能になるわけですか?その通りです。そこなんです。資料にあった「覗き窓」という比喩がここで活きてきます。 例えばポータルサイトで社員名簿を表示する画面を考えてみてください。裏側には住所とか給与とか、かなり機微な情報を含んだ巨大な社員テーブルがあるとします。 でも一般の社員が見る画面に必要なのって、名前と部署名だけだったりしますよね。 ええ、そうですね。他人の給与が見えちゃったらもう大問題です。 そこで、名前と部署名だけをセレクトするというレシピを持つビューを作るんです。そしてユーザーにはそのビューへの参照権だけを与える。 元の巨大な社員テーブルへのアクセスは許可しない。そうすると、ユーザーは許可された「覗き窓」から業務に必要な情報だけを安全に覗けるわけです。 窓で隠された給与カラムのことは、そもそも存在すら知らないという状態にできるんですね。 なるほど、カラム単位でこう見せる・見せないをコントロールできる。これは強力ですね。でも、もう一歩踏み込んでみたいんですけど、 隠せるのってカラム、つまりデータの種類だけですか?例えば営業部長のAさんがアクセスしたら、Aさんのチームのデータだけが見える、みたいに、 見る人によって見える行、レコード自体を制限するなんてことは? 素晴らしい質問です。それこそがビューのセキュリティ機能をさらに強力にする使い方で、もちろん可能です。あ、できるんですね。 ええ。ビューを定義するSQLにWHERE句を加えればいいだけですから。例えば WHERE team = 'team A' っていうビューを作って、これをA部長にだけ公開する。 同じようにチームB用のビューをB部長に公開する。こうすれば各部長は自分のチームのデータしか見えません。 まるで自分専用のテーブルがあるかのように自然に使えるわけです。 それはすごい。ユーザーごとに見せる世界を完全に作り変えられるんですね。たった一つのテーブルから何種類もの覗き窓を用意できると。 セキュリティの考え方が根本から変わりそうです。ええ。これがビューの第二の顔、「強力なセキュリティゲートキーパー」としての役割です。 いや、奥が深いです。セキュリティの話もすごく面白いんですが、資料にはもっと実務的な、なんていうか日々の開発が楽になるヒントもあって、 複雑な計算式をビュー側で計算させておく、という部分。これもかなり賢い使い方だなと感じました。 これは本当に便利で、私がよく「ビジネスロジックのカプセル化」と呼んでいる使い方です。 例えばECサイトの商品テーブルを例にしましょうか。テーブルには税抜きの本体価格が保存されているとします。 でも画面に表示するのは常に税込価格ですよね。はい。普通はアプリケーション側のコードで、 データベースから取ってきた価格に1.1を掛ける、みたいな処理を書きますね。そうですよね。でもその「価格×1.1」という計算を、 ビューの定義に含めてしまうんです。SELECT price, price * 1.1 AS price_with_tax FROM products みたいなビューを作ってしまう。 そうすればアプリ開発者は今の税率が何パーセントかなんて気にしなくていい。ただこのビューから price_with_tax というカラムを取ってくるだけで、 常に計算済みの正しい値が手に入るんです。うわ、それは楽だ。アプリ側のコードがすごくスッキリしますね。 データの取得とビジネス上の計算ロジックをこう綺麗に分離できる。まさに。そしてこのアプローチが本当に真価を発揮するのは、 仕様変更があった時なんです。仕様変更…あ、まさか。ええ、ご想像の通りです。 もし将来、消費税率が10%から15%に変わったらどうしますか?ビューを使っていないければ、アプリケーションのコードに書かれた「1.1」という数字を、 関係する全ての箇所で「1.15」に修正して回らないといけない。うわ、身に摘まされますね。昔、消費税が5%から8%になった時、 プログラムに点在してる1.05を血眼になって探して1.08に書き換えた悪夢を思い出しました。あれは本当に地獄でしたよ。 でしょうね。でもビューを使っていればその地獄は避けられます。ビューの定義の中にある1.1を1.15に、たった一箇所書き換えるだけ。 それだけでそのビューを参照している全てのアプリケーションの表示が一斉に正しく更新されるんです。 これがデータベース設計で非常に重要視される「データの独立性」という概念の一つの実現例です。 アプリケーションは「税率」という具体的なビジネスロジックから独立している状態になるわけですね。データの独立性…なるほど。 つまりビューがデータベースの内部構造と、それを使うアプリケーションとの間の緩衝材とか翻訳機みたいな役割を果たしてくれるわけですね。 これならデータベース側はテーブル構造の最適化に集中できるし、アプリ側はビジネスロジックに集中できる。お互いがもっと自由になれる。 その通りです。長期的にメンテナンス性の高いシステムを作る上で、この考え方は欠かせません。これがビューの第三の顔、「賢い翻訳機」としての側面です。 なるほどなあ。こうしてみるとビューには、複雑なクエリを隠す「ショートカット」の顔、データを守る「セキュリティゲートキーパー」の顔、 そしてロジックを吸収する「翻訳機」の顔と、本当に色んな役割があるんですね。なんだかもう万能ツールみたいに聞こえてきますけど、 逆に何か弱点とか、これはやらない方がいいみたいな注意点はあるんですか?もちろんです。そこを理解しておくのは非常に重要ですね。 最大の注意点はデータの更新です。つまりインサート、アップデート、デリートですね。 ビューはあくまで仮想的な窓なので、その窓を通して何かを書き換えようとすると途端に話が複雑になります。 と言いますと、参照、つまり読み取りは得意だけど書き込みは苦手だと。そう考えていただくのが一番安全で、 例えば社員テーブルと部署テーブルをジョインして作ったビューに対して、「この行を更新して」と命令したとします。 その更新が元の社員テーブルを書き換えるべきなのか、部署テーブルなのか、データベースが判断できない場合があるんです。 ああ、なるほど。どのテーブルのどの行を操作すればいいか一意に決まらないからエラーになるわけですね。 ええ。特に複数のテーブルにまたがるビューとか、集計関数を使っているビューは原則として更新できません。 なので基本的にはビューは安全で便利な読み取り専用の道具として捉える。更新処理は元の基底テーブルに対して直接行う。 そう割り切るのが混乱を避けるための健全なアプローチです。わかりました。得意な土俵で戦わせるのが重要ということですね。まさにその通りです。 さて、ここまで話を伺ってきて、ビューが単なるデータベースの一機能ではないということがよくわかりました。 これはもう、増え続ける情報の中から必要なものを必要な人に必要な形で見せるための、非常に洗練されたインターフェース設計思想そのものですね。 データをどう構造化するかっていう正規化の思想と、それをどう見せるかというビューの思想が両輪になって初めて、 美しくて実践的なデータベースが生まれると。素晴らしいまとめですね。本当にその通りで、情報が溢れるこの時代、ただデータを溜め込むだけでは価値は生まれません。 それをどう切り取り、どう加工し、どう守りながら届けるか、その「編集」の視点が重要になります。 ビューはそのための極めて強力で柔軟なツールなんです。正規化によって達成された構造的な美しさを、ビューによって実用的な美しさに昇華させる。 データベース設計の醍醐味はまさにそこにあると思います。いや、腑に落ちました。ありがとうございます。では最後に、 リスナーの皆さんがもう一歩深く考えるための問いをいただけますか?そうですね。では、こんな問いはどうでしょう。 今回はビューの上にアプリケーションが乗るという話をしました。では、ビューの上にさらにビューを重ねることはできるでしょうか? 例えばまず全社員データから個人情報を抜いた「安全な社員ビュー」を作る。次にそのビューを元にして、 チームAのメンバーだけを抽出した「チームA専用ビュー」を作る。こうした多層構造にすることのメリットと、逆に考えられるデメリット、 例えばパフォーマンスへの影響とか、管理の複雑さとか。その辺りを考えてみると、ビューというツールの本質がさらに見えてくるかもしれません。

このコンテンツは Web society で視聴・学習できます。