GraphSQL APIをPostgresで最適化する
このブログ記事はPostgresといくつかの最も人気のある機能を紹介します.
Postgres features
Conclusion
<--カードエンド:マークダウン--カードの開始:HTML
Postgresについて
<--カードエンド:HTML
Postgresは高度なデータ型と高度なパフォーマンスの最適化をサポートしています.
Postgresの機能
Postgresには、Hasura GraphSQL APIを拡張するためのいくつかの機能があります.以下に記載する.
Postgresの制約
Postgres constraints データベーステーブルの列の規則を定義するために使用されます.無効なデータがデータベースに入力されないことを確認します.
Postgresで使用することができるさまざまな種類の制約があります.
主キー制約
エー
PRIMARY KEY
はテーブルの各行を一意に識別するために使われる.例:著者のIDを著者表の主キーとして識別します.
CREATE TABLE authors(
id INT PRIMARY KEY,
name TEXT NOT NULL
);
外部キー制約外部キー制約は、列内の値が別のテーブルの行に表示される値と一致することを指定します.外部キー制約は、テーブル間の関係を作成するために使用されます.
例:定義
author_id
記事表の「id」列の外部キーとして「記事表」でCREATE TABLE authors(
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE
);
CREATE TABLE articles(
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
author_id INTEGER,
FOREIGN KEY (author_id) REFERENCES authors (id)
);
NOT NULL制約NOT NULL制約を指定すると、カラムの値を指定できません
null
.例:著者の名前がnullでないことを確認します.
CREATE TABLE authors(
id SERIAL PRIMARY KEY,
name TEXT NOT NULL
);
ユニークな制約一意の制約は、各列の複製値でデータベースエントリを防ぐ.
例:著者のメールが一意であることを確認します.
CREATE TABLE authors(
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE
);
制約条件のチェック制約をチェックすると
Boolean
つまたは複数の列の式.このブール式を満たさなければならないtrue
) 挿入するオブジェクトのカラム値によって.例:著者の評価が1から10の間であることを確認します.
CREATE TABLE authors(
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
rating INT NOT NULL CHECK(rating > 0 AND rating <= 10)
);
Postgresの制約Postgresの制約は、HASURAで基本的なデータ検証のためのカスタムロジックコードを書くのを避けるのを助けるでしょう.
ほとんどのPostgresの制約(主キー、外部キー、NOT NULLおよび一意の制約)は、Hasuracreating tables .
Postgresのチェック制約は、Hasuraのデータ検証の形式として使用できますas described here .
Postgresビュー
エーPostgres view はPostgresの仮想テーブルです.それはPostgresの一つ以上の基礎的なテーブルへの問い合わせの結果を表します.ビューは、これらのクエリを一度ビューで定義されているので、複雑なクエリを簡素化するために使用され、その後、直接同じように照会することができます.
標準的見解
例1 :評価が6より大きい作者との表示
CREATE VIEW popular_authors AS
SELECT name, rating
FROM authors
WHERE rating > 6;
作成したビューを次のように問い合わせることができます.SELECT name, rating from popular_authors;
例2 :作者の評価による表示CREATE VIEW authors_ordered_by_rating AS
SELECT name, rating
FROM authors
ORDER BY rating;
作成したビューを次のように問い合わせることができます.SELECT name, rating from authors_ordered_by_rating;
実体化された見解上記の標準ビューに比べてmaterialized views データベースに物理的にデータを保存します.複雑なクエリからのデータをすばやくアクセスする必要がある場合、具体化されたビューが使用されます.
例:評価が6より大きく、アクティブである作者との具体化されたビュー.
CREATE MATERIALIZED VIEW popular_active_authors AS
SELECT name, rating
FROM authors
WHERE rating > 6 AND is_active = TRUE
ORDER BY rating;
作成された具体化ビューは次のようになります.SELECT name, rating from popular_active_authors;
爽やかな実体観具体化された見解は常に最新のデータを持っていない.クエリの結果はキャッシュのように実体化されたビューに格納されているので、定期的に更新する必要があります.
REFRESH MATERIALIZED VIEW popular_active_authors;
具体的なビューを定期的にリフレッシュすることができますPostgres triggers .Postgresビュー
Postgresビューを使用して、Hasuraを使用して、テーブルのフィールドのサブセットを公開することもできます
ORDER_BY
and GROUP_BY
. ビューを作成した後、Grapql API上で公開し、通常のテーブルのように問い合わせます.
参照here ハサラでのビューの作成と公開.
Postgres関数
Postgres functions 宣言、割り当て、および条件付きワークフローなどのいくつかのステートメントを含めることができる操作のセットを定義することによって、データベーススキーマをカスタマイズできます.Postgres関数はビューと似ていますが、より手続き的な計算を許可し、引数をとることができます.
例:検索記事
以下の関数を作成し、後で入力テキスト引数に基づいて記事を検索することができます
search
.CREATE FUNCTION search_articles(search text)
RETURNS SETOF article AS $$
SELECT *
FROM article
WHERE
title ilike ('%' || search || '%')
OR content ilike ('%' || search || '%')
$$ LANGUAGE sql STABLE;
別々にこの機能を壊しましょうsearch_articles
search
名前とtext
は型ですかSETOF article
SELECT
until the end of the WHERE
条項sql
言語hasuraでは、Postgres関数を使用してカスタムビジネスロジックをカプセル化するか、組み込みのSQL関数と演算子を拡張できます.Postgres関数はhasuraのgraphqlスキーマで公開できます.これらは通常、データベース内のカスタムビジネスロジックを実行するために使用されます.
参照this page より多くのユースケースのために、そして、HasuraでPostgres機能を作成して、公開する方法の指示のために.
Postgresトリガ
Postgres triggers は、特定のデータベースイベントの前または後に以前に定義されたPostgres関数を呼び出すために使用される.
INSERT
) 発生する.例1記事を挿入または更新する前にPostgres関数をトリガーします.
関連記事が挿入されるか、更新されることができる前に、著者が活発であるかどうかチェックしたいと言いましょう.以下のPostgres関数を使って行うことができます.
CREATE FUNCTION check_author_active()
RETURNS trigger AS $BODY$
DECLARE active_author BOOLEAN;
BEGIN
SELECT author.is_active INTO active_author FROM "authors" author WHERE author.id = NEW."author_id";
IF active_author != TRUE THEN
RAISE EXCEPTION 'Author must be active';
END IF;
RETURN NEW;
END;
$BODY$ LANGUAGE plpgsql;
今、私たちは新しい記事が挿入されるか、更新されるときはいつでも、この機能を実行したいです.Postgresトリガを次のように作成できます.CREATE TRIGGER insert_article BEFORE INSERT OR UPDATE
ON "articles" FOR EACH ROW EXECUTE PROCEDURE check_author_active();
現在アクティブになっていない著者の記事を挿入しようとすると、次のエラーがスローされます.unexpected : Author must be active
例2 :著者が挿入されたときに具体化されたビューを更新する新しい著者が挿入されるたびに、我々は実体化された眺めをリフレッシュしたいと言いましょう.
以下のPostgres関数は実体化されたビューを更新します.
CREATE FUNCTION refresh_materialized_view()
RETURNS trigger AS $BODY$
BEGIN
REFRESH MATERIALIZED VIEW popular_active_authors;
RETURN NULL;
END;
$BODY$ LANGUAGE plpgsql;
さて、新しい関数が挿入されるたびにこの関数が呼び出されるようにするには、以下のPostgresトリガーを作成できます.CREATE TRIGGER update_materialized_view AFTER INSERT
ON "authors" FOR EACH ROW EXECUTE PROCEDURE refresh_materialized_view();
Postgresトリガ&Postgresトリガは、Hasuraのデータ検証の形式として使用できますas described here .
Postgresインデックス
Postgres indexes 頻繁に問い合わせられるカラムでパフォーマンスを上げる方法です.コンセプトは本のインデックスの1つに似ています.これは、より迅速に追加のメタデータを維持することによって探しているデータにアクセスすることができます.
例:テーブル作者の列名にインデックスを作成する
例えば、データベースの名前によって質問されている多くのリクエストを受信した場合、
SELECT * FROM authors WHERE name = 'J.K. Rowling';
これで、インデックスを作成できますname
コラムauthors
表CREATE INDEX author_name_index ON authors (name);
データベースは、より迅速にこれらのクエリの結果を調べることができるので、これらのクエリのパフォーマンスが大幅に増加します.Postgresインデックスと
インデックスは、Hasuraのクエリパフォーマンスを最適化するために使用できます.Refer to this page クエリのパフォーマンスに関する情報、およびPostgresインデックスをhasuraに追加する方法について.
結論
私たちは、Hathura Graphics APIがPostgres機能のいくらかを使用して拡張されて、改善されることができる方法を見ました.これらの機能の詳細については、チェックアウトPostgres documentation .
Reference
この問題について(GraphSQL APIをPostgresで最適化する), 我々は、より多くの情報をここで見つけました https://dev.to/hasurahq/optimizing-your-graphql-api-with-postgres-5ealテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol