Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Firestoreのデータ設計について考える

508d2cf1990876daf4797795a2d81bd2?s=47 TakeshiNishi
February 26, 2020

 Firestoreのデータ設計について考える

「リモートで勉強会#5 - テーマ何でもLT会-」登壇資料です。
FirebaseのNoSQLデータベース「Firestore」のデータ設計についてまとめました。

508d2cf1990876daf4797795a2d81bd2?s=128

TakeshiNishi

February 26, 2020
Tweet

Transcript

  1. ϦϞʔτͰษڧձ#5 - ςʔϚԿͰ΋LTձ- FirebaseͰWebΞϓϦ։ൃͨ͠࿩
 ʙ Firestoreͷσʔλઃܭʹ͍ͭͯߟ͑Δ ʙ !@UBLFTIJ@ SFNPTUB

  2. ੢෢࢙ ʹ͚ͨ͠͠ !@UBLFTIJ@ ࣗݾ঺հ w ෱Ԭͷ4*FSͰγεςϜΤϯδχΞ w ϑϦʔϥϯεϓϩάϥϚʔ w ౦ژͷελʔτΞοϓ$P'PVOEFSऔక໾$50

    w ෱ԬͷελʔτΞοϓͰ৽نࣄۀ্ཱͪ͛ w גࣜձࣾEJ⒎FBTZऔక໾$50 w ελʔτΞοϓ૑ۀ४උதˡࠓ͜͜ /VYUKT'JSFCBTF7VFKT3VCZ($1ϒϩοΫνΣʔϯ ελʔτΞοϓىۀ ম͖೑ԹઘΩϟϯϓཱྀߦ ແ৬
  3. ࠷ۙ΍͍ͬͯΔࣄ ୡ੒NF ໨ඪͱظݶΛએݴͯ͠γΣΞʂ໨ඪ΁ͷ೤ྔΛ ՄࢹԽ͠ɺԠԉͯ͠ܨ͕ΔαʔϏεɻ IUUQTUBTTFJNF /VYUKT'JSFCBTF$MPVE'VODUJPOT/PEFKT )BTI5BML Ծ Ձ஋؍΍໨ඪ΁ͷڞײͰܨ͕ΔϚονϯάϓϥοτ ϑΥʔϜ4/4

     /VYUKT'JSFCBTF$MPVE'VODUJPOT/PEFKT डୗ։ൃ *5ࢧԉ ৽نࣄۀ։ൃʹ͓͚Δٕज़ࢧԉɺ%9ࢧԉɻ ιϑτ΢ΣΞडୗ։ൃɻ
  4. 'JSFTUPSFͷσʔλઃܭʹ͍ͭͯߟ͑Δ

  5. 'JSFCBTF'JSFTUPSFͱ͸ʁ Google͕ఏڙ͢ΔBaaS(Backend as a Service) όοΫΤϯυͷॲཧʢೝূɺετϨʔδͷ؅ཧɺσʔλϕʔεͷ ؅ཧͳͲʣ͕ෆཁɻ 'JSFCBTFͱ͸ʁ 'JSFTUPSFͱ͸ʁ FirebaseͷNoSQLσʔλϕʔεɻ

  6. 'JSFTUPSFͷσʔλઃܭʹ͍ͭͯߟ͑Δ  'JSFTUPSFͷϦϨʔγϣϯσʔλΛͲ͏औΓѻ͏͔ʁ w 4VC$PMMFDUJPO w ΩʔࢀরϞσϧ w 3FGFSFODFܕ 

    ηΩϡϦςΟΛҙࣝͨ͠σʔλઃܭ  ݖݶ؅ཧ͸ΧελϜΫϨʔϜΛར༻  / ໰୊Ͳ͏͢Δʁ
  7. 4VC$PMMFDUJPO

  8. 4VC$PMMFDUJPOͱ͸ʁ VTFST 㸉<6TFS*%> 㸉OBNFlʹ͠z 㸉BHF 㸉EJBSJFT 㸉<%JBSZ*%> c㸉UJUMFlλΠτϧz c㸉DPOUFOUlຊจɻຊจɻz 㸉<%JBSZ*%>

    c㸉UJUMFlλΠτϧz c㸉DPOUFOUlຊจɻຊจɻz wσʔλͷؔ܎͕Θ͔Γ΍͍͢ɻ w ֊૚͕ਂ͍ͱΘ͔Γʹ͘͘ͳΔɻ
  9. 4VC$PMMFDUJPO$PMMFDUJPO(SPVQ const snapshot = await app.firestore() .collectionGroup("diaries") .where() .get() wDPMMFDUJPO(SPVQͰ4VC$PMMFDUJPOΛԣஅతʹݕࡧՄೳɻ

  10. ,FZࢀরϞσϧ

  11. ,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
  12. 4VC$PMMFDUJPOͱ,FZࢀরϞσϧͲͬͪ࢖͏ʁ  ୯७ͳ਌ࢠؔ܎ͩͬͨΒɺ4VC$PMMFDUJPO  ݕࡧͷύλʔϯ͕ෳ਺͋Ε͹ɺ,FZࢀরϞσϧ  ֊૚͕ਂ͘ͳΔ΋ͷ͸ɺ,FZࢀরϞσϧ 4VC$PMMFDUJPOͱ,FZࢀরϞσϧͲͪΒΛ࢖͏͔ʁ ൑அج४͸ʁʁ ࢲͷ൑அج४

  13. 3FGFSFODFܕ ࢀরܕ

  14. 3FGFSFODFܕͱ͸ʁ EJBSJFT 㸉<%JBSZ*%> c㸉UJUMFlλΠτϧz c㸉DPOUFOUlຊจɻຊจɻz c㸉VTFSVTFST<VTFS*%> 㸉<%JBSZ*%> c㸉UJUMFlλΠτϧz c㸉DPOUFOUlຊจɻຊจɻz c㸉VTFSVTFST<VTFS*%>

    w/ͷ਌ࢠؔ܎ͷσʔλͰ͸3FGFSFODFܕΛར༻ɻ
  15. 3FGFSFODFܕͷऔಘ const diary = await app.firestore() .collection("diaries") .doc([diaryID]) .get() const

    user = diary.data().user.get() w ࢠͷσʔλͷऔಘ͕༰қɻ
  16. ηΩϡϦςΟΛҙࣝͨ͠σʔλઃܭ

  17. '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*%Λِ૷Մೳɻ
  18. ηΩϡϦςΟΛҙࣝͨ͠σʔλઃܭ ྫ Ϣʔβʔͷࢯ໊ɺॅॴɺ࿈བྷઌͳͲͷݸਓ৘ใͱɺχοΫωʔ ϜɺϓϩϑΟʔϧࣸਅͳͲͷެ։৘ใΛ࣋ͭσʔλ VTFST 㸉<6TFS*%> 㸉OJDLOBNFlʹ͠z 㸉QSPpMFlYYYYYYYKQHz 㸉OBNFl੢෢࢙z 㸉BEESFTTl෱Ԭࢢ౦۠ɾɾɾz

    㸉FNBJMlUBLFTIJ!IPHFIPHFDPNz  ϑΟʔϧυ୯ҐͰηΩϡϦςΟϧʔϧઃఆ Ͱ͖ͳ͍ͷͰɺެ։͞Εͯ͠·͏ʂʂ
  19. ηΩϡϦςΟΛҙࣝͨ͠σʔλઃܭ VTFST 㸉<6TFS*%> 㸉OJDLOBNFlʹ͠z 㸉QSPpMFlYYYYYYYKQHz QSJWBUFT 㸉<6TFS*%> 㸉OBNFl੢෢࢙z 㸉BEESFTTl෱Ԭࢢ౦۠ɾɾɾz 㸉FNBJMlUBLFTIJ!IPHFIPHFDPNz

     DPMMFDUJPOΛ෼͚Δɻ
  20. ݖݶ؅ཧ͸ΧελϜΫϨʔϜΛར༻

  21. ݖݶ؅ཧ͸ΧελϜΫϨʔϜΛར༻ ྫ BENJOϢʔβʔ͸؅ཧऀը໘Λར༻Ͱ͖ͯɺҰൠϢʔβʔ ͸؅ཧऀը໘Λར༻Ͱ͖ͳ͍ɻ await admin.auth().setCustomUserClaims( uid, { admin: true

    } ) if(user.customClaims.admin) { } ΧελϜΫϨʔϜʹʮBENJOʯΛઃఆ BENJOͷ৔߹ͷΈॲཧΛߦ͏ w ΧελϜΫϨʔϜ͸ݖݶ؅ཧͷΈར༻ɻ w Ϣʔβʔͷ৘ใ͸DPMMFDUJPOΛར༻ɻ
  22. / ໰୊Ͳ͏͢Δʁ

  23. / ໰୊Ͳ͏͢Δʁ db.collection(“diaries”).get() .then(function(snapshot) { snapshot(function(diary) { diary.data().user.get() }) })

    / ໰୊ɻϧʔϓ͝ͱʹϦΫΤετɻ / ͸͋Δఔ౓࢓ํͳ͍ɾɾ ྫ͑͹ɺ໾৬໊ͳͲ਺͕ݶఆతɺ΄ͱΜͲมΘΒͳ͍σʔλ ͸ɺϧʔϓͷલʹऔಘͯ͠ม਺ʹอ͓͍࣋ͯͯ͠ɺϧʔϓ಺Ͱɺ ม਺͔Βऔಘ͢ΔͳͲͷ޻෉ɻ
  24. 'JSFCBTFͲ͏ͳͷʁ

  25. 'JSFTUPSFͲ͏ͳͷʁ w جຊతʹ͸࠷ߴͰ͢ʂ w ։ൃ଎౓ɺαʔόʔͷҡ࣋؅ཧΛߟ͑ΔͱεϞʔϧελʔ τʹ࠷దʂ w ϑϫοͱͨ͠ཁ͔݅ΒͩΜͩΜػೳΛ૿΍͍ͯ͘͠ͱɺ πϥϛɾɾɾɻ w

    ࠷ॳ͔ΒҰ౓ࣺͯͯ࡞Γ௚͢͜ͱ΋ߟྀ͓ͯ͘͠ɻ w ཁ͕݅͋Δఔ౓ݻ·͍ͬͯΕ͹ɺྑ͍ɻ
  26. એ఻Ͱ͢ʂ

  27. )BTI5BML Ծ

  28. )BTI5BMLͱ͸ʁ 28 Ձ஋؍΍໨ඪ΁ͷڞײͰܨ͕Δ ϚονϯάϓϥοτϑΥʔϜ4/4 )BTI5BMLͱ͸ʁ )BTI5BML͕ఏڙ͢ΔՁ஋ ࣗ෼ͷ໨ඪ΍೰ΈΛຊԻͰ҆৺ͯ͠౤ߘ͢Δ͜ͱͰɺ ࠓग़ձ͍͍ͨજࡏతͳະདྷͷ஥ؒͱܨ͕Δ

  29. )BTI5BMLͱ͸ʁ ༑ୡਃ੥ϑΥϩʔ͕ͳ͘ɺ·ͣ͸΍Γ͍ͨ͜ͱ୭ʹ΋ݴ͑ͳ͍೰ΈͳͲΛಗ໊ Ͱͨͩ౤ߘ͢Δ͚ͩɻ ౤ߘʹʮڞײʯͨ͠Γίϝϯτͷ΍ΓऔΓ͢Δ͜ͱͰʮڞײ౓ʯ্͕͕͍ͬͯ ͖ɺ໊࣮ϓϩϑΟʔϧ͕ݟΕΔΑ͏ʹͳΓɺ࠷ऴతʹ༑ୡͱͯ͠ܨ͕Δɻ 29 ಗ໊ͷެ։ϓϩϑΟʔϧͱ ໊࣮ͷϓϩϑΟʔϧΛొ࿥ ಗ໊Ͱ΍ΓऔΓɻ୭͕ݴͬͯΔ͔ʁ Ͱ͸ͳ͘ݴ༿ʹڞײɻ

    ΍ΓऔΓ͢Δ͜ͱͰڞײ౓͕ ্͕Γɺ࠷ऴతʹ༑ୡʹͳΔɻ
  30. ར༻ٕज़ 30 w 'JSFCBTF"VUIFOUJDBUJPO w 'JSFTUPSF w $MPVE4UPSBHF w $MPVE'VODUJPOT

    w #JH2VFSZ
  31. )BTI5BML Ծ ࣄલొ࿥ड෇த