Hasura User Group Tokyo Meetup #2 2023/01/19
Hasura の Relationship と権限管理Hiroaki KARASAWA aka karszawa from dinii, inc.Hasura User Group Tokyo Meetup #22023/01/19
View Slide
自己紹介● 氏名:唐澤弘明○ aka @karszawa● 所属:株式会社 dinii○ 飲食店のモバイルオーダーとレジの会社○ karszawa は黎明期にジョインしほぼすべての技術選定に関与● 興味関心:JavaScript ♡ TypeScript○ コミュニティの大きさと技術の応用範囲が無限に広がっている世界観が好き○ 最近はデータベースが好き(特にポスグレ)2
飲食店の All in One SaaS“ダイニー”
44Hasura’s Manual Relationship
GraphQL における resolver の入れ子を復習5● orders は customer ごと取得● ⇒ シンプルに実装すると N+1 問題が発生● ⇒ DataLoader によってまとめて取得しておくHasura なら?
Hasura での解決法6● SQL が自動で生成される○ ⇒ 自前で DataLoader を実装する必要がなく楽ちん 😎● 無闇矢鱈にネストを深めると恐ろしいクエリが発行される● ※ 自前で定義する場合でも DataLoader ではなく JOIN によるアプローチは可能ではある自動生成
Relationship = GraphQL クエリを発行した際にネストで取得できる関連7① 外部キー制約による Relationship② 手動で追加する Manual Relationship(外部キー制約は不要)
データの紐づき方に応じて定義できる二種類の関連8
Manual Relationship の何が便利なのか9データの取得だけなら外部キー制約がある関連だけでも十分な気がする?
権限設定にも Relationship を活用できる10【前提】Hasura はデータベースと直接続なのでデータアクセスの権限管理は Hasura 自体で行う
【デモ】同じグループの卓であればお互いの注文内容を閲覧できる11
【デモ】店舗アカウントでは指定した店舗の情報だけが見れるようにしたい12✅✅🚫マネージャー
なるほど…13面白いかも?
任意のテーブルと view を任意のカラムの同一性で設定できる14“ビューは物理的な実体として存在するものではありません。 ”“ その代わり、問い合わせでビューが参照される度に、指定された問い合わせが実行されます。 ”日本PostgreSQLユーザ会select した結果を table 的なものとして参照できる
【デモ】多対多の関係をフラットに定義してみる15複数の卓をまとめて会計する = 合算会計一つの卓を複数に分けて会計する = 個別会計
メモCREATE VIEW "tableUser_tableUserPayment_view" ASSELECT "tableUserId", onSitePayment.*FROM "onSitePaymentTableUsers" LEFT JOIN "onSitePayment"ON "onSitePaymentTableUsers"."onSitePaymentId" = "onSitePayment"."onSitePaymentId"16
view を使えばかなり柔軟なアクセス制御が可能に17● ある時間帯でのみ閲覧可能 ⇒ 期間限定メニュー● 確率的に閲覧可能 ⇒ まぼろし島● ツリー構造の子孫にあたるデータは編集可能 ⇒ 自社サービスとして権限管理を提供する場合発想次第!
ここまでやるか?18Remote Schema で独自にロジックを実装すれば良いんじゃない?⇒ Remote Schema は権限の設定には使えない
19「寿司 虚空編」 小林銅蟲
まとめ20Custom Relationship を活用するために● SQL 力を高めよう● 自由な発想でクエリを書こうちなみにリモートのデータソース同士を JOIN できる● Remote Database Relationship● Remote Schema Relationshipというものもある。「寿司 虚空編」 小林銅蟲