Postgresまで:見解と具体化された見解


見解とは


簡単に言えばview クエリへの便利なショートカットです.ビューを作成するには、新しいテーブルやデータが含まれません.実行されると、基になるクエリが実行され、結果がユーザーに返されます.

基本的な例


大学のデータベースから次の表を持っています.

学生


ID
名称
種類
1
アーロン
学部
2
ザック
卒業生
3
ジョイ
卒業生

コース


ID
タイトル
コード
1
Postgres入門
PG 101
2
認証理論
AUTH205
3
基礎物性
スープラ

等級


ID
スチューデント
クレッセント
結果
1
1
1
ビープラス
2
1
3
エー
3
2
2
エー
4
3
1
エー
5
3
2
エー
6
3
3
B
すべての3つのテーブルからなるビューを作成するには、次のようになります.
CREATE VIEW transcripts AS
    SELECT
        students.name,
        students.type,
        courses.title,
        courses.code,
        grades.result
    FROM grades
    LEFT JOIN students where grades.student_id = students.id
    LEFT JOIN courses where grades.course_id = courses.id;
一度完了したら、以下のようになります.
SELECT * FROM transcripts;
追加のパラメータやオプションについてはhere .

なぜ我々はそれを使用する必要がありますか?


ビューは、次の側面に基づいてデータを読み込む際に非常に便利です.

シンプル


クエリが複雑になり、複数の行を占有し始めると、それを呼び出して面倒になります.我々が定期的にそれを実行するとき、それはさらに明らかになります.上の例では、繰り返し実行しないでください.
SELECT
    students.name,
    students.type,
    courses.title,
    courses.code,
    grades.result
FROM grades
LEFT JOIN students where grades.student_id = students.id
LEFT JOIN courses where grades.course_id = courses.id;
代わりにこれを実行できます:
SELECT * FROM transcripts;
また、ビューは典型的なテーブルのように動作します.このように、我々は安全にそれ以降のためにそれを使用することができますJOIN sまたは別のビューが既に含まれるクエリからビューを作成します.

一貫性


そのシンプルさとともに、ビューを繰り返し実行するときに間違いの可能性が減少することを保証する一貫性に沿って表示されます.上記のクエリを参照すると、他のクエリの一部になります.ある日、私たちはPostgresにコース導入を除外したいと決めるかもしれません.上記のクエリは次のようになります.
SELECT
    students.name,
    students.type,
    courses.title,
    courses.code,
    grades.result
FROM grades
LEFT JOIN students where grades.student_id = students.id
LEFT JOIN courses where grades.course_id = courses.id
WHERE courses.code != 'PG101';
ビューなしでは、新しいルールを追加するために、すべての依存するクエリに移動する必要があります.これをすることによって、Typosから生じる誤りと矛盾の可能性の増加があります.ビューを使用すると、ビューのコピーで基本的なクエリを変更する必要があります.このビューを使用する他のクエリに変更を適用します.

論理組織


ビューを使用すると、クエリに名前を付けることができます.これを行うのは、同じデータベースで動作するチームで非常に役に立ちます.クエリが何を意味するかを推測しようとするのではなく、よく名前付きのビューとしてそれを簡単に説明することができます.たとえば、ビューのコピーの名前を見ることによって、基礎となるクエリが学生、コース、グレードテーブルを含むことが推測できます.

セキュリティ


ビューを使用して、ユーザーに提示されるデータの量と種類を制限することもできます.代わりに、ユーザーがテーブルのセットに直接アクセスできるように、我々は代わりにビューを提供します.これによって、根底にあるクエリーでそれらを含まないことによって、敏感なコラムを読むのを防ぐことができます.

実体化された見解とは何か


エーmaterialized view は、ビューの形式ですが、ストレージにその結果のデータを物理的に格納する機能を追加しました.同じ基本的なクエリを与えられた後に、実体化されたビューの後の読み込みで、結果を返すのにかかる時間は、従来のビューのそれよりずっと速いでしょう.そして、これはデータが容易に実体化された見解のために手に入るので、典型的な見解はその場で基礎となる質問を実行するだけです.

基本的な例


上記のテーブルと基本的なクエリの同じセットを使用すると、新しい具体化ビューは次のようになります.
CREATE MATERIALIZED VIEW transcripts AS
    SELECT
        students.name,
        students.type,
        courses.title,
        courses.code,
        grades.result
    FROM grades
    LEFT JOIN students where grades.student_id = students.id
    LEFT JOIN courses where grades.course_id = courses.id;
その後、具体化されたビューを読むことができます.
SELECT * FROM transcripts;
追加のパラメータやオプションについてはhere .

爽快


残念ながら、物質化された見解のトレードオフデータは常に最新であるとは限りません.我々は、データがあまりに古くなるのを防ぐために定期的にそれをリフレッシュする必要があるでしょう.こうする
REFRESH MATERIALIZED VIEW transcripts;

いつ我々は従来のビューでこれを使用する必要がありますか?


具体化されたビューは、クエリやビューの実行時間が耐えられなくなったり、ビジネスのサービスレベルの合意を超える場合に便利です.これらは、複数のテーブルおよび何十万もの行を含むビューまたはクエリで発生する可能性があります.しかしながら、そのようなビューを使用する場合、データが最新でないことに対する耐性があるはずです.我々はスケジュールを定期的にデータがあまりにも時代遅れになっていないことを確認するためにリフレッシュする必要があります.
具体化されたビューを作成することは、非効率的なクエリーの解決策ではないことに注意してください.実行中のクエリを最適化するすべてのオプションは、具体化されたビューを実行する前に消耗する必要があります.

結論


Postgresビューと実体化されたビューは、一般的に使用されるクエリから結果を整理して表示する素晴らしい方法です.お互いに非常に似ているが、それぞれの目的があります.ビューはクエリを実行するプロセスを簡素化します.具体化された見解は、より古くなったかどうか最新のデータでないかのトレードオフで遅い実行中のクエリーにアクセスするプロセスをスピードアップすることによってこれに加えます.
ティルPostgresは進行中のシリーズですSupabase それは定期的にPostgreSQLについての情報の断片を共有し、うまくいけば何か新しいものを学ぶことを提供することを目指しています.😉
我々の将来の特徴とFreeBiesのどんな新しいポストまたは発表も、devで最初にここで作ります.あなたが見逃すことはないように私たちに従ってください.