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
6
2.1k
Firestoreのデータ設計について考える
「リモートで勉強会#5 - テーマ何でもLT会-」登壇資料です。
FirebaseのNoSQLデータベース「Firestore」のデータ設計についてまとめました。
TakeshiNishi
February 26, 2020
Tweet
Share
More Decks by TakeshiNishi
See All by TakeshiNishi
LT駆動開発 - 話題のChatGPTで何か作る
takec24
0
170
成長ステージ別のスタートアップ集結!「事業の魅力とチームの本音」
takec24
0
120
Developing FLAPTALK by Firebase
takec24
1
400
NuxtCompositionAPIとFirebaseの話
takec24
1
510
コロナ禍でもリモート案件を途切れさせない! 案件の獲得方法とリモート案件の進め方。
takec24
0
370
フロントエンドエンジニアのためのFirebaseサーバーレス開発徹底解説
takec24
0
1.2k
スタートアップで働くというエンジニアキャリア
takec24
1
1.2k
人生を変えた炎上ブロジェクト
takec24
0
1.5k
好きなことを選び続けたら代表取締役CTOになりました。
takec24
2
1.3k
Other Decks in Programming
See All in Programming
データの民主化を支える、透明性のあるデータ利活用への挑戦 2025-06-25 Database Engineering Meetup#7
y_ken
0
350
来たるべき 8.0 に備えて React 19 新機能と React Router 固有機能の取捨選択とすり合わせを考える
oukayuka
2
920
システム成長を止めない!本番無停止テーブル移行の全貌
sakawe_ee
1
160
#kanrk08 / 公開版 PicoRubyとマイコンでの自作トレーニング計測装置を用いたワークアウトの理想と現実
bash0c7
1
710
Code as Context 〜 1にコードで 2にリンタ 34がなくて 5にルール? 〜
yodakeisuke
0
120
10 Costly Database Performance Mistakes (And How To Fix Them)
andyatkinson
0
240
VS Code Update for GitHub Copilot
74th
2
630
効率的な開発手段として VRTを活用する
ishkawa
0
130
PipeCDのプラグイン化で目指すところ
warashi
1
270
AI時代のソフトウェア開発を考える(2025/07版) / Agentic Software Engineering Findy 2025-07 Edition
twada
PRO
77
25k
すべてのコンテキストを、 ユーザー価値に変える
applism118
3
1.2k
WebViewの現在地 - SwiftUI時代のWebKit - / The Current State Of WebView
marcy731
0
110
Featured
See All Featured
Side Projects
sachag
455
42k
Making Projects Easy
brettharned
116
6.3k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.8k
Building Applications with DynamoDB
mza
95
6.5k
Speed Design
sergeychernyshev
32
1k
RailsConf 2023
tenderlove
30
1.1k
Automating Front-end Workflow
addyosmani
1370
200k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Making the Leap to Tech Lead
cromwellryan
134
9.4k
Why Our Code Smells
bkeepers
PRO
337
57k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
Designing for Performance
lara
610
69k
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 Ծ ࣄલొडத