Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Hasura の Relationship と権限管理
Search
Hiroaki KARASAWA
January 19, 2023
Programming
1.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Hasura の Relationship と権限管理
Hasura User Group Tokyo Meetup #2
2023/01/19
Hiroaki KARASAWA
January 19, 2023
More Decks by Hiroaki KARASAWA
See All by Hiroaki KARASAWA
スタートアップでポストモーテムを4年で200回やって得た学び
karszawa
1
160
DomainException と Result 型で作る型安全なエラーハンドリング
karszawa
1
1.6k
成功する技術選定について
karszawa
2
3.3k
飲食店のインフラサービス “ダイニー” のトラブル対応のすべて
karszawa
0
170
Google Cloud のモニタリング製品を徹底活用してみた
karszawa
0
120
ダウンタイム 30 秒で AlloyDB に移行した話
karszawa
0
590
DMS で AlloyDB に簡単移行!
karszawa
0
130
【現場の本音】App Engine から Cloud Run に移行してみた
karszawa
0
250
cls-hooked による実行コンテキストの保存と利用
karszawa
0
1.1k
Other Decks in Programming
See All in Programming
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
2
300
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
170
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
250
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
500
AHC070解法紹介
eijirou
0
130
巨大モノリシックアプリ モダン化大作戦
ktcryomm
1
1.1k
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
150
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
2.8k
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
220
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
250
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
510
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
310
Featured
See All Featured
Exploring anti-patterns in Rails
aemeredith
4
510
The Language of Interfaces
destraynor
162
27k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
280
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
KATA
mclloyd
PRO
35
15k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
530
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
250
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
310
Git: the NoSQL Database
bkeepers
PRO
432
67k
30 Presentation Tips
portentint
PRO
1
400
Believing is Seeing
oripsolob
1
220
Transcript
Hasura の Relationship と権限管理 Hiroaki KARASAWA aka karszawa from dinii,
inc. Hasura User Group Tokyo Meetup #2 2023/01/19
自己紹介 • 氏名:唐澤弘明 ◦ aka @karszawa • 所属:株式会社 dinii ◦
飲食店のモバイルオーダーとレジの会社 ◦ karszawa は黎明期にジョインしほぼすべての技術選定に関与 • 興味関心:JavaScript ♡ TypeScript ◦ コミュニティの大きさと技術の応用範囲が無限に広がっている世界観が好き ◦ 最近はデータベースが好き(特にポスグレ) 2
飲食店の All in One SaaS “ダイニー”
4 4 Hasura’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" AS SELECT "tableUserId", onSitePayment.* FROM "onSitePaymentTableUsers"
LEFT JOIN "onSitePayment" ON "onSitePaymentTableUsers"."onSitePaymentId" = "onSitePayment"."onSitePaymentId" 16
view を使えばかなり柔軟なアクセス制御が可能に 17 • ある時間帯でのみ閲覧可能 ⇒ 期間限定メニュー • 確率的に閲覧可能 ⇒
まぼろし島 • ツリー構造の子孫にあたるデータは編集可能 ⇒ 自社サービスとして権限管理を提供する場合 発想次第!
ここまでやるか? 18 Remote Schema で独自にロジックを実装すれば良いんじゃない? ⇒ Remote Schema は権限の設定には使えない
19 「寿司 虚空編」 小林銅蟲
まとめ 20 Custom Relationship を活用するために • SQL 力を高めよう • 自由な発想でクエリを書こう
ちなみにリモートのデータソース同士を JOIN できる • Remote Database Relationship • Remote Schema Relationship というものもある。 「寿司 虚空編」 小林銅蟲