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
2k
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
110
Developing FLAPTALK by Firebase
takec24
1
390
NuxtCompositionAPIとFirebaseの話
takec24
1
510
コロナ禍でもリモート案件を途切れさせない! 案件の獲得方法とリモート案件の進め方。
takec24
0
360
フロントエンドエンジニアのためのFirebaseサーバーレス開発徹底解説
takec24
0
1.2k
スタートアップで働くというエンジニアキャリア
takec24
1
1.1k
人生を変えた炎上ブロジェクト
takec24
0
1.5k
好きなことを選び続けたら代表取締役CTOになりました。
takec24
2
1.3k
Other Decks in Programming
See All in Programming
Passkeys for Java Developers
ynojima
3
860
Development of an App for Intuitive AI Learning - Blockly Summit 2025
teba_eleven
0
110
AWS CDKの推しポイント 〜CloudFormationと比較してみた〜
akihisaikeda
3
270
Use Perl as Better Shell Script
karupanerura
0
690
カクヨムAndroidアプリのリブート
numeroanddev
0
420
A comprehensive view of refactoring
marabesi
0
520
Prism.parseで 300本以上あるエンドポイントに 接続できる権限の一覧表を作ってみた
hatsu38
1
110
Cursor Meetup Tokyo ゲノミクスとCursor: 進化と制約のあいだ
koido
2
1k
単体テストの始め方/作り方
toms74209200
0
450
赤裸々に公開。 TSKaigiのオフシーズン
takezoux2
0
130
Beyond Portability: Live Migration for Evolving WebAssembly Workloads
chikuwait
0
370
プロダクト開発でも使おう 関数のオーバーロード
yoiwamoto
0
150
Featured
See All Featured
Facilitating Awesome Meetings
lara
54
6.4k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
4
170
Unsuck your backbone
ammeep
671
58k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Gamification - CAS2011
davidbonilla
81
5.3k
Fireside Chat
paigeccino
37
3.5k
Rails Girls Zürich Keynote
gr2m
94
14k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Building Applications with DynamoDB
mza
95
6.4k
Testing 201, or: Great Expectations
jmmastey
42
7.5k
How to Ace a Technical Interview
jacobian
276
23k
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 Ծ ࣄલొडத