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
160
成長ステージ別のスタートアップ集結!「事業の魅力とチームの本音」
takec24
0
90
Developing FLAPTALK by Firebase
takec24
1
350
NuxtCompositionAPIとFirebaseの話
takec24
1
500
コロナ禍でもリモート案件を途切れさせない! 案件の獲得方法とリモート案件の進め方。
takec24
0
320
フロントエンドエンジニアのためのFirebaseサーバーレス開発徹底解説
takec24
0
1.1k
スタートアップで働くというエンジニアキャリア
takec24
1
1.1k
人生を変えた炎上ブロジェクト
takec24
0
1.4k
好きなことを選び続けたら代表取締役CTOになりました。
takec24
2
1.3k
Other Decks in Programming
See All in Programming
見えないメモリを観測する: PHP 8.4 `pg_result_memory_size()` とSQL結果のメモリ管理
kentaroutakeda
0
940
ecspresso, ecschedule, lambroll を PipeCDプラグインとして動かしてみた (プロトタイプ) / Running ecspresso, ecschedule, and lambroll as PipeCD Plugins (prototype)
tkikuc
2
1.9k
アクターシステムに頼らずEvent Sourcingする方法について
j5ik2o
6
700
DevinとCursorから学ぶAIエージェントメモリーの設計とMoatの考え方
itarutomy
0
150
はてなにおけるfujiwara-wareの活用やecspressoのCI/CD構成 / Fujiwara Tech Conference 2025
cohalz
3
2.8k
“あなた” の開発を支援する AI エージェント Bedrock Engineer / introducing-bedrock-engineer
gawa
4
250
「とりあえず動く」コードはよい、「読みやすい」コードはもっとよい / Code that 'just works' is good, but code that is 'readable' is even better.
mkmk884
6
1.4k
PSR-15 はあなたのための ものではない? - phpcon2024
myamagishi
0
410
PHPとAPI Platformで作る本格的なWeb APIアプリケーション(入門編) / phpcon 2024 Intro to API Platform
ttskch
0
390
return文におけるstd::moveについて
onihusube
1
1.4k
AHC041解説
terryu16
0
400
Итераторы в Go 1.23: зачем они нужны, как использовать, и насколько они быстрые?
lamodatech
0
1.4k
Featured
See All Featured
Music & Morning Musume
bryan
46
6.3k
Producing Creativity
orderedlist
PRO
343
39k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
3
240
The Language of Interfaces
destraynor
155
24k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Building Better People: How to give real-time feedback that sticks.
wjessup
366
19k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.8k
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 Ծ ࣄલొडத