ビューは何に適していますか?


87

私はRDBMSでどのようなビューが使用されているかについての一般的な考えを得ようとしているだけです。つまり、私はビューとは何か、どのようにビューを作成するかを知っています。また、過去に何のために使用したかも知っています。

しかし、ビューが何に役立つのか、ビューが何に役立つべきではないのかを徹底的に理解したいと思います。すなわち:

  1. ビューは何に役立ちますか?
    • ビューを使用するべきではないときに、ビューを使用したくなるような状況はありますか?
    • テーブル値関数などの代わりにビューを使用するのはなぜですか?
    • 一見しただけではわからない、ビューが役立つかもしれない状況はありますか?

(そして、記録のために、これらの質問のいくつかは意図的にナイーブです。これは部分的に概念チェックです。)


1
質問に似ては、ここに掲載:stackoverflow.com/questions/1278521/...
メディスンマン

私は、stackoverflow.com / questions / 1278521 / … この質問に対するより良い答えを提供していると感じています。
GinTonic

回答:


42

1)ビューは何に役立ちますか?

IOPOは1

か所のみ•結合されたテーブルを参照するデータ自体またはクエリのどちらを検討する場合でも、ビューを使用することで、不要な冗長性を回避できます。

ビューは、テーブルへの直接アクセスを防ぐ抽象化レイヤーも提供します(物理的な依存関係を参照する結果として生じる手錠)。実際に、私はそれがだと思う良い練習1のようなビューを含む、(ビュー&テーブル値関数を使用して)あなたの基礎となるデータのみに抽象化されたアクセスを提供するために1ないIとして、I haftaは私が言うようにしてください」の良い取引があります認めますそのアドバイスで」

CREATE VIEW AS
      SELECT * FROM tblData


2)ビューを使用すべきではないのに、ビューを使用したくなるような状況はありますか?

以前はビュー結合のパフォーマンスが問題でした(SQL 2000など)。私は専門家ではありませんが、しばらく心配していません。(または、現在ビュー結合を使用している場所を考えることはできません。)

ビューが過剰になる別の状況は、ビューが1つの呼び出し場所からのみ参照され、代わりに派生テーブルを使用できる場合です。匿名型が一度だけ使用/参照される場合、匿名型が.NETのクラスよりも望ましいです。

    •http://msdn.microsoft.com/en-us/library/ms177634.aspxの派生テーブルの説明を参照してください

3)テーブル値関数などの代わりにビューを使用するのはなぜですか?

(パフォーマンス上の理由は別として)テーブル値関数は、パラメーター化されたビューと機能的に同等です。実際、一般的な単純なテーブル値関数の使用例は、単一のオブジェクト内の既存のビューにWHERE句フィルターを追加することです。

4)一見しただけではわからない、ビューが役立つかもしれない状況はありますか?

頭のてっぺんの見かけ以外の使い方は考えられません。(もしできれば、それらが明らかになると思います;)

9
SELECT * FROM tblDataの場合、テーブルにビューを作成することが理にかなっていることに同意しません。なぜこれが有益であるのかについて説明してもらえますか?
登録ユーザー

IOPO-1か所のみ-これは有名なデザインフレーズですか?それへの多くの参照を見つけることができないようですか?DRYなどの他の形式はありますか?
ロバート

1
@Robertはい、DRY、正規化、IOPO、これらはすべて同じ哲学の異なるフレーバーです。
TylerH

45

ある意味で、ビューはインターフェースのようなものです。基本となるテーブルの構造は自由に変更できますが、ビューを使用すると、コードを変更する必要がなくなります。

ビューは、ライターにレポートする簡単なものを提供する良い方法です。ビジネスユーザーがCrystal Reportsなどからデータにアクセスしたい場合は、アカウント内でデータを簡略化するビューを提供できます。データを非正規化することもできます。


21

ビューはセキュリティを提供するために使用できます(つまり、ユーザーはテーブル内の特定の列にのみアクセスするビューにアクセスできます)、ビューは更新や挿入などに追加のセキュリティを提供できます。ビューは列名にエイリアスを付ける方法も提供します( sp's)ですが、ビューは実際のテーブルからの分離です。


18

ある意味では、ビューは非正規化されます。より意味のある方法でデータを提供するために、非正規化が必要になる場合があります。これは、多くのアプリケーションがオブジェクトのドメインモデリングを使用して行うことです。これらは、ビジネスの視点により近い方法でデータを表示するのに役立ちます。


-1「ビューが非正規化」?申し訳ありませんが、何らかの形で修飾されていない限り、それはナンセンスです。
だれかが

18
彼らは絶対に非正規化します。3番目の公称形式に正規化された関連テーブルがあり、その関係を「平坦化」するビューを作成する場合、これは非正規化ではないのですか?
Kilhoffer

11

他の人が述べたことに加えて、ビューはアプリケーションからより複雑なSQLクエリを削除するのにも役立ちます。

例として、アプリケーションでの代わりに:

sql = "テーブル1のユニオンからa、bを選択し、テーブル2からa、bを選択します";

あなたはそれをビューに抽象化することができます:

ビューunion_table1_table2_vを作成
を選択し、A、TABLE1のからB
組合
表2から、Bを選択

そして、アプリのコードでは、単に次のようにします:

sql = "selection a、b from union_table1_table2_v";

また、データ構造が変更された場合でも、アプリのコードを変更し、再コンパイルして再デプロイする必要はありません。データベースのビューを変更するだけです。


アプリではなくデータベースに複雑なSQLを書きたいのはなぜですか?
Ivan Virabyan

3
クエリが複雑になるほど、より多くのテーブルにヒットするために、将来的に変更される可能性が高くなります。DB構造が変更されると、コードも変更してリリースを行う必要があります。その複雑さがビューで抽象化されている場合、DBAは、コードを変更しなくても、基礎となるテーブルに構造的な変更を加えることができる場合があります。
CodingWithSpike

11

ビューはデータベースの複雑さを隠します。これらは多くの理由で優れており、多くの状況で役立ちますが、独自のクエリやレポートを作成することを許可されているユーザーがいる場合は、それらを安全な手段として使用して、不適切に設計されたものを送信しないようにすることができますデータベースサーバーを停止させる厄介なデカルト結合を使用したクエリ。


6

OPは、ビューを使用したくなるかもしれない状況があるかどうか尋ねましたが、それは適切ではありません。

ビューを使用したくないのは、複雑な結合の代わりです。つまり、問題をより小さな部分に分解するという手続き型プログラミングの習慣が、1つの大きな結合ではなく、結合された複数のビューを使用することにつながるのを許さないでください。これにより、1つの大きなクエリではなく、基本的に複数の個別のクエリが実行されるため、データベースエンジンの効率が低下します。

たとえば、テーブルA、B、C、およびDを結合する必要があるとします。テーブルAとBからビューを作成し、CとDからビューを作成してから、2つのビューを結合したくなるかもしれません。1つのクエリでA、B、C、Dを結合する方がはるかに優れています。


私はそうではないと思います、少なくともそれはDBMS理論がどうなっているかではありません(さまざまな実装が理論を尊重しないことを決定するかもしれません)。クエリパーサーは基本的に、表示するすべてのビューを対応するsqlで置き換え、オプティマイザーはそこから移動します。2つのケースは同等である必要があります。
SquareCog 2008年

これは、ビューにインデックスを追加できる場合にも当てはまりません。
therealhoff 2008年

私はPostgreSQLに最も精通しており、以前のバージョンはクエリの結合に関してあまりよくありませんでした。しかし、新しいものははるかに優れています。私の答えは、少なくともこの特定のDBMSにはあまり当てはまりません。
バリーブラウン

5

ビューはデータを一元化または統合できます。私がいるところには、いくつかの異なるリンクサーバー上にいくつかの異なるデータベースがあります。各データベースは、異なるアプリケーションのデータを保持します。これらのデータベースのいくつかは、さまざまなアプリケーションに関連する情報を保持しています。このような状況で実行するのは、そのアプリケーションのデータベースに、データが実際に格納されているデータベースからデータをプルするだけのビューを作成することです。これにより、作成するクエリが異なるデータベースを経由しているように見えなくなります。


4

これまでの応答は正しいです。ビューは、セキュリティ、非正規化(間違った場合はその道のりにかなりの苦痛があります)、データモデルの抽象化などを提供するのに適しています。

さらに、ビューは一般的にビジネスロジックを実装するために使用されます(失効したユーザーとは、過去40日間ログインしていないユーザーのことです)。


7つの参照テーブルを用意することによって非正規化し、それらの参照テーブルの1つだけを必要とするものに対してクエリを実行した場合。それは多くの無駄な努力です。このようなビューに参加し始めると、これはさらに悪化します。
SquareCog 2008年

あなたはこれについて確信を持っていますか?MSDNは、「SQL Serverが名前でビューを参照するクエリを処理するとき、ビューの定義は通常、ベーステーブルのみを参照するまで拡張されます。このプロセスはビュー拡張と呼ばれます。マクロ展開の一種です。」拡張プロセス中に、エンジンはクエリに必要な(ビューの)基になるテーブルのみを含めるのに十分なほどスマートになると思います。
Anthony、

アンソニー、「select foo_col from(select foo。*、bar。* from foo join bar on(foo.id = bar.id)」のようなクエリを想像してみてください。このクエリでは、内部のselectがビューです。棒結合を安全に削除できることを明確にします(実際には、関係が厳密に1-1でない場合、それはできません)。これは、より複雑なクエリではさらにトリッキーになるため、汎用RDBMSにすべての操作を依頼することはお勧めしません。人間の刈り込みができるかもしれません
。SQLServer

3

ビューは、SQLスクリプト内で繰り返される複雑なJOINステートメントの多くを保存します。複雑なJOINをビューにカプセル化し、必要なときにSELECTステートメントで呼び出すことができます。これは、すべてのクエリで結合ステートメントを記述するよりも、便利で簡単な場合があります。


2

ビューは、保存された名前付きSELECTステートメントです。ライブラリ関数のようなビューを考えてください。


ストアドプロシージャは、これに見合うだけのものではないでしょうか。場合によっては、削除と更新のビューを備えた関数が必要であり、このニーズに対応できません。ビューは、ターゲットユーザーを制限する抽象化または方法として見る必要があります。
HumbleWebDev

1

レポートのためのビューの使用を強調したかったのです。多くの場合、特にデータの編集と挿入(OLTPの使用)のパフォーマンスを向上させるためのデータベーステーブルの正規化と、レポートおよび分析(OLAPの使用)のクエリのテーブル結合の数を減らすための非正規化の間には矛盾があります。データ入力には最適なパフォーマンスが必要なため、必然的にOLTPが通常優先されます。ビューを作成すると、最適なレポートパフォーマンスが得られるため、両方のクラスのユーザー(データ入力ビューアーとレポートビューアー)を満足させることができます。


1

いくつかのUNIONを含む非常に長いSELECTを覚えています。各UNIONには、SELECTによってオンザフライで作成された価格表への結合が含まれていましたが、それ自体はかなり長く、理解が困難でした。価格表を作成するという見方があれば良かったと思います。これにより、SELECT全体が約半分に短縮されます。

DBがビューを1回評価するか、inが呼び出されるたびに1回評価されるかわかりません。誰か知ってる?前者の場合、ビューを使用するとパフォーマンスが向上します。


Oracle CBOは、ビューを1回評価する(マテリアライズする、それを呼び出す)か、ビューのSQLを残りのselectステートメントにマージして実行するかを選択できます。推定コストがより低いものに基づいて決定します。
WW。

選択ステートメントがクエリ全体で一定であり、単純に数回繰り返された場合、共通テーブル式(CTE)が問題を解決する可能性があります。SQL Server 2000では使用できなかったため、これはSQL Server 2005/2008にのみ適用されます。はい、ビューは繰り返し呼び出されます。
登録ユーザー

@登録ユーザー:CTEはSQL Serverの専門分野ではありません。それらはDB2で始まり、PostgreSQLにも存在します(有用であり、ISO SQL標準に含まれているため)。ビューがインライン化されるか、ブラックボックスとして扱われるかに関係なく、実装に固有のRDBMSは、他のRDBMSよりも優れています。
ちょうど誰かが

@誰か誰か:他のRBDMSでのCTEの経験がないため、コメントはSQL Server 2005/2008に限定されていました。また、コメントは、CTEが2005
登録ユーザー

ビューの別の代替手段は、事前に価格表を一時表に置くことでした。
SeaDrive 2010

0

[my_interface]!= [user_interface]が必要なときはいつでも。

例:

表A:

  • id
  • 情報

表Aのビュー:

  • 顧客情報

これは、顧客に対してIDを非表示にし、情報の名前をより詳細な名前に一度に変更する方法です。

ビューは主キーIDの基礎となるインデックスを使用するため、パフォーマンスの低下は見られず、選択クエリの抽象化が向上するだけです。

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