GraphSQL APIをPostgresで最適化する



このブログ記事はPostgresといくつかの最も人気のある機能を紹介します.
  • About Postgres

  • Postgres features
  • Postgres constraints
  • Postgres views
  • Postgres functions
  • Postgres triggers
  • Postgres indexes

  • Conclusion
    <--カードエンド:マークダウン--カードの開始:HTML

    Postgresについて


    <--カードエンド:HTML
  • Postgres (or PostgreSQL) SQL言語を使用し拡張する汎用オブジェクトリレーショナルデータベース管理システムです.Postgresは無料でオープンソースであり、過去30年間で継続的に開発されました.Postgresは、信頼性の高い、頑丈なパフォーマンスに努めています.
    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
  • パラメータ:1つのパラメータがありますsearch 名前とtext は型ですか
  • 返り値:SETOF article
  • 機能体:ブロックSELECT until the end of the WHERE 条項
  • 言語:応答はsql 言語
  • Postgres関数と
    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 .