ã¯ããã«
Firebase Realtime DBãå®è·µæå
¥ããã«ããã£ãŠèããããšãèªãã§é ããŠããããšãããããŸãããå€ãã®æ¹ããããããããé ããŠãä»åã®ãã®èšäºãæžãã¢ãããŒã·ã§ã³ã«ãªããŸãã
æ¬åœã«ããããšãããããŸããïŒ
ããŠãCloudFirestoreã¯ãFirebase Realtime Databaseãšã¯å
šãéãããŒã¿ããŒã¹ã§ããç¹ã«SubCollection
ãQuery
ãå°å
¥ãããããšã«ããããªã¬ãŒã·ã§ã³ã·ããã®èšèšã«é¢ããŠå€§ããç°ãªããŸãã
ãã®èšäºã§ã¯ãäž»ã«CloudFirestoreã«ããããªã¬ãŒã·ã§ã³ã·ããã®èšè𿹿³ãããã¢ããªã»CloudFunctionsã«è³ããŸã§ãå¹ åºã解説ããŠè¡ãããšæããŸãã
Cloud Firestoreã§ã®éçºã«ã€ããŠ
ç§ã®çµéšäžç¢ºå®ã«æèšã§ããããšããããŸãã
Cloud Firestoreã ãã§ãµãŒãã¹ãäœãããšã¯äžå¯èœã§ã¯ãªã
ã§ãããã©ãã
éçºã«ã¯ãä»ã®SaaSãæŽ»çšã«ããã®ããããšæããŸãããã€ã¯ããµãŒãã¹ãã€ãã芳ç¹ããèããŠãæ©èœãåé¢ããŠããããšã¯å€§ããªã¡ãªããããããŸãã
ããä»ããæ°èŠãµãŒãã¹ãäœãããšããŠæè¡éžå®ã«å°ã£ãŠããæ¹ã«ã¢ããã€ã¹ãããªãã°ãç§ã¯Cloud Firestoreã匷ããå§ãããŸããç°¡åã«çç±ã䞊ã¹ããšä»¥äžã®ç¹ã§ãã
- æ¢åã®DBãšæ¯èŒããŠãä»ããNoSQLãå§ããåŠç¿ã³ã¹ããèæ ®ããŠãéçºéåºŠãæ©ã
- ã¹ã±ãŒã«ãããŸã§ã¯ç¡æã§äœ¿ãã
- ã°ããŒã¹ããããŸã§ãFirebaseã§å®çµã§ãã
æ£çŽããã€ãã£ãã¢ããªããREST APIã䜿ã£ãŠããŒã¿ãåãæ±ãã¡ãªããã¯ã»ãŒç¡ããšèããŠããŸããå®å šç§ã®äºæ³ã§ãããæ¬¡ã®ãããªæµãã«ãªãã¯ãã§ãã
- éä¿¡ãããã³ã«ã¯gRPCãäž»æµã«ãªã
- RESTã¯GraphQLã«çœ®ãæãã
- RESTã¯å€éšãµãŒãã¹ãšã®é£æºã®ããã«æ®ã
å®å šã«å人çãªäºæ³ãªã®ã§ããŸãæåŸ ããªãæ¹ãããããç¥ããŸããããåã¯ããä¿¡ããŠãã®èšäºãæžããŸãã
Cloud Firestoreã®æ§é
Cloud Firestore ã¯ãNoSQLããŒã¿ããŒã¹ã§ããããã«ç¹åŸŽçãªã®ã¯ããŒã¿æ§é ã§ãã
å³ã®ããã«PCã®ãã¡ã€ã«ã·ã¹ãã ã®ãããªæ§é ãæã€ããšãã§ããŸãã
ãã®ãããã®èª¬æã¯äžå¯§ã«ããã¥ã¡ã³ãã§èª¬æãããŠããã®ã§ãã¡ããã芧ãã ããã
äžè¬çãªRDBã§ããªããMongoDBã®ãããªæ§é ã§ããªããCloudFirestoreã¯ç¬ç¹ã®æ§é ãæã¡ãŸãã®ã§ãé°å²æ°ã ãã§ãæ§é ãçè§£ããŠãã®åŸãèªã¿é²ããããšããå§ãããŸãã
CloudFirestoreã®ãªã¬ãŒã·ã§ã³ã·ããã«ã€ããŠ
ããŠãCloud Firestoreã§ãµãŒãã¹éçºã«ãããŠéèŠãªã®ã¯CloudFirestoreã®ããŒã¿æ§é ãã©ãèšèšããŠãããã§ãããã¡ãããªã¬ãŒã·ã§ã³ã·ããã®èšèšãéèŠãªéµãšãªããŸããRealtime Databaseã§ã¯ããªã¬ãŒã·ã§ã³ã·ããã®æ¹æ³ã¯ããå€ããªããFan outã«ãããªã¬ãŒã·ã§ã³ã·ãããæ§ç¯ããŠããçšåºŠã§ããããCloud Firestoreã§ã¯éããŸããQuery
SubCollection
Reference
ãªã©ãªã¬ãŒã·ã§ã³ãè¡ãæ¹æ³ãè€æ°çšæãããŠããããã§ãã
NoSQLã®ãã¹ããã©ã¯ãã£ã¹ã¯è³æãæ¬åœã«å°ãªããŠè²ã èããã®ã«èŠåŽãããã§ãããåãèãããã¹ããã©ã¯ãã£ã¹ãã¿ããªèŠãŠãã ããããããŠææãããã°ãã ããã
åèã«ãªããããªè³æãèŒããŠãããŸãã
DynamoDB ã®ãã¹ããã©ã¯ãã£ã¹
ãµãŒããŒãã€ã³ãã©ã®æ§èœã«è§Šããªããèªããã®ã§ãšãŠãããè³æã§ãã
NoSQLããŒã¿ã¢ããªã³ã°ææ³
Realtime Databaseãèšèšãããªãå¿
ãèªãã æ¹ãããè³æã§ãã
æ®å¿µãªãããããããæä»£ã¯é²åããŠãŸããŠã
SubCollection
ã«ã€ããŠèæ
®ãããè³æã¯å
¬åŒã®FirebaseããªãªãŒã¹ããŠããæ
å ±ãã®ãããŠçç¡ã«è¿ãç¶æ
ã§ãã
YouTube Firebaseããåç
§ãã ããã
CloudFirestore ããŒã¿ããŒã¹èšèš
2018幎ã®DevFestã§ç»å£ããè³æãããæ·±ã解説ããŸããðð»
Firestore Database Design
ãªã¬ãŒã·ã§ã³ã·ããã®çš®é¡
Cloud Firestoreã®è€æ°ã®æ¹æ³ã§ãªã¬ãŒã·ã§ã³ã·ããäœãããšãå¯èœã§ãããŸãã¯ãã®çš®é¡ã玹ä»ããŸããã¿ã€ãå¥ã«çš®é¡ãå³ã«ããŸããã
æçµçã«ãã®8ãã¿ãŒã³çµã¿åããã«ãªãã®ããªãšèããŠããŸãã
以éSwiftã®ã³ãŒããæ²èŒãããŸããªããšãªãèªãããšæãã®ã§ãåèãã ããã
â Key
ããã¯RDBã§ã䜿ãããäžè¬çãªãªã¬ãŒã·ã§ã³æ¹æ³ã§ããRDBã§èšããªãããŒãã«ã«åç
§å
ã®ã¬ã³ãŒãã®IDãæã£ãŠããç¶æ
ã§ããããã§ã¯ãItem
ãuserID
ãä¿æããŠããããšããItem
ãšUser
ã®é¢ä¿ã衚ããŠããŸãã
â Reference
ããã¯Cloud Firestoreããã€Referenceåã䜿ã£ããªã¬ãŒã·ã§ã³æ¹æ³ã§ãã
Keyãšã®éãã«ã€ããŠèããŠã¿ãŸããããCloudFirestoreã§ã¯æ¬¡ã®ããã«ãã¹ã«JSONããŒã¿ãæãããŸãã
// /user/:id
{
"name": "hoge",
"age": "25"
}
ãŠãŒã¶ãŒã®æ
å ±ã®ãã€ã°ã¬ãŒã·ã§ã³ããªããã°ãªããªãç¶æ
ãæ³å®ããŸããããäŸãã°age
ãStringã§å®çŸ©ããŠããŸã£ãã®ã§Numberã«å€æŽãããå Žåãä»ã®æ§é ã§ã¯æ¬¡ã®ããã«ãããããªããªããŸãã
// /user/:id
{
"name": "hoge",
"age": "25"
"age_number": 25
}
ã¡ãã£ãšæ®å¿µã§ãããã ã¡ãªã¿ã«ãããã¹ããã©ã¯ãã£ã¹ã§ããè²ã èæ ®ãããšãã®ãã€ã°ã¬ãŒã·ã§ã³ãäžçªã³ã¹ãããããã·ã³ãã«ã«ç§»è¡ã§ããŸãã
ã¡ãã£ãšæ®å¿µã ãã綺éºã«ãããæ¹ã¯ããããã®ããªã¹ã¹ã¡ã§ãã
// /version/1/user/:id
{
"name": "hoge",
"age": "25"
}
æåãããã¹ã«ããŒãžã§ã³æ å ±ãæãããŸãããããããããš
// /version/2/user/:id
{
"name": "hoge",
"age": 25
}
ããŒãžã§ã³ã®å€æŽã«åãããŠãããŒã¿ããã€ã°ã¬ãŒã·ã§ã³ã§ããŸããå¢å€§ããããŒã¿ã®ãã€ã°ã¬ãŒã·ã§ã³ã«ã¯ã³ã¹ãããããã®ã§ãã¢ãã«ã®ããŒãžã§ã³ããããããšã¯çšã§ããå¯èœã§ãã
ããããããã§ãªã¬ãŒã·ã§ã³ã«è©±ãæ»ããšåé¡ãåºãŠããŸãã
Item
ãšUser
ã®é¢ä¿ã衚ãuserID
ã¯IDã®ã¿ãä¿æããŠãããããŒãžã§ã³æ
å ±ãæã£ãŠããŸãããããã§ç»å Žããã®ãReference
ã«ãªããŸããReference
ã¯ãã¹ãã®ãã®ãä¿æããããšãåºæ¥ãããã«ãªããŸãã
Referenceã¯å€çšã§ããªã
ãReference䟿å©ðªð»ããšãªã£ãããç¥ããŸããããReference
ã¯å€çšã§ããŸããããªãã§ããããïŒItemã«Referenceãæããããšã©ããªãããèããŠã¿ãŸãããã
次ã®ç¶æ
ã§ã¯ãItem
ã¯ããŒãžã§ã³1
ã®User
ãåç
§ããŠããŸãã
// /version/1/item/:id
{
"userID": "user_ID" // :id
"userReference": "<Ref>", // /version/1/user/:id
}
ããUser
ã®ããŒãžã§ã³ãæŽæ°ãããã©ããªãã§ããããïŒItem
ã¯å€ãããŒãžã§ã³ã®Reference
ãæã£ãŠããããItem
ããã€ã°ã¬ãŒã·ã§ã³ãå¿
èŠã«ãªããŸãã
ã©ãããéãã¢ãã«ãåç
§ããå Žåã¯ãKeyã®ã¿ãä¿æããæ¹ãè¯ãããã§ãã
ã§ã¯Referenceã¯ãã€äœ¿ãã®ãïŒ
- æ°ããã¢ãã«ããå€ãã¢ãã«ãåç §ããæ
- ãã¹ãã®æ·±ãã¢ãã«ãåç §ããæ
ã§ã¯ãªãããšèããŠããŸãã
äŸãã°æ¬¡ã®ããã«çŸè¡ããŒãžã§ã³ãæ§ããŒãžã§ã³ãåç
§ããå Žåã
// /version/2/item/:id
{
"userID": "user_ID" // :id
"oldItem": "<Ref>", // /version/1/item/:id
}
Keyã§ã¯è¡šçŸããããªãéå±€ã®ä»»æã®æ å ±ã瀺ãããå Žå
// /version/1/user/:id
{
"userID": "user_ID" // :id
"pinComment": "<Ref>", // /version/1/item/:item_id/comment/:comment_id
}
// /version/1/item/:item_id/comment/:comment_id
{
"userID": "user_ID" // :id
"oldItem": "<Ref>", // /version/1/item/:id
}
â Same ID
ãã®ãªã¬ãŒã·ã§ã³æ¹æ³ã¯ãCloudFirestoreã®ãã¹æ§é ã䜿ã£ãæ¹æ³ã§ããã»ãã¥ãªãã£ãŒã«ãŒã«ãå¹ççã«äžããããšãã§ããã®ã§ã»ãã¥ã¢ãªããŒã¿ãæ±ããããšãã«ãªã¹ã¹ã¡ã§ãããŠãŒã¶ãŒã«ã»ãã¥ã¢ãªæ
å ±ãæããããå ŽåãèããŠã¿ãŸããããCloudFirestoreã®ã»ãã¥ãªãã£ã«ãŒã«ã§ã¯ãã£ãŒã«ãåäœã§ã»ãã¥ãªãã£ããããããšãã§ããŸãããã€ãŸãé«ãã»ãã¥ãªãã£ãæã€ããã¥ã¡ã³ããšå
¬éå¯èœãªããã¥ã¡ã³ãã¯å¥ã
ã«ä¿æããå¿
èŠããããŸããäŸãã°ãŠãŒã¶ãŒã®æ
å ±ã®ã»ãã¥ãªãã£ãé«ãä¿ã€ããã®æ§é ã¯ä»¥äžã®äºã€ã®æ¹æ³ãèãããããšæããŸãã
1. SubCollectionãå©çšããæ§é
/version/1/user/:user_id/secure/:id
Userã®SubCollectionã«ã»ãã¥ãªãã£ãé«ãããããŒã¿ãæã¡ãŸãã
SubCollectionã®ã»ãã¥ãªãã£ã«ãŒã«ãèšå®ãããŒã¿ãã»ãã¥ã¢ã«ä¿ã¡ãŸãã
2. Same IDæ§é
/version/1/user/:user_id
/version/1/_user/:user_id
äžã§ã¯User
ãš_User
ã®å¥ã®Collectionãå®çŸ©ããŠããŸããSame IDãå©çšããŠã·ã³ãã«ã«ã»ãã¥ã¢ãªæ
å ±ãä¿æã§ããŸãã
Same IDã䜿ã£ããœãŒã·ã£ã«æ©èœ
/version/1/user/:user_id
/version/1/social/:user_id
User
ãšSocial
ãå¥ã®Collectionã«å®çŸ©ããŠããŸãã
Userã«å®çŸ©ãããã§ãããããŒã¿
{
"name": "1amageek",
"age": 31,
"gender": "male"
}
Socialã«å®çŸ©ãããã§ãããããŒã¿
{
"followerCount": 2000,
"followeeCount": 23
}
äžèŠå
šãŠãŠãŒã¶ãŒããã€ã¹ãããŒã¿ã«èŠããŸãããUser
ãšSocial
ã«ã¯æç¢ºã«åããã¹ãçç±ããããŸãã
-
User
ããŒã¿ã¯èªå以å€ããæŽæ°ãããããªã -
Social
ããŒã¿ã¯èªå以å€ããã®æŽæ°ã§ããããã«ããã
çç±ã¯ããã ãã§ã¯ãããŸãããSocial
ããŒã¿ã®æ¹ãå§åçã«æŽæ°é »åºŠãå€ãã¯ãã§ãã
ããã§User
ããŒã¿ã®ç¹æ§ãèããŠã¿ãŸãããããã®ããŒã¿ã¯ã©ãã§å©çšãããã§ããããããœãŒã·ã£ã«æ©èœãäœã£ãŠããã®ã§ããã°ãŠãŒã¶ãŒæ€çŽ¢ã¯å¿
é ãªæ©èœãšãªãåŸãã§ããããCloud Firestoreã®æ€çŽ¢æ©èœã¯éåžžã«è²§åŒ±ãªã®ã§AlgoliaãElasticSearchãªã©ã«æ€çŽ¢æ©èœãä»»ããããšãèããããŸãã
åæã«AlgoliaãElasticSearchã®æŽæ°ã«ã¯Cloud Functionsãå©çšããããšãæ³åã§ãããšæããŸããããUser
ããŒã¿ã«Social
ããŒã¿ãå«ããŠãããã©ããªãã§ãããããã«ãŠã³ããã€ã³ã¯ãªã¡ã³ããããã ãã§Cloud Functionsãããªã¬ãŒãããããšã«ãªãããã§ãã
â Query
ãã®ãªã¬ãŒã·ã§ã³ã®æ¹æ³ãRDBã§ã䜿ãããäžè¬çãªæ¹æ³ã§ããRTDBãšã¯éãwhere
ãå©çšã§ããããã«ãªã£ãŠãšãŠã䟿å©ã«ãªããŸããã
â Sub Collection
Cloud Firestoreæå€§ã®ç¹åŸŽããã®SubCollection
ã§ãããã®æ§é ã¯ä»ã®ããŒã¿ããŒã¹ã«ã¯ååšããŸããã
QueryãšSubCollectionã®äœ¿ãåã
ããã§QueryãšSubCollectionã®äœ¿ãåãã«ã€ããŠèããŠã¿ãŸãããã
Cloud Firestoreã®SubCollectionãšQueryã£ãŠãã€äœ¿ãã®åé¡
éå»ã®ãã®æ§ãªèšäºããªãªãŒã¹ããŸãããããã®åé¡ã®è§£çç·šã«ãªããŸãã
- | ã¡ãªãã | ãã¡ãªãã |
---|---|---|
Query | 暪æçã«Queryãè¡ãã | Readã®ã»ãã¥ãªãã£ã«ãŒã«ã¯å¿ ãå šå¡ã«å ¬éããå¿ èŠããã |
SubCollection | ã»ãã¥ãªãã£ã®èšå®ã容æ | ãã¹ãããŠãã芪ããŸããã§æ€çŽ¢ã¯è¡ããªã |
CollectionGroup | ãã¹ãããŠãã芪ããŸããã§æ€çŽ¢ãè¡ãã | 暪æç¯å²ãåºãã»ãã¥ãªãã£ã®èšå®ãé£ãã |
暪æçã«Queryãè¡ãã
ã®èª¬æãããŠãããŸãã
Cloud Firestoreã§ã¯ããã¥ã¡ã³ãã«åŒ·åºãªã»ãã¥ãªãã£ã«ãŒã«ãèšå®ããå Žåã«Queryãå®è¡ããããšãã§ããªããªããŸãã
ã»ãã¥ãªãã£ã«ãŒã«ãšQueryã®é¢ä¿ã¯ãã¡ãã«èšèŒãããŠããŸãã
https://firebase.google.com/docs/firestore/security/rules-query?hl=ja
ã€ãŸãRoot Collectionã«é
眮ããããã¥ã¡ã³ãã¯ç·©ãããªã»ãã¥ãªãã£ã«ãŒã«ãæã£ãŠããå¿
èŠããããŸãã
2019幎6æã®ã¢ããããŒãã§Cloud Firestoreã§CollectionGroupãå©çšå¯èœã«ãªããŸããã
SubCollectionã§ã暪æçã«Queryãå®è¡ã§ããããã«ãªããŸããã
åŸ
ã¡çŠãããCollectionGroupãCloud Firestoreãžãã£ãŠããã
ããŒã¿ã®ã€ã³ãµãŒããå€ãCollectionã¯RootCollectionã«ã¯é
眮ããªã
Collectionãžã®ã€ã³ãµãŒãã«ã¯1ç§é500åã®å¶éããããŸããã³ã³ã·ã¥ãŒããŒåãã®ãµãŒãã¹ã§ç¬éçæ§èœãå¿
èŠãªãµãŒãã¹ãäœãã®ã§ããã°SubCollectionãå©çšããæ¹ãè¯ãã§ãããã
äŸãã°
- ECãªã©ã®å£²äžã管çãããå Žåã
Transaction Document
ãRootCollectionã«é 眮ããŠããŸããš1ç§ã«500件以äžã®è²©å£²ããããšãã§ããªãã/user/:user_id/transactions/:transaction_id
ãšããŠCollectionGroup
ã§èšç®ããæ¹ãè¯ãããã§ãã
ã»ãã¥ãªãã£ãäœ¿ãæ¹ãåãã
2ã€ã®ãªã¬ãŒã·ã§ã³æ¹æ³ã®äœ¿ãåãã¯ã»ãã¥ãªãã£ã«äŸåããŸãã
ãµãŒãã¹ã®å
šå©çšè
ã«å
¬éã§ããæ
å ±ã¯Root CollectionãšããŠQuery
ã§ãªã¬ãŒã·ã§ã³ããã®ãè¯ãããã§ããäžå®ã®ã»ãã¥ãªãã£ãä¿ã¡ããæ
å ±ã¯SubCollectionã«ããæ¹ãè¯ãããã§ãã
äŸãã°
- ããã°ã®èšäºãªã©ã®å ¬éæ å ±ã¯ã«ãŒãã³ã¬ã¯ã·ã§ã³ãž
- æ±ºæžæ å ±ãªã©ã»ãã¥ã¢ãªæ å ±ã¯Userã®SubCollectionãž
â Junction Collection
ãã®æ¹æ³ãRDBã§äœ¿ãããäžéããŒãã«ããã€æ¹æ³ã§ãã
â Reference Collection
ãã®æ¹æ³ã¯Cloud Firestoreã®SubCollectionãå©çšããæ¹æ³ã§ãã
NoSQLã§å¯äžCloud Firestoreã ããåºæ¥ãæ§æã§ãã
Firebase Realtime Databaseã§ããã®æ¹æ³ã䜿ããšæ§é äžããŒã¿ãè¥å€§åããããšã«ãªã䜿ãããšãåºæ¥ãŸããã§ãããCloud Firestoreã§ã¯ãDocumentãšCollectionã«åé¢ãããæ§é ã«ãªã£ãŠããããããã®å¶çŽããªããªããŸããã
Junction CollectionãšReference Collectionã®äœ¿ãåã
- | ã¡ãªãã | ãã¡ãªãã |
---|---|---|
Junction Collection | 暪æçã«ãªã¬ãŒã·ã§ã³ã·ããã®æ€çŽ¢ãè¡ãã ç¶æ ãæãŠã |
Readã®ã»ãã¥ãªãã£ã«ãŒã«ã¯å¿ ãå šå¡ã«å ¬éããå¿ èŠããã |
ReferenceCollection | ããªã¬ãŒã·ã§ã³ã·ãããæã£ãŠããç¶æ ãé ãã | ãã¹ãããŠãã芪ããŸããã§æ€çŽ¢ã¯è¡ããªã |
N:Nã®ãªã¬ãŒã·ã§ã³ã·ããã«ãããŠããã»ãã¥ãªãã£ã«ãŒã«ã«äŸåããŸãã
äŸãã°ãæåŸ
æ©èœ
ã®æ©èœãèããŠã¿ãŸãããã
User A
ããUser B
ã«éãããæåŸ ç¶ãæªéå°
ã®ãŸãŸã§ããã
ãããJunction Collectionã®ããŒã¿ã«ãããªãã°äžã®ããã«ãªããŸãã
// Invitation
{
"fromID": "userA",
"toID": "userB",
"status": "isUnopened"
}
次ã«ããã®æåŸ
ç¶ãåãå
¥ãããšãããããã©ããŒé¢ä¿ãæãç«ã€ãšããŸãããã
ãããæ§é ã§è¡šããšäžã®ããã«ãªããŸãã
/user/userA/followers/userB
/user/userB/followers/userA
User A
ãUser B
ãfollowers
ãšããŠä¿æããUser B
ãUser A
ãfollowers
ãšããŠä¿æããã
Firestoreã§ã¯WriteBatch
ã䜿ã£ãŠè€æ°ã®æžã蟌ã¿å
ã«åæã«äžåºŠã«æžã蟌ãããšãå¯èœãªã®ã§ãã©ã®åŠçãç°¡åã«è¡ããŸãã
ãã©ã³ã¶ã¯ã·ã§ã³ãšäžæ¬æžã蟌ã¿
Firestotre ã®ãããåŠçãšãã©ã³ã¶ã¯ã·ã§ã³åŠç
â Duplicated Collection
ãã®æ¹æ³ã¯ãã»ãã¥ãªãã£ãä¿ã¡ã€ã€ããŒã¿ãåç
§ããããŒã¿ãåç
§ããæ¹æ³ã§ãã
æ±ºæžæ
å ±ããã€ããŒã¿æ§æãèããŠã¿ãŸãããã
Shop
ã®Product
ãUser
ãè³Œå ¥ããæ å ±ãTransaction
ãšããŠä¿æããã
Transaction
ã¯Shop
ãšUser
ã®ã¿ãåç §ã§ããã
ãã®èŠä»¶ãæºè¶³ãããæãTransaction
ã¯ã©ãã«ä¿æããã®ãããã§ããããã
ãŸããTransaction
ã«ã¯å¿
ãã»ãã¥ãªãã£ã«ãŒã«ãèšå®ããã®ã§ã暪æçãªQueryã¯æ©èœããªããªããŸãããã®ããã«ãŒãã³ã¬ã¯ã·ã§ã³ã«é
眮ããããšã¯é¿ããæ¹ãè¯ãããã§ãã
次ã«ãã»ãã¥ãªãã£ãæ
ä¿ããããã«ã¯SubCollectionæ§é ã«ããã®ãè¯ãããã§ãããShop
ãšUser
ã®ã©ã¡ãã«æãããã®ãããã§ããããïŒUser
ãæããããšShop
ããã¯åç
§ã§ããŸããããShop
ã«æããããšUser
ããã¯åç
§ã§ããŸããã
ãšããããšã§åæ¹ã«ä¿æããããã«ããŸãããããããWriteBatchãå©çšããããšã§ç°¡åã«å®çŸå¯èœã§ãããã ããã®æ¹æ³ã¯ãTransactionã®ããã«æžãæãé »åºŠãäœãããŒã¿ã«éã£ãæ¹ãè¯ãããã§ãã
åé·åãã¹ãããŒã¿ã®å¶é
次ã®ããŒã¿æ§é ãèããŠã¿ãŸãããã ãŠãŒã¶ãŒã®æ å ±ãåé·åããŠãã©ããŒã«ä¿åããŠããŸãã
// /user/:user_id
{
"name": "hoge",
"location": [0, 0],
"age": "25"
}
// /user/:user_id/followers/:id
{
"name": "hoge",
"location": [0, 0],
"age": "25"
}
ãŠãŒã¶ãŒæ å ±ã¯é«é »åºŠã§æŽæ°ãããããšãäºæ³ãããŸãããŠãŒã¶ãŒã®æ å ±ãæŽæ°ããã床ã«ãã©ããŒå ã®ããŒã¿ãæŽæ°ããã®ã¯ãšãŠãããèšèšãšã¯èšããŸããã
ç§ã宿Šã§å©çšããŠããããŒã¿æ§é ã8åã玹ä»ããŸããããä»ã«ãããããæ§æãèããããŸããèŠã€ããããã²æããŠãã ããã
ã¢ããªã§èæ ®ããããš
REST API
Cloud Firestoreã¯ãSDKãå©çšããããšã§DBã«çŽæ¥æžã蟌ã¿ãã§ããŸããäžæ¹ã§Cloud Functionsã䜿ãããšã§REST APIãèšãCloud Functionsçµç±ã§DBã«æžã蟌ãããšãå¯èœã§ãã
ã§ã¯ã©ã¡ãã䜿ãã°ããã®ãèããŠã¿ãŸãããã
ã»ãã¥ãªãã£ã«ã€ããŠ
ã»ãã¥ãªãã£çã«ã¯REST APIã§ãSDKã§ãã£ãŠã倧ããªå·®ã¯ãããŸããããã SDKã§ã¯ã»ãã¥ãªãã£ã«ãŒã«ã ãèæ
®ããã°ããã®ã«å¯ŸããŠãREST APIã§ã¯Cloud Functionsã®äžã§å
šãŠãAdminã§åããããšã«ãªããŸãã®ã§APIã®ã»ãã¥ãªãã£ã«ã¯æ³šæãããå¿
èŠããããŸãã
å®è£
å·¥æ°
ãããã¿ã€ãã³ã°ãªã©ã§ã¯SDKãå©çšããæ¹ãå§åçã«å®è£
å·¥æ°ãäœæžã§ããŸãããã ããã»ãã¥ãªãã£ã«ãŒã«ãæäœéã«ããŠããã®ã«éããŸããå人çã«ã¯ãããã¿ã€ãã³ã°ã®æ®µéã§åŒ·åºãªã»ãã¥ãªãã£ã«ãŒã«ã¯å¿
èŠãªããšæã£ãŠããã®ã§ãæäœéã®ã«ãŒã«ãèšèŒããŠéçºãé²ããã®ãããã§ãããã
Callable Functions
Firebaseã«ã¯Callable functions
ãšåŒã°ããå°çšã®APIãæºåãããŠããŸãããã®APIã«ã¯Authæ
å ±ãå«ãŸããŠããã®ã§REST APIãäœããããå®å
šã«å®è£
ããããšãå¯èœã§ãã
REST APIãå€éšããåŒã¶ããšããªãããã§ããã°REST APIã¯å©çšããCallable Functions
ãå©çšããããšãããã§ãããã
Callable Functions vs SDK
Cloud Functionsã«åŠçãä»»ããããšã®æå€§ã®ã¡ãªããã¯ã»ãã¥ãªãã£ã«ãŒã«ããã€ãã¹ããäºã§ããéçšãéå§ãããã»ãã¥ãªãã£ã«ãŒã«ã匷åºã«ããŠãã£ãæå¿
ãæš©éã®æããæ¹ã«å°ãããšããããŸããäŸãã°å
ã»ã©ã®ç޹ä»ããDuplicated Collection
ã§ã¯å¿
ãçžæã®ä¿è·ãããé åã«æžã蟌ã¿ãè¡ãããšã«ãªããŸãããšãªããšCloud Functionsãçµç±ããã®ã¯å¿
é ãšãªããŸãã
ãŸããSDKã§ã¯ã»ãã¥ãªãã£ãèæ
®ããæžã蟌ã¿ãè¡ãããå Žåã«æŽ»çšããã®ãããã§ãããããã¯ãFirebaseã®éçºã®ééå³ã¯éçºã®é«éåã«ãããšæããŸãã®ã§ããããŠAPIãå©çšããªããŠããã®ã§ããã°å¯èœãªéããã¡ãã䜿ãã®ãåŸçã§ãããšèããŠããŸãã
Cloud Firestore Best Practice
Killswitch
Firebase Realtime Databaseãšåæ§ã«ãCloud Firestoreã¯éçºåŽã®éœåã§ãµãŒããŒã忢ããããšã¯ã§ããŸãããå¿
ãã¯ã©ã€ã¢ã³ãããã®å©çšãå¶éããæ©èœãèšããŸãããã
KillSwitchèªäœãCloud Firestoreã«æãããäºãå¯èœã§ãã
äŸãã°äžã®å³ã®ããã«åŒ·å¶ã¢ããããŒããå¿ èŠãªããŒãžã§ã³ãã¢ããªãå©çšå¯èœãã瀺ããã©ã°ãæãããããšã§ãã³ããªã³ã°ããŸãããã
Model
Modelèšèš
RDBãå©çšããŠãããšã³ãžãã¢ã§ã°ããã»ã©ãNoSQLã®èšèšã«ã¯èŠåŽããŸããåã®åšãã®äººéãå®éã«ããã§ããNoSQLã®èšèšã«ã¯å²ãåããå¿ èŠã§ããããã¯ããã¯ãç¥ã£ãŠããå¿ èŠããããŸãããCloud FirestoreãžQueryãå®è£ ãããããšããããããçšåºŠRDBã§å©çšãããŠããèãæ¹ãéçšããŸãããŸãã¯ãSubCollectionã«ã€ããŠèããã®ã§ã¯ãªãRoot Collectionã«Modelãé 眮ãããããã¿ã€ãã³ã°ãè¡ã£ãŠã¿ãŸããããããŒã¿ååŸã®æé©åãå¿ èŠãªãã€ã³ãã¯ããã§æŽçã§ããŸãããã»ãã¥ãªãã£ã«ãŒã«ã匷åºã«ããå¿ èŠããããã€ã³ããèŠããŠããã¯ãã§ãã
Modelèšèšã®å¶çŽ
â Modelã¯äžŠåã«æ§æãã
SubCollectionãæºåãããããšã§ããã¹ãæ§é ãããCloud Firestoreã®ç骚é ã®ããã«èŠããããç¥ããŸãããããããŸã§NoSQLããŒã¿ããŒã¹ã®æ¬ ç¹ãè£ãæ©èœã«ãããŸãããNoSQLã®ããŒã¿ããŒã¹èšèšãçè§£ããå¹ççã«SubCollectionãæŽ»çšããŸãããã
â Modelã¯updatedAt
, createdAt
ãä¿æãã
ãã¯ãã¢ããªéçºç³»ã®æ
£äŸçãªéšåã§ããããŸããããã¯ããã®æ
å ±ã¯æã£ãŠããããšã¯ãããéèŠã§ãã
éçšæã«ã圹ã«ãã¡ãŸãããéçºã«ãããŠããœãŒãã§å©çšããããšã¯çµæ§ãããŸãã
â Modelå ã®ArrayãæŽ»çšãã
ããã¯Firebase Realtime Databaseãšå šãéã®èãã«ãªãã®æ³šæããŠãã ãããCloud Firestoreã§ã¯ãArrayã®å¶åŸ¡ã远å ãããŸãããArrayãQueryã§å©çšããããšãå¯èœãªã®ã§ç©æ¥µçã«Arrayãå©çšããŸãããã
Better Arrays in Cloud Firestore!
â Modelå ã«ããŒããã·ã§ã³ãæããã
public
private
ãªã©ã®ããŒããã·ã§ã³ãæãããããšã§ãã»ãã¥ãªãã£ã«ãŒã«ã®ãã³ããªã³ã°ç°¡åã«è¡ãããšãå¯èœã«ãªããŸãã
Firebase Summit 2018ã®ã»ãã·ã§ã³ã§ã詳ãã解説ãããŠããã®ã§ãã¡ãããåç §ãã ããã
https://www.youtube.com/watch?v=pvLkkLjHdkw&index=6&list=PLl-K7zZEsYLnqdlmz7iFe9Lb6cRU3Nv4R
æåŸã«
Firebaseã«ãããŠã®äžèšã®èšèšææ³ããModelã管çã§ããLibraryãäœããŸããã
ã©ã€ãã©ãªã®å©çšå®çžŸãå¢ããŠè¡ã£ãŠãŸãïŒãã²å©çšããŠãã ããïŒïŒã³ã³ããªãã¥ãŒã¿ãŒãåéããŠãããŸãïŒ
MENTAã§FirebaseãåŠã¶è¬åº§ãã£ãŠãŸãïŒ
https://menta.work/plan/913
Pring for iOS
https://github.com/1amageek/Pring
Pring for Cloud Functions
https://github.com/1amageek/pring-admin.ts
Pring for Web
https://github.com/1amageek/pring.ts
Firebaseã«ã€ããŠããã«è©³ããç¥ãããæ¹ã¯æ¬¡ãã芧ãã ããã