データベースはSQLを使って必要なデータを取り出しますが、一つまたは複数の表から行、列の値を取り出すためにSELECT文を使いますね。
基本的にはSELECT文を使って様々な条件をSQLで指定しますが、データの操作において、SELECT文では無い「ビュー」という言葉が出てきます。
ビュー(view)なので、何かを見るためのものだなと分かるかと思いますが、実際何の目的で使うのかを解説します!
ビューの目的とは?
先ずビューとは「仮想的な表」のことで、実際データベース上に作成された表とは異なります。導出表とも呼びますね。
SQL文からの問合せがあるたびに、実際の表または別の仮想的な表(ビュー)に問合せを行い、その返答結果からビューを作成します。
わざわざ、大元の表から作ったビューを見るくらいないら、直接データベースの表にSQLで問い合わせをした方が良いじゃないか?と思いますが、ビューを使うメリット(目的)があるのです。
その目的とは二つあります。
【目的その①】SQL文をシンプルにできる!
複数の表を結合する処理や集約関数などを使った長い複雑なSQLを作るのは大変ですよね。しかも毎々その複雑なSQLを作るとなると更に大変になります。そのためにビューを作成しておくと、プログラムからデータを呼び出すときに簡単なSELECT文を使った処理を簡単にすることができます。
ビューは何回も演算を行うので、最新の情報を反映させることができ、データの整合性も取り易くなります。
プログラムでビューを実行するイメージは以下の形ですね。
【目的その②】セキュリティを高める!
表の中身には個人情報や会社の重要な情報など、公開をしたくない(限定したい)部分がある時があります。このような場合に、一般に公開しても問題無い情報だけを取り出せるようにし、隠したい部分は非公開にしておく必要があります。そのためにビューを使うことができます。
表とビューにそれぞれアクセス制御をかけることによって、参照できるユーザを特定し、情報の漏洩を防ぐことができます。
更新可能なビューって?
ビューは、実際の表と同じようにSELECT文で表示させることが可能ですし、ビューの中を更新することも可能です。ビューを更新すると、それに対応した元の表の情報が更新される仕組みです。
では、表の中の行をまとめて表示されたビューを更新した際はどうなのでしょうか?この時、元の表の行が特定できないので、更新時異常、つまり更新できないという現象が起こってしまいます...
このような状況を避けるためにビューの更新には制限があり、更新可能なビューは機能を制限されています。
更新可能なビューにおいて制限されている機能は以下の通りです。
更新可能なビューで制限される機能
- GROUP BY句
- HAVING句
- DISTINCT句
- 計算列
- 集約関数
これらの機能を使って演算を行うと、元の表の複数の行が1行にまとめられてしまいます。そのため、元の行を特定できず、更新が不可能になってしまいます。
また、ビューに行を挿入する時に、ビューに含まれていない列の値は設定できない(元の表にある見えない列なので設定しようがない)、ビューに含まれていない列は全て「NULL」を許可しているか、デフォルト設定が可能である必要があります。
ビューから更新する時は色々気を付ける必要がありますね!
体現ビューとは?
ビューは基本的にプログラムから操作される度に、実際の表(実表)に対して問合せが行われます。そのためビューはデータベースの中には格納されない仕組みとなっています。
しかし、頻繁にビューが操作される場合は、その都度実表に問合せを行っていると処理速度の低下に繋がってしまいます。
この処理速度の低下の問題を回避するために、ビューをデータベースに格納しておくことができます。このビューを「体現ビュー」と呼びます。「マテリアライズドビュー」とも呼びます。
体現ビューの仕組みは、ビューの問合せの前に、予めSELECT文を実行してデータをビューの中に格納しておきます。これにより、プログラムからビューへのアクセスは早くなりますが、実表側のデータが更新された場合、ビューと実表のデータに不整合が発生する可能性があります。
更にデータベースにビューのデータを格納するため、その分データの格納領域が必要となり、データベースの物理的な記憶領域が増加します。
体現ビューにより、処理速度の低下を抑えることができますが、デメリットもあるため、なんでもかんでも体現ビューを作成するのでは無く、どのビューを体現化するのかをしっかり検討してから設定する必要がありますね。
まとめ
今回はデータベースにおけるビューに関して解説しました。
仮想テーブルであるビューを使うことで、「SQL文をシンプルにできる」、「セキュリティを高めることができる」ことが分かりましたね。
体現ビューなども使えて、非常に便利なビューですが、使い方を間違えると更新時の制約やデータの不整合の発生なども発生してしまいますので、しっかり設計して上手にビューを使っていきましょう。
以上です!