なぜデータベースにビューを作成するのですか?


回答:


464

ビューにはいくつかの利点があります。

1.ビューは複雑さを隠すことができる

複数のテーブルを結合する必要があるクエリがある場合、または複雑なロジックや計算がある場合は、そのロジックをすべてビューにコーディングしてから、テーブルと同じようにビューから選択できます。

2.ビューはセキュリティメカニズムとして使用できます。

ビューは、1つまたは複数のテーブルから特定の列や行を選択でき、基礎となるテーブルの代わりにビューに設定された権限を選択できます。これにより、ユーザーが表示する必要のあるデータのみを表示できます。

3.ビューはレガシーコードのサポートを簡素化できます

多くのコードが壊れるテーブルをリファクタリングする必要がある場合は、テーブルを同じ名前のビューに置き換えることができます。ビューは元のテーブルとまったく同じスキーマを提供しますが、実際のスキーマは変更されています。これにより、テーブルを参照するレガシーコードが破損することがなくなり、レガシーコードを自由に変更できます。

これらは、ビューがどのように役立つかを示す多くの例のほんの一部です。


84
項目3は、他の誰もまだ指摘していないように思われる理由です
MedicineMan

2
ポイント3は、何よりもストップギャップのほうが大きいと思います。最終的にレガシーコードの更新に取り掛かると、ビューの背後にあるコードだけでなく、ビューの上に構築されたすべてのコードも変更する必要があります。マイ2cents
super9

3
3ビューの最も強力な特性です。基礎となる論理データベースから独立したDBへのインターフェースを提供できるということは非常に強力な概念であるということは、論理データの独立性を提供するのに役立ちます。
Falaina、2009年

1
@Johnこの発生した技術的負債は遅かれ早かれ返済する必要がありますか?10年後には、10年前にそれを書いたエンジニアにとって重要ではないかもしれませんが、会社にとっては重要です。
super9

メインDBとそれに依存するすべてを変更することは、「10年以内にそれを必要とする」可能性があるため、行うのは悪い選択です。技術的負債は、後で修正するための予想コストが、現在修正するための明確なコストよりも大きい場合にのみ、絶対に回避するべきではありません。
ボーイ氏

88

特に、セキュリティに使用できます。「顧客」テーブルがある場合は、すべての営業担当者に、名前、住所、郵便番号などのフィールドへのアクセスを許可し、credit_card_numberは許可しないようにすることができます。アクセスが必要な列のみを含むビューを作成して、ビューへのアクセスを許可できます。


面白い。セキュリティは良い答えです。他にどんなことを考えていますか?
MedicineMan、

13
この質問に対する他の回答は「他のこと」を説明するものだと思いました。:-)
Graeme Perrow、

Select name, address, zipcode from customer代わりに目的を果たしませんcreating a viewか?
PPB

@PranavBilurkarはい、ユーザーが実行するクエリを完全に制御する場合。ユーザーが独自のクエリを実行できる場合(インタラクティブSQLプログラムを使用するか、独自のスクリプトを作成する)、select * from customerユーザーはすべてにアクセスできるように実行できます。テーブルではなくビューへのアクセスを許可すると、ビューにないフィールドにはアクセスできません
Graeme Perrow、

38

ビューはクエリをカプセル化したものです。ビューに変換されたクエリは複雑になる傾向があるため、再利用するためにビューとして保存すると効果的です。


複雑なクエリがあるときにビューを作成したいですか?クエリはどれほど複雑で、しきい値はいくつですか?ビューにすることで何が得られますか?
MedicineMan、

4
個人的な選択が実際にどれほど複雑であるか、しきい値は設定されていません。たとえば、複数のアプリケーションまたはアプリケーション内の異なるポイントでロジックを複製したくない場合は、ビューを使用することがよくあります。ビューにすることでそのロジックを隠し、簡単に共有することができます。
クリスキャメロンミルズ

1
選択のあるストアドプロシージャでも同じことはできませんか?ストアドプロシージャを複雑なクエリロジックを格納する方法として誤って考えたことはありますか?ストアドプロシージャではなくビューで複雑なクエリを実行する必要がありますか?ここでのストアドプロシージャの利点は何ですか?
MedicineMan、

2
@MedicineMan-ストアドプロシージャは結果セットを返しますが、ビューは他のクエリのテーブルとして使用できる仮想テーブルを表します。
アンドリューヘア

1
結果セットと仮想テーブルのこの点は、私が理解しなかった重要な点のように思われます。
MedicineMan、

28

私は通常、レポート目的で頻繁に使用されるデータを非正規化または集約するためのビューを作成します。

編集

詳細を説明すると、エンティティの一部が個人、会社、役割、所有者の種類、注文、注文の詳細、住所、電話であるデータベースがある場合、personテーブルには従業員と連絡先の両方、および住所と電話テーブルには、個人と企業の両方の電話番号が格納され、開発チームは、従業員ごとの売上、顧客ごとの売上、または地域ごとの売上、月ごとの売上などのレポートの生成(または開発者以外がレポートデータにアクセスできるようにする)を課されました、州ごとの顧客などデータベースエンティティ間の関係を非正規化した一連のビューを作成し、現実のエンティティのより統合されたビュー(しゃれが意図されていない)を利用できるようにします。利点には次のようなものがあります。

  1. クエリの記述における冗長性の削減
  2. 関連エンティティの基準を確立する
  3. 複雑な計算と結合のパフォーマンスを評価および最大化する機会を提供する(たとえば、MSSQLのSchemaboundビューでのインデックス付け)
  4. チームメンバーや非開発者がデータにアクセスしやすく直感的になります。

1
これについて詳しく説明できますか?あなたの答えはかなり投票されていますが、私は他の誰もがそうであるような価値を得ていません
MedicineMan

11

いくつかの理由:複雑な結合がある場合は、ビューを用意して、すべてのアクセスで常に正しい結合が得られ、開発者が必要とするすべてのテーブルを覚えておく必要がないようにすることが最善の場合があります。通常、これはすべての財務レポートが同じデータセットに基づいていることが非常に重要である財務アプリケーションの場合です。

表示できるレコードを制限したいユーザーがいる場合は、ビューを使用して、基になるテーブルではなく、ビューへのアクセスのみを許可してから、ビューにクエリを実行できます。

Crystalレポートは、ストアドプロシージャにビューを使用することを好むようです。そのため、多くのレポート作成を行う人は、多くのビューを使用する傾向があります。

ビューは、データベースをリファクタリングするときにも非常に役立ちます。多くの場合、ビューを作成することにより、変更を非表示にして、古いコードが変更を認識できないようにすることができます。データベースのリファクタリングを読んで、これがリファクタリングの非常に強力な方法であることを確認してください。


7

ストアドプロシージャに対するビューの主な利点の1つは、テーブルを使用するのと同じようにビューを使用できることです。つまり、FROMクエリの句で直接ビューを参照できます。例えば、SELECT * FROM dbo.name_of_view

他のほぼすべての方法で、ストアドプロシージャはより強力です。あなたには、パラメータを渡すことができout、あなたが行うことができます、あなたが効果的に一度に複数の値を返すことができるようにパラメータSELECTINSERTUPDATE、およびDELETE操作、などなど

FROM節内からクエリを実行するビューの機能が必要であるが、パラメーターを渡すこともできるようにしたい場合は、それを行う方法もあります。これはテーブル値関数と呼ばれます。

このトピックに関するかなり役立つ記事を次に示します。

http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html

編集:ところで、この種の問題は、ビューがテーブル値関数よりも優れているという疑問を引き起こしますか?私にはそれに対する良い答えはありませんが、ビューを作成するためのT-SQL構文はテーブル値関数よりも簡単で、データベースのユーザーはビューに慣れている可能性があることに注意します。


+1は、SELECTステートメントに対するストアドプロシージャの問題に対処するための数少ない回答の1つです。あなたはテーブル関数の問題を提起する権利があります。基本的に、ビューは同じエンジンを共有するため、関数よりもパフォーマンスが向上する可能性があります。SQLからトランザクションSQL(PL / SQL)に切り替える際に、オーバーヘッドが(少なくともOracleでは)支払われる必要があります。しかし、その他すべてのもの-セキュリティ、カプセル化など-は、ビューと同様にプロシージャまたは関数に等しく適用されます。
APC、

ビューの構造によっては、一部のビューにインデックスを付けることができます。これは、テーブル値関数よりも大幅に改善されています。
HLGEM 2015年

6

ORMとテーブルの間の優れた「中間者」として機能できます。

例:

構造を変更する必要があるPersonテーブルがあったため、SomeColumn列は別のテーブルに移動され、1対多の関係になります。

ただし、Personに関するシステムの大部分は、SomeColumnを単一のものとして使用し、多くのものは使用していません。ビューを使用してすべてのSomeColumnsをまとめ、ビューに配置しましたが、うまくいきました。

これはデータレイヤーが変更されたために機能しましたが、ビジネス要件は根本的に変更されていなかったため、ビジネスオブジェクトを変更する必要はありませんでした。ビジネスオブジェクトを変更する必要がある場合、これは実行可能な解決策ではなかったと思いますが、ビューは間違いなく優れた中点として機能します。


1
面白い。あなたの場合、それはほとんどテーブルへのインターフェースのようなものです。
MedicineMan、

5

特定のデータ ビューに焦点を合わせると、ユーザーは、関心のある特定のデータと、自分が担当する特定のタスクに焦点を合わせることができます。不要なデータはビューから除外できます。これにより、ユーザーはビューで定義されているデータのみを表示でき、基になるテーブルのデータは表示できないため、データのセキュリティも向上します。セキュリティ目的でのビューの使用の詳細については、「セキュリティメカニズムとしてのビューの使用」を参照してください。

データ操作 を簡略化するビューは、ユーザーがデータを操作する方法を簡略化できます。頻繁に使用される結合、プロジェクション、UNIONクエリ、およびSELECTクエリをビューとして定義できるため、ユーザーはそのデータに対して追加の操作が実行されるたびにすべての条件と条件を指定する必要がありません。たとえば、レポートの目的で使用され、サブクエリ、外部結合、集計を実行してテーブルのグループからデータを取得する複雑なクエリは、ビューとして作成できます。レポートが生成されるたびに、基になるクエリを書き込んだり送信したりする必要がないため、ビューによってデータへのアクセスが簡素化されます。代わりにビューが照会されます。データの操作の詳細については。

パラメータ化されたビュー、またはWHERE句の検索条件にパラメータを持つビューとして論理的に動作するインラインのユーザー定義関数を作成することもできます。詳細については、「インラインユーザー定義関数」を参照してください。

データ ビューをカスタマイズすると、異なるユーザーが同じデータを同時に使用している場合でも、異なる方法でデータを表示できます。これは、さまざまな興味やスキルレベルを持つユーザーが同じデータベースを共有する場合に特に有利です。たとえば、アカウントマネージャーが取引する顧客のデータのみを取得するビューを作成できます。ビューは、ビューを使用するアカウントマネージャーのログインIDに基づいて、取得するデータを決定できます。

データをエクスポートおよびインポートするには、 ビューを使用してデータを他のアプリケーションにエクスポートできます。たとえば、Microsoft®Excelを使用して販売データを分析するために、pubsデータベースの店舗と販売テーブルを使用することができます。これを行うには、店舗と販売テーブルに基づいてビューを作成できます。次に、bcpユーティリティを使用して、ビューで定義されたデータをエクスポートできます。INSERTステートメントを使用してビューに行を挿入できる場合、bcpユーティリティまたはBULK INSERTステートメントを使用して、データファイルから特定のビューにデータをインポートすることもできます。データをビューにコピーする際の制限の詳細については、INSERTを参照してください。bcpユーティリティとBULK INSERTステートメントを使用してビューとの間でデータをコピーする方法の詳細については、「ビューとの間のコピー」を参照してください。

分割されたデータを組み合わせるには Transact-SQL UNIONセット演算子をビュー内で使用して、別々のテーブルからの2つ以上のクエリの結果を1つの結果セットに結合できます。これは、パーティションビューと呼ばれる単一のテーブルとしてユーザーに表示されます。たとえば、あるテーブルにワシントンの売上データが含まれ、別のテーブルにカリフォルニアの売上データが含まれている場合、それらのテーブルのUNIONからビューを作成できます。ビューは、両方の地域の売上データを表します。分割ビューを使用するには、いくつかの同一のテーブルを作成し、制約を指定して、各テーブルに追加できるデータの範囲を決定します。次に、これらのベーステーブルを使用してビューが作成されます。ビューがクエリされると、SQL Serverはクエリの影響を受けるテーブルを自動的に判別し、それらのテーブルのみを参照します。例えば、クエリでワシントン州の販売データのみが必要であると指定されている場合、SQL Serverはワシントンの販売データを含むテーブルのみを読み取ります。他のテーブルにはアクセスしません。

パーティションビューは、同じデータベース内のテーブルだけでなく、リモートサーバーなどの複数の異種ソースからのデータに基づくことができます。たとえば、組織の異なる地域のデータをそれぞれ格納する異なるリモートサーバーからのデータを組み合わせるには、各データソースからデータを取得する分散クエリを作成し、それらの分散クエリに基づいてビューを作成します。クエリは、クエリで要求されたデータを含むリモートサーバーのテーブルからデータのみを読み取ります。ビュー内の分散クエリによって参照される他のサーバーにはアクセスされません。

データを複数のテーブルまたは複数のサーバーに分割する場合、スキャンするデータが少ないため、データの一部にのみアクセスするクエリはより高速に実行できます。テーブルが異なるサーバー上にある場合、または複数のプロセッサを搭載したコンピューター上にある場合は、クエリに関係する各テーブルを並行してスキャンすることもできるため、クエリのパフォーマンスが向上します。さらに、インデックスの再構築やテーブルのバックアップなどのメンテナンスタスクをより迅速に実行できます。分割ビューを使用することで、データは単一のテーブルとして表示され、正しい基になるテーブルを手動で参照しなくても、そのようにクエリできます。

パーティションビューは、次のいずれかの条件が満たされた場合に更新可能です。INSTEAD OFトリガーが、INSERT、UPDATE、およびDELETEステートメントをサポートするロジックを使用してビューに定義されています。

ビューとINSERT、UPDATE、DELETEステートメントはどちらも、更新可能なパーティション分割ビューに対して定義されたルールに従います。詳細については、「分割ビューの作成」を参照してください。

https://technet.microsoft.com/en-us/library/aa214282(v=sql.80).aspx#sql:join


5

一般的な理由は次の2つです。

安心してお使いいただけます。メインテーブルに権限を付与せず、列または行のアクセスを制限するビューを作成し、ビューを表示する権限をユーザーに付与します。

便利にお使いいただけます。ビューで常に一緒に使用するいくつかのテーブルを結合します。これにより、クエリを一貫性のある簡単なものにすることができます。


3

これを行う理由は複数あります。すべての結合を実行する代わりに、テーブル名をクエリするだけでよくある一般的な結合クエリが簡単になる場合があります。

別の理由は、データを別のユーザーに制限することです。たとえば:

表1:列-USER_ID; USERNAME; SSN

管理ユーザーは実際のテーブルで特権を持つことができますが、SSNを言うためのアクセス権を必要としないユーザーは、次のようにビューを作成します。

CREATE VIEW USERNAMES AS SELECT user_id、username from FROM Table1;

次に、テーブルではなくビューにアクセスする権限をユーザーに付与します。


2

レガシーデータベースに関するレポートを作成する場合、ビューは天の恵みになる可能性があります。特に、わかりにくい5文字の名前(そのうちの2つは一般的な接頭辞です)の代わりにセンシカルなテーブル名を使用したり、当時は私が理解したと思われる略語でいっぱいの列名を使用したりできます。


2

一般的には、ビューを使用して作業を簡単にし、複数のテーブルに格納されているエンティティから詳細を取得し(コード内の多くの結合を削除して読みやすくする)、複数のデータベースでデータを共有したり、挿入を読みやすくしたりします。


2

ここでは、ビューとユーザーがテーブルで更新できる列を制限する権限を使用する方法を示します。

/* This creates the view, limiting user to only 2 columns from MyTestTable */
CREATE VIEW dbo.myTESTview 
WITH SCHEMABINDING AS
SELECT ID, Quantity FROM dbo.MyTestTable;

/* This uses the view to execute an update on the table MyTestTable */
UPDATE dbo.myTESTview
SET Quantity = 7
WHERE ID = 1

1

テーブルやビューのスナップショットを表示したいとき(読み取り専用で)


1
「テーブルのスナップショット」とはどういう意味ですか?いつ、なぜそれをしたいですか?
MedicineMan、

多くのシナリオがあります。テーブルに影響を与えたり下線を引いたりせずに、テーブルに対して複雑なクエリ/ストア手順を実行したいとします。ビュー(読み取り専用の表現)を作成します
vehomzzz '14

したがって、複雑なクエリストアプロシージャを実行する場合は、読み取り専用でビューにアクセスできませんか?ここであなたが話していることを「理解」するためのデータベースの経験は本当にありません。詳細な例を詳しく説明または提供できますか?
MedicineMan、

1

クエリを実行しているだけのときに、ストアドプロシージャのビューを使用するのが好きです。ビューは、セキュリティを簡素化し、複数のテーブルへの挿入/更新を容易にするために使用でき、データのスナップショット/実体化(長時間実行クエリを実行し、結果をキャッシュしておく)に使用できます。

リアルタイムで正確に保つ必要がないクエリを実行するためにマテリアライズドビューを使用しました。


ではなくクエリを実行しているとき?どうして?この点はあまり意味がありません
MedicineMan

ビューを使用する場合、DML操作のみを実行していることを知っています。SPを呼び出すと、データを取得する前に他に何も発生しません。つまり、キャッシュ関数を呼び出すと、キャッシュされたデータセットが返される可能性がありますが、SPを必要なすべてのデータで呼び出す必要があるわけではありません。それはデータIMOへのAPIを簡素化します
MattH '17

1

ビューはまた、非常に複雑な構成とテーブルを、簡単に照会できる管理可能なチャンクに分解します。私たちのデータベースでは、テーブル管理システム全体が1つの大きなテーブルからのビューに分割されています。


1

これはあなたの質問に正確に答えるものではありませんが、マテリアライズドビューに言及する価値があると思いました。私の経験は主にOracleに関するものですが、おそらくSQL-Serverはかなり似ています。

私たちは、XMLパフォーマンスの問題に対処するために、アーキテクチャーで同様のものを使用しました。私たちのシステムは、行にXMLとして保存された多くのデータで設計されており、アプリケーションはその中の特定の値をクエリする必要があるかもしれません。多数のXMLTypeを処理し、多数の行にわたってXPathを実行すると、パフォーマンスに大きな影響があるため、実体化されたビューの形式を使用して、ベーステーブルが変更されるたびに目的のXMLノードをリレーショナルテーブルに抽出します。これは、クエリをオンデマンドで実行する標準ビューとは対照的に、ある時点でのクエリの物理的なスナップショットを効果的に提供します。


1

私はストアドプロシージャを自分のデータに対して呼び出すことができるメソッドと見なしていますが、ビューでは、クエリまたはストアドプロシージャを作成できるベースデータの合成バージョンを作成するためのメカニズムを提供しています。単純化または集約が理にかなっている場合は、ビューを作成します。非常に具体的なサービスを提供したい場合は、ストアドプロシージャを記述します。


あなたは小さなサービスの例を与えることができます
メディスンマン

1

ビューの奇妙な点の1つは、ビューがMicrosoft Accessによってテーブルとして認識されることです。ODBCを使用してMicrosoft AccessフロントエンドをSQLデータベースに接続すると、使用可能なテーブルのリストにテーブルとビューが表示されます。したがって、MS Accessで複雑なレポートを準備している場合は、SQLサーバーに結合とクエリを実行させ、人生を大幅に簡略化できます。MS Excelでクエリを準備するための同上。


1

私の実稼働データベースには10ほどのビューしかありません。私はいつも使用する列にいくつか使用します。私が使用する1つのセットは7つのテーブルからのもので、一部は外部結合を持ち、常にビューを選択で呼び出して1つまたは2つの結合を作成するだけでよいという書き直しではありません。私にとっては、それは時間の節約に過ぎません。


これが質問の範囲外である場合はご容赦ください。ただし、これについて言及している人もいます。これを行うと、何らかのパフォーマンスの低下が発生しませんか?
MedicineMan、

どういたしまして。SQL Serverオプティマイザーは、ビューと同等のSQL結合の場合と同様に、ビューから*を選択するのとまったく同じ計画を示しています
ブライアンスペンサー、

1

メインテーブル(Productsテーブルなど)と参照テーブル(ProductTypeまたはProductDescriptionByLanguageなど)間のすべての関係をマップするxxxを作成しています。これにより、外部キーから説明に翻訳された製品とそのすべての詳細を取得できるビューが作成されます。次に、ORMを使用してオブジェクトを作成し、グリッドやコンボボックスなどを簡単に構築できます。



0

まず、クエリの複雑さを隠すためです。これはビューに非常に適しています。データベーステーブルを正規化すると、どのように増加しますか?テーブルの数が増えると、データをフェッチするのが非常に困難になります。


あなたがそれをグーグルするならば、あなたはこの質問のために非常に明確な情報を持っているでしょう。
Chella

0

テーブル内のすべての行/列へのアクセスを制限または制限するビューを作成します。所有者が特定または制限された行/列のみを共有する必要がある場合は、それらの列でビューを作成します。


これは、ビューを使用する必要がある、または使用できる理由の1つにすぎません。
Alexander

0

セキュリティのために:ユーザーまたはユーザーのグループが表示を許可されている特定のデータを含む少数のビューを通じてのみ、データベースにアクセスするためのアクセス許可を各ユーザーに付与し、他のデータへのユーザーアクセスを制限します。

クエリと構造のシンプルさ:ビューは複数のテーブルからデータを引き出して単一のテーブルを表示できるため、情報が簡素化され、ビューの複数テーブルクエリが単一テーブルクエリに変換され、データベース構造の特定のビューが表示されます。特定のユーザーまたはユーザーグループに固有の仮想テーブルのセットとしてのデータベース。

一貫性のあるデータベース構造を作成する場合:基になるソーステーブルが変更されても、ビューはデータベース構造の一貫した変更されていないイメージを表示します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.