Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Firestoreのデータ設計について考える
Search
TakeshiNishi
February 26, 2020
Programming
2.1k
6
Share
Firestoreのデータ設計について考える
「リモートで勉強会#5 - テーマ何でもLT会-」登壇資料です。
FirebaseのNoSQLデータベース「Firestore」のデータ設計についてまとめました。
TakeshiNishi
February 26, 2020
More Decks by TakeshiNishi
See All by TakeshiNishi
LT駆動開発 - 話題のChatGPTで何か作る
takec24
0
200
成長ステージ別のスタートアップ集結!「事業の魅力とチームの本音」
takec24
0
160
Developing FLAPTALK by Firebase
takec24
1
440
NuxtCompositionAPIとFirebaseの話
takec24
1
530
コロナ禍でもリモート案件を途切れさせない! 案件の獲得方法とリモート案件の進め方。
takec24
0
400
フロントエンドエンジニアのためのFirebaseサーバーレス開発徹底解説
takec24
0
1.3k
スタートアップで働くというエンジニアキャリア
takec24
1
1.2k
人生を変えた炎上ブロジェクト
takec24
0
1.6k
好きなことを選び続けたら代表取締役CTOになりました。
takec24
3
1.4k
Other Decks in Programming
See All in Programming
Swiftのレキシカルスコープ管理
kntkymt
0
190
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
270
[BalkanRuby 2026] Drop your app/services!
palkan
3
670
Agentic AI & UI: Arcitecture, HITL, Emerging Standards
manfredsteyer
PRO
0
140
1人1案件のプロダクトエンジニア時代に、"プロセス監督"としてチャレンジしたこと
non0113
0
310
「OSSがあるなら自作するな」は AI時代も正しいか ── Build vs Adopt の新しい判断基準
kumorn5s
7
2.9k
20260514_its_the_context_window_stupid.pdf
heita
0
1.1k
AI Agent と正しく分析するための環境作り
yoshyum
2
600
AI時代になぜ書くのか
mutsumix
0
450
サプライチェーン攻撃対策「層を重ねて落ちない壁」を10日間で組み上げた話 #TechLeadConf2026
kashewnuts
1
360
TypeScriptだけでAIエージェントを作る フロント・エージェント・インフラのフルスタック実践
har1101
6
1k
新規プロダクトを高速で生み出すハーネスエンジニアリング
seanchas116
3
270
Featured
See All Featured
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
160
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
130
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
560
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
180
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
430
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
110
For a Future-Friendly Web
brad_frost
183
10k
Art, The Web, and Tiny UX
lynnandtonic
304
21k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Transcript
ϦϞʔτͰษڧձ#5 - ςʔϚԿͰLTձ- FirebaseͰWebΞϓϦ։ൃͨ͠ ʙ Firestoreͷσʔλઃܭʹ͍ͭͯߟ͑Δ ʙ !@UBLFTIJ@ SFNPTUB
࢙ ʹ͚ͨ͠͠ !@UBLFTIJ@ ࣗݾհ w Ԭͷ4*FSͰγεςϜΤϯδχΞ w ϑϦʔϥϯεϓϩάϥϚʔ w ౦ژͷελʔτΞοϓ$P'PVOEFSऔక$50
w ԬͷελʔτΞοϓͰ৽نࣄۀ্ཱͪ͛ w גࣜձࣾEJ⒎FBTZऔక$50 w ελʔτΞοϓۀ४උதˡࠓ͜͜ /VYUKT'JSFCBTF7VFKT3VCZ($1ϒϩοΫνΣʔϯ ελʔτΞοϓىۀ ম͖ԹઘΩϟϯϓཱྀߦ ແ৬
࠷͍ۙͬͯΔࣄ ୡNF ඪͱظݶΛએݴͯ͠γΣΞʂඪͷྔΛ ՄࢹԽ͠ɺԠԉͯ͠ܨ͕ΔαʔϏεɻ IUUQTUBTTFJNF /VYUKT'JSFCBTF$MPVE'VODUJPOT/PEFKT )BTI5BML Ծ Ձ؍ඪͷڞײͰܨ͕ΔϚονϯάϓϥοτ ϑΥʔϜ4/4
/VYUKT'JSFCBTF$MPVE'VODUJPOT/PEFKT डୗ։ൃ *5ࢧԉ ৽نࣄۀ։ൃʹ͓͚Δٕज़ࢧԉɺ%9ࢧԉɻ ιϑτΣΞडୗ։ൃɻ
'JSFTUPSFͷσʔλઃܭʹ͍ͭͯߟ͑Δ
'JSFCBTF'JSFTUPSFͱʁ Google͕ఏڙ͢ΔBaaS(Backend as a Service) όοΫΤϯυͷॲཧʢೝূɺετϨʔδͷཧɺσʔλϕʔεͷ ཧͳͲʣ͕ෆཁɻ 'JSFCBTFͱʁ 'JSFTUPSFͱʁ FirebaseͷNoSQLσʔλϕʔεɻ
'JSFTUPSFͷσʔλઃܭʹ͍ͭͯߟ͑Δ 'JSFTUPSFͷϦϨʔγϣϯσʔλΛͲ͏औΓѻ͏͔ʁ w 4VC$PMMFDUJPO w ΩʔࢀরϞσϧ w 3FGFSFODFܕ
ηΩϡϦςΟΛҙࣝͨ͠σʔλઃܭ ݖݶཧΧελϜΫϨʔϜΛར༻ / Ͳ͏͢Δʁ
4VC$PMMFDUJPO
4VC$PMMFDUJPOͱʁ VTFST 㸉<6TFS*%> 㸉OBNFlʹ͠z 㸉BHF 㸉EJBSJFT 㸉<%JBSZ*%> c㸉UJUMFlλΠτϧz c㸉DPOUFOUlຊจɻຊจɻz 㸉<%JBSZ*%>
c㸉UJUMFlλΠτϧz c㸉DPOUFOUlຊจɻຊจɻz wσʔλͷ͕ؔΘ͔Γ͍͢ɻ w ֊͕ਂ͍ͱΘ͔Γʹ͘͘ͳΔɻ
4VC$PMMFDUJPO$PMMFDUJPO(SPVQ const snapshot = await app.firestore() .collectionGroup("diaries") .where() .get() wDPMMFDUJPO(SPVQͰ4VC$PMMFDUJPOΛԣஅతʹݕࡧՄೳɻ
,FZࢀরϞσϧ
,FZࢀরϞσϧͱʁ VTFST 㸉<6TFS*%> 㸉OBNFlʹ͠z 㸉BHF EJBSJFT 㸉<%JBSZ*%> c㸉VTFS*E c㸉UJUMFlλΠτϧz c㸉DPOUFOUlຊจɻຊจɻz
㸉<%JBSZ*%> c㸉VTFS*E c㸉UJUMFlλΠτϧz c㸉DPOUFOUlຊจɻຊจɻz
4VC$PMMFDUJPOͱ,FZࢀরϞσϧͲͬͪ͏ʁ ୯७ͳࢠؔͩͬͨΒɺ4VC$PMMFDUJPO ݕࡧͷύλʔϯ͕ෳ͋Εɺ,FZࢀরϞσϧ ֊͕ਂ͘ͳΔͷɺ,FZࢀরϞσϧ 4VC$PMMFDUJPOͱ,FZࢀরϞσϧͲͪΒΛ͏͔ʁ அج४ʁʁ ࢲͷஅج४
3FGFSFODFܕ ࢀরܕ
3FGFSFODFܕͱʁ EJBSJFT 㸉<%JBSZ*%> c㸉UJUMFlλΠτϧz c㸉DPOUFOUlຊจɻຊจɻz c㸉VTFSVTFST<VTFS*%> 㸉<%JBSZ*%> c㸉UJUMFlλΠτϧz c㸉DPOUFOUlຊจɻຊจɻz c㸉VTFSVTFST<VTFS*%>
w/ͷࢠؔͷσʔλͰ3FGFSFODFܕΛར༻ɻ
3FGFSFODFܕͷऔಘ const diary = await app.firestore() .collection("diaries") .doc([diaryID]) .get() const
user = diary.data().user.get() w ࢠͷσʔλͷऔಘ͕༰қɻ
ηΩϡϦςΟΛҙࣝͨ͠σʔλઃܭ
'JSFTUPSFͰηΩϡϦςΟϧʔϧͷઃܭ͕େࣄ service cloud.firestore { match /databases/{database}/documents { match /users/{userId} {
allow read; allow create: if request.auth.uid != null; allow update, delete: if request.auth.uid == userId; } ɹ} } جຊతʹϑϩϯτΤϯυ͔Βૢ࡞Ͱ͖ΔͷͰɺϑϩϯτΤ ϯυଆͰ6TFS*%ΛِՄೳɻ
ηΩϡϦςΟΛҙࣝͨ͠σʔλઃܭ ྫ Ϣʔβʔͷࢯ໊ɺॅॴɺ࿈བྷઌͳͲͷݸਓใͱɺχοΫωʔ ϜɺϓϩϑΟʔϧࣸਅͳͲͷެ։ใΛ࣋ͭσʔλ VTFST 㸉<6TFS*%> 㸉OJDLOBNFlʹ͠z 㸉QSPpMFlYYYYYYYKQHz 㸉OBNFl࢙z 㸉BEESFTTlԬࢢ౦۠ɾɾɾz
㸉FNBJMlUBLFTIJ!IPHFIPHFDPNz ϑΟʔϧυ୯ҐͰηΩϡϦςΟϧʔϧઃఆ Ͱ͖ͳ͍ͷͰɺެ։͞Εͯ͠·͏ʂʂ
ηΩϡϦςΟΛҙࣝͨ͠σʔλઃܭ VTFST 㸉<6TFS*%> 㸉OJDLOBNFlʹ͠z 㸉QSPpMFlYYYYYYYKQHz QSJWBUFT 㸉<6TFS*%> 㸉OBNFl࢙z 㸉BEESFTTlԬࢢ౦۠ɾɾɾz 㸉FNBJMlUBLFTIJ!IPHFIPHFDPNz
DPMMFDUJPOΛ͚Δɻ
ݖݶཧΧελϜΫϨʔϜΛར༻
ݖݶཧΧελϜΫϨʔϜΛར༻ ྫ BENJOϢʔβʔཧऀը໘Λར༻Ͱ͖ͯɺҰൠϢʔβʔ ཧऀը໘Λར༻Ͱ͖ͳ͍ɻ await admin.auth().setCustomUserClaims( uid, { admin: true
} ) if(user.customClaims.admin) { } ΧελϜΫϨʔϜʹʮBENJOʯΛઃఆ BENJOͷ߹ͷΈॲཧΛߦ͏ w ΧελϜΫϨʔϜݖݶཧͷΈར༻ɻ w ϢʔβʔͷใDPMMFDUJPOΛར༻ɻ
/ Ͳ͏͢Δʁ
/ Ͳ͏͢Δʁ db.collection(“diaries”).get() .then(function(snapshot) { snapshot(function(diary) { diary.data().user.get() }) })
/ ɻϧʔϓ͝ͱʹϦΫΤετɻ / ͋Δఔํͳ͍ɾɾ ྫ͑ɺ৬໊ͳͲ͕ݶఆతɺ΄ͱΜͲมΘΒͳ͍σʔλ ɺϧʔϓͷલʹऔಘͯ͠มʹอ͓͍࣋ͯͯ͠ɺϧʔϓͰɺ ม͔Βऔಘ͢ΔͳͲͷɻ
'JSFCBTFͲ͏ͳͷʁ
'JSFTUPSFͲ͏ͳͷʁ w جຊతʹ࠷ߴͰ͢ʂ w ։ൃɺαʔόʔͷҡ࣋ཧΛߟ͑ΔͱεϞʔϧελʔ τʹ࠷దʂ w ϑϫοͱͨ͠ཁ͔݅ΒͩΜͩΜػೳΛ૿͍ͯ͘͠ͱɺ πϥϛɾɾɾɻ w
࠷ॳ͔ΒҰࣺͯͯ࡞Γ͢͜ͱߟྀ͓ͯ͘͠ɻ w ཁ͕݅͋Δఔݻ·͍ͬͯΕɺྑ͍ɻ
એͰ͢ʂ
)BTI5BML Ծ
)BTI5BMLͱʁ 28 Ձ؍ඪͷڞײͰܨ͕Δ ϚονϯάϓϥοτϑΥʔϜ4/4 )BTI5BMLͱʁ )BTI5BML͕ఏڙ͢ΔՁ ࣗͷඪΈΛຊԻͰ҆৺ͯ͠ߘ͢Δ͜ͱͰɺ ࠓग़ձ͍͍ͨજࡏతͳະདྷͷؒͱܨ͕Δ
)BTI5BMLͱʁ ༑ୡਃϑΥϩʔ͕ͳ͘ɺ·ͣΓ͍ͨ͜ͱ୭ʹݴ͑ͳ͍ΈͳͲΛಗ໊ Ͱͨͩߘ͢Δ͚ͩɻ ߘʹʮڞײʯͨ͠ΓίϝϯτͷΓऔΓ͢Δ͜ͱͰʮڞײʯ্͕͕͍ͬͯ ͖ɺ໊࣮ϓϩϑΟʔϧ͕ݟΕΔΑ͏ʹͳΓɺ࠷ऴతʹ༑ୡͱͯ͠ܨ͕Δɻ 29 ಗ໊ͷެ։ϓϩϑΟʔϧͱ ໊࣮ͷϓϩϑΟʔϧΛొ ಗ໊ͰΓऔΓɻ୭͕ݴͬͯΔ͔ʁ Ͱͳ͘ݴ༿ʹڞײɻ
ΓऔΓ͢Δ͜ͱͰڞײ͕ ্͕Γɺ࠷ऴతʹ༑ୡʹͳΔɻ
ར༻ٕज़ 30 w 'JSFCBTF"VUIFOUJDBUJPO w 'JSFTUPSF w $MPVE4UPSBHF w $MPVE'VODUJPOT
w #JH2VFSZ
)BTI5BML Ծ ࣄલొडத