https://gunmaweb.connpass.com/event/127593/
のLTスライドです!
ՄೳͳݶΓRDBͷ··Cloud FireStoreΛͬͯΈΔ2019/06/01Gunma.web #35ؔޱ ࢘
View Slide
໊લ:ؔޱ࢘SNS:GitHub: TsukasaGRTwitter: TsukasaGrNewsPicks: ؔޱ࢘࠲ӈͷࣗͷͨΊʹɺଞਓʹਚ͘͢ࣄ:αϥϦʔϚϯ: SIerͰ৽نࣄۀ(toC͚ͷWebαʔϏε)։ൃϑϦʔϥϯε: ελʔτΞοϓͷWebΤϯδχΞ࠷ۙ৮ͬͯΔͷ:PHP(Laravel)ɺJavascript/Typescript(Vue.js/Nuxt.js)ɺGraphQLɺDockerɺAWSɺFirebaseࣗݾհ
What is Cloud Firestore?• Firebase͕ఏڙ͍ͯ͠ΔΫϥυσʔλϕʔε• ϑϩϯτΤϯυ͔Βૢ࡞ग़དྷΔ• Φʔτεέʔϧͯ͘͠ΕΔ• ϦΞϧλΠϜಉظ͕ඵͰ࣮ݱग़དྷΔ• NoSQLͳͷͰRDBͱউख͕͍ͣͿΜҧ͏
• Firebase͕ఏڙ͍ͯ͠ΔΫϥυσʔλϕʔε• ϑϩϯτΤϯυ͔Βૢ࡞ग़དྷΔ• Φʔτεέʔϧͯ͘͠ΕΔ• ϦΞϧλΠϜಉظ͕ඵͰ࣮ݱग़དྷΔ• NoSQLͳͷͰRDBͱউख͕͍ͣͿΜҧ͏
ϑϩϯτΤϯυ͔Βૢ࡞ग़དྷΔҰൠతͳ8FC"QQ 41"$MPVE'JSFTUPSFΛͬͨ8FC"QQ 41"
ϑϩϯτΤϯυ͔Βૢ࡞ग़དྷΔҰൠతͳ8FC"QQ 41"$MPVE'JSFTUPSFΛͬͨ8FC"QQ 41"App Server͕ෆཁʂ
αʔόʔཧ͕ෆཁ• AppServerΛ༻ҙ͠ͳͯ͘ྑ͍• όοΫΤϯυͷॲཧΛҰॻ͔ͣʹϑϩϯτΤϯυͷΈͰ݁ग़དྷΔ
αʔόʔཧ͕ෆཁҰൠతͳ8FC"QQ 41"$MPVE'JSFTUPSFΛͬͨ8FC"QQ 41"
αʔόʔཧ͕ෆཁҰൠతͳ8FC"QQ 41"$MPVE'JSFTUPSFΛͬͨ8FC"QQ 41"DB Server͕ෆཁʂ
αʔόʔཧ͕ෆཁ• DBServerΛ༻ҙ͠ͳͯ͘ྑ͍• Φʔτεέʔϧͯ͘͠ΕΔͷͰߴෛՙʹΑΔμϯΛؾʹ͠ͳͯ͘ྑ͍
ϦΞϧλΠϜಉظָ͕Ұൠతͳ8FC"QQ 41"$MPVE'JSFTUPSFΛͬͨ8FC"QQ 41"
ϦΞϧλΠϜಉظָ͕Ұൠతͳ8FC"QQ 41"$MPVE'JSFTUPSFΛͬͨ8FC"QQ 41"ΈԽָ͕ʂ
ϦΞϧλΠϜಉظָ͕• Web Socket ServerΛ༻ҙ͠ͳͯ͘ྑ͍• ߏஙίετθϩ
RDBͱউख͕͍ͣͿΜҧ͏Ұൠతͳ42-$MPVE'JSFTUPSFΛͬͨΫΤϦ
RDBͱউख͕͍ͣͿΜҧ͏Ұൠతͳ42-$MPVE'JSFTUPSFΛͬͨΫΤϦϦϨʔγϣϯઌͷ݅Ͱ͍͘ΒͰࢦఆग़དྷΔϦϨʔγϣϯઌͷ͕͔݅ͳΓݶఆతͰɺͦͦϦϨʔγϣϯ͢Δͷͪΐ͍໘
ͬ͘͟ΓRDB NoSQL3%# 'JSFTUPSF /P42-• ݫີ͞ʹΑΔ҆৺ײ• ͔Ώ͍ͱ͜Ζʹख͕ಧ͘• େنσʔλʹ͑͏Δͷ͕ͭΒͨΜ• ܰշ͞ɺॊೈ͞ʹΑΔߴύϑΥʔϚϯε• γϯϓϧ͕ނʹ͔Ώ͍ͱ͜ΖࣗͰؤுΔ
ͬ͘͟ΓRDB NoSQL3%# 'JSFTUPSF /P42-• ݫີ͞ʹΑΔ҆৺ײ• ͔Ώ͍ͱ͜Ζʹख͕ಧ͘• େنσʔλʹ͑͏Δͷ͕ͭΒͨΜ• ܰշ͞ɺॊೈ͞ʹΑΔߴύϑΥʔϚϯε• γϯϓϧ͕ނʹ͔Ώ͍ͱ͜ΖࣗͰؤுΔ͕ඞཁ
1: σʔλͷԽ3%# 'JSFTUPSF /P42-
1: σʔλͷԽ3%# 'JSFTUPSF /P42-͋͑ͯඇਖ਼نԽͯ࣋ͨͤ͠Δ
2: Client Side Join3%# 'JSFTUPSF /P42-
2: Client Side Join3%# 'JSFTUPSF /P42-ݩσʔλऔಘޙɺϦϨʔγϣϯઌͷσʔλΛऔಘ
Client Side Join͢ΕRDBͷ··ͰͦΕͳΓʹ͑Δ• σʔλΛԽͤ͞ΔͷRDB͔Β͢Δͱ࠷ॳڋ൱Ԡ͕ग़ͯ͠·͏• Client Side JoinͳΒDBΛਖ਼نԽͨ͠··Ͱߦ͚Δ• (ݺͼग़͢ଆN+1Λঝͷ͏͑ͰΰϦΰϦΔඞཁ͋Δ͕)
ͦΕͰͬͺΓਏΈ͋Δ• ͑Δൺֱԋࢉࢠ <, <=, ==, >, >= ͷΈ• OR͕͑ͳ͍• In۟͑ͳ͍• Like͑ͳ͍
ෳࡶͳݕࡧΛ͍ͨ͠߹Ҿ༻ɿhttps://firebase.google.com/docs/firestore/solutions/search
ෳࡶͳݕࡧΛ͍ͨ͠߹Ҿ༻ɿhttps://firebase.google.com/docs/firestore/solutions/searchෳࡶͳ݅ΛFirestoreͰΓ͘Γ͢Δͷݱ࣮తͰͳ͍
ෳࡶͳݕࡧΛ͍ͨ͠߹Ҿ༻ɿhttps://firebase.google.com/docs/firestore/solutions/searchෳࡶͳ݅ΛFirestoreͰΓ͘Γ͢Δͷݱ࣮తͰͳ͍શจݕࡧΛ͏
શจݕࡧαʔϏεΛ͏Firestoreొ࣌ʹAlgoliaʹσʔλΛొ͓͚ͯ͠ɺ
શจݕࡧαʔϏεΛ͏Firestoreొ࣌ʹAlgoliaʹσʔλΛొ͓͚ͯ͠ɺॊೈɺ͔ͭߴʹσʔλऔಘग़དྷΔ
શจݕࡧαʔϏεΛ͏Firestoreొ࣌ʹAlgoliaʹσʔλΛొ͓͚ͯ͠ɺॊೈɺ͔ͭߴʹσʔλऔಘग़དྷΔશจݕࡧ × Client Side Join= DBΛਖ਼نԽͨ͠··FirestoreΛ͑Δʂ
ͨͩ͠ɺ༻๏༻ྔΛकͬͯਖ਼ͬͨ͘͠΄͏͕ྑ͍• ͦͦRDBͱNoSQLͰత͕ҧ͏ͷͰ͏໘͕ҟͳΔ• ͲͪΒ͔͚ͩͰͳ͘ɺ྆ํΛॴʹΑ͍͚ͬͯΔͷ͕εϚʔτ(ͱࢥΘΕΔ)
Ͱɺͳͥ͜ͷLTΛͨ͠ͷ͔• ʮͱΓ͋͑ͣࠔͬͨΒϩΩιχϯʯతͳײ͡Ͱ༻๏༻ྔΛଟগແࢹͯ͠ͰָʹͳΓ͍͕ͨ࣌͋Δͣ
ϩΩιχϯͷ͍࣌• SPA(※)• DBαʔόʔΛཧͨ͘͠ͳ͍• ϦΞϧλΠϜσʔλಉظΛ͍͍ͨ(※)AlgoliaΛར༻͢Δ߹όοΫΤϯυ͕ඞཁ͕ͩɺCloudFunctionsΛ͏͜ͱͰAppServerෆཁʹͳΔ
ϩΩιχϯͷ͍࣌• SPA• DBαʔόʔΛཧͨ͘͠ͳ͍• ϦΞϧλΠϜσʔλಉظΛ͍͍ͨDBΞΫηεҎ֎ϑϩϯτͷΈͰ݁͢Δ(※)AlgoliaΛར༻͢Δ߹όοΫΤϯυ͕ඞཁ͕ͩɺCloudFunctionsΛ͏͜ͱͰAppServerෆཁʹͳΔ
ϩΩιχϯͷ͍࣌• SPA• DBαʔόʔΛཧͨ͘͠ͳ͍• ϦΞϧλΠϜσʔλಉظΛ͍͍ͨεέʔϧ͢Δ͔͠Εͳ͍͚Ͳɺ͠ͳ͍͔͠Εͳ͍ɺͨͩϦιʔεݶΒΕ͍ͯΔɺΈ͍ͨͳ࣌ʹ࠷ॳ͔ΒΦʔτεέʔϧͷΈԽͳΜͯͬͯΒΕͳ͍DBΞΫηεҎ֎ϑϩϯτͷΈͰ݁͢Δ(※)AlgoliaΛར༻͢Δ߹όοΫΤϯυ͕ඞཁ͕ͩɺCloudFunctionsΛ͏͜ͱͰAppServerෆཁʹͳΔ
ϩΩιχϯͷ͍࣌• SPA• DBαʔόʔΛཧͨ͘͠ͳ͍• ϦΞϧλΠϜσʔλಉظΛ͍͍ͨεέʔϧ͢Δ͔͠Εͳ͍͚Ͳɺ͠ͳ͍͔͠Εͳ͍ɺͨͩϦιʔεݶΒΕ͍ͯΔɺΈ͍ͨͳ࣌ʹ࠷ॳ͔ΒΦʔτεέʔϧͷΈԽͳΜͯͬͯΒΕͳ͍௨όοξνϟοτػೳ͚ͩαΫοͱϦΞϧλΠϜಉظ͍͚ͨ͠ͲWebSocketཧղ͖͠Εͯͳ͍࣌ؒ͠ͳ͍DBΞΫηεҎ֎ϑϩϯτͷΈͰ݁͢Δ(※)AlgoliaΛར༻͢Δ߹όοΫΤϯυ͕ඞཁ͕ͩɺCloudFunctionsΛ͏͜ͱͰAppServerෆཁʹͳΔ
ϩΩιχϯͷ͍࣌• SPA• DBαʔόʔΛཧͨ͘͠ͳ͍• ϦΞϧλΠϜσʔλಉظΛ͍͍ͨεέʔϧ͢Δ͔͠Εͳ͍͚Ͳɺ͠ͳ͍͔͠Εͳ͍ɺͨͩϦιʔεݶΒΕ͍ͯΔɺΈ͍ͨͳ࣌ʹ࠷ॳ͔ΒΦʔτεέʔϧͷΈԽͳΜͯͬͯΒΕͳ͍௨όοξνϟοτػೳ͚ͩαΫοͱϦΞϧλΠϜಉظ͍͚ͨ͠ͲWebSocketཧղ͖͠Εͯͳ͍࣌ؒ͠ͳ͍DBΛਖ਼نԽͨ͠··FirestoreΛ͏͕͘Δ͔͠Εͳ͍(͠ɺདྷͳ͍͔͠Εͳ͍)DBΞΫηεҎ֎ϑϩϯτͷΈͰ݁͢Δ(※)AlgoliaΛར༻͢Δ߹όοΫΤϯυ͕ඞཁ͕ͩɺCloudFunctionsΛ͏͜ͱͰAppServerෆཁʹͳΔ
͍͞͝ʹ
• ࠓ͍ͭͬͯ͘ΔϓϩμΫτͰࢼ͍ͯ͠Δ͕ɺ·ͩྑ͠ѱ͠ΛஅͰ͖͍ͯͳ͍• RDB͕࿀͘͠ͳΔ࣌ਖ਼݁ߏ͋Δ• ͦΕͰݸਓతʹ͏ཧ༝ҎԼ• DB Serverෆཁ >>> App Serverෆཁ >>> ϦΞϧλΠϜσʔλಉظ• ແྉ͔Β࢝ΊΒΕΔͷͰɺͥͻօ͞Μ৮ͬͯΈ͍͔͕ͯͰ͠ΐ͏͔ʂ