Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Hasura の Manual Relationship の便利な使い方

Hiroaki KARASAWA
January 19, 2023
4

Hasura の Manual Relationship の便利な使い方

Hiroaki KARASAWA

January 19, 2023
Tweet

More Decks by Hiroaki KARASAWA

Transcript

  1. Hasura の Relationship と権限管理
    Hiroaki KARASAWA aka karszawa from dinii, inc.
    Hasura User Group Tokyo Meetup #2
    2023/01/19

    View Slide

  2. 自己紹介
    ● 氏名:唐澤弘明
    ○ aka @karszawa
    ● 所属:株式会社 dinii
    ○ 飲食店のモバイルオーダーとレジの会社
    ○ karszawa は黎明期にジョインしほぼすべての技術選定に関与
    ● 興味関心:JavaScript ♡ TypeScript
    ○ コミュニティの大きさと技術の応用範囲が無限に広がっている世界観が好き
    ○ 最近はデータベースが好き(特にポスグレ)
    2

    View Slide

  3. 飲食店の All in One SaaS
    “ダイニー”

    View Slide

  4. 4
    4
    Hasura’s Manual Relationship

    View Slide

  5. GraphQL における resolver の入れ子を復習
    5
    ● orders は customer ごと取得
    ● ⇒ シンプルに実装すると N+1 問題が発生
    ● ⇒ DataLoader によってまとめて取得しておく
    Hasura なら?

    View Slide

  6. Hasura での解決法
    6
    ● SQL が自動で生成される
    ○ ⇒ 自前で DataLoader を実装する必要がなく楽ちん 😎
    ● 無闇矢鱈にネストを深めると恐ろしいクエリが発行される
    ● ※ 自前で定義する場合でも DataLoader ではなく JOIN によるアプローチは可能ではある
    自動生成

    View Slide

  7. Relationship = GraphQL クエリを発行した際にネストで取得できる関連
    7
    ① 外部キー制約による Relationship
    ② 手動で追加する Manual Relationship
    (外部キー制約は不要)

    View Slide

  8. データの紐づき方に応じて定義できる二種類の関連
    8

    View Slide

  9. Manual Relationship の何が便利なのか
    9
    データの取得だけなら外部キー制約がある関連だけでも十分な気がする?

    View Slide

  10. 権限設定にも Relationship を活用できる
    10
    【前提】Hasura はデータベースと直接続なのでデータアクセスの権限管理は Hasura 自体で行う

    View Slide

  11. 【デモ】同じグループの卓であればお互いの注文内容を閲覧できる
    11

    View Slide

  12. 【デモ】店舗アカウントでは指定した店舗の情報だけが見れるようにしたい
    12


    🚫
    マネージャー

    View Slide

  13. なるほど…
    13
    面白いかも?

    View Slide

  14. 任意のテーブルと view を任意のカラムの同一性で設定できる
    14
    “ビューは物理的な実体として存在するものではありません。 ”
    “ その代わり、問い合わせでビューが参照される度に、指定された問い合わせが実行されます。 ”
    日本PostgreSQLユーザ会
    select した結果を table 的なものとし
    て参照できる

    View Slide

  15. 【デモ】多対多の関係をフラットに定義してみる
    15
    複数の卓をまとめて会計する = 合算会計
    一つの卓を複数に分けて会計する = 個別会計

    View Slide

  16. メモ
    CREATE VIEW "tableUser_tableUserPayment_view" AS
    SELECT "tableUserId", onSitePayment.*
    FROM "onSitePaymentTableUsers" LEFT JOIN "onSitePayment"
    ON "onSitePaymentTableUsers"."onSitePaymentId" = "onSitePayment"."onSitePaymentId"
    16

    View Slide

  17. view を使えばかなり柔軟なアクセス制御が可能に
    17
    ● ある時間帯でのみ閲覧可能 ⇒ 期間限定メニュー
    ● 確率的に閲覧可能 ⇒ まぼろし島
    ● ツリー構造の子孫にあたるデータは編集可能 ⇒ 自社サービスとして権限管理を提供する場合
    発想次第!

    View Slide

  18. ここまでやるか?
    18
    Remote Schema で独自にロジックを実装すれば良いんじゃない?
    ⇒ Remote Schema は権限の設定には使えない

    View Slide

  19. 19
    「寿司 虚空編」 小林銅蟲

    View Slide

  20. まとめ
    20
    Custom Relationship を活用するために
    ● SQL 力を高めよう
    ● 自由な発想でクエリを書こう
    ちなみにリモートのデータソース同士を JOIN できる
    ● Remote Database Relationship
    ● Remote Schema Relationship
    というものもある。
    「寿司 虚空編」 小林銅蟲

    View Slide