Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

4 4 Hasura’s Manual Relationship

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

【デモ】店舗アカウントでは指定した店舗の情報だけが見れるようにしたい 12 ✅ ✅ 🚫 マネージャー

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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