אתם יכולים להשתמש גם ב-Firebase Realtime Database וגם ב-Cloud Firestore באפליקציה, ולנצל את היתרונות של כל פתרון מסדי נתונים בהתאם לצרכים שלכם. לדוגמה, תוכלו להשתמש בתמיכה של Realtime Database בסטטוס 'באינטרנט', כפי שמתואר במאמר יצירת סטטוס 'באינטרנט' ב-Cloud Firestore.
למידע נוסף על ההבדלים בין מסדי הנתונים
העברת נתונים אל Cloud Firestore
אם החלטתם להעביר חלק מהנתונים מ-Realtime Database אל Cloud Firestore, כדאי להשתמש בתהליך הבא. מכיוון שלכל מסד נתונים יש צרכים ייחודיים ושיקולים מבניים, אין נתיב אוטומטי להעברה. במקום זאת, תוכלו לעקוב אחרי ההתקדמות הכללית הבאה:
ממפים את מבנה הנתונים ואת כללי האבטחה מ-Realtime Database ל-Cloud Firestore. גם Realtime Database וגם Cloud Firestore מסתמכים על אימות ב-Firebase, כך שלא צריך לשנות את אימות המשתמשים לאפליקציה, אבל כללי האבטחה ומודל הנתונים שונים, וחשוב להביא בחשבון את ההבדלים האלה לפני שמתחילים להעביר את הנתונים ל-Cloud Firestore.
העברת נתונים היסטוריים כשמגדירים את מבנה הנתונים החדש ב-Cloud Firestore, אפשר למפות ולהעביר נתונים קיימים מ-Realtime Database למכונה החדשה של Cloud Firestore. עם זאת, אם אתם משתמשים בשני מסדי הנתונים באפליקציה, אין צורך להעביר את הנתונים ההיסטוריים מ-Realtime Database.
שיקוף נתונים חדשים ב-Firestore בזמן אמת. משתמשים ב-Cloud Functions כדי לכתוב נתונים חדשים למסד הנתונים החדש Cloud Firestore כשהם מתווספים ל-Realtime Database.
מגדירים את Cloud Firestore כמסד הנתונים הראשי של הנתונים שהועברו. אחרי שתעבירו חלק מהנתונים, תוכלו להשתמש ב-Cloud Firestore בתור מסד הנתונים הראשי ולצמצם את השימוש ב-Realtime Database לנתונים שהועברו. כדאי לבדוק אילו גרסאות של האפליקציה עדיין קשורות ל-Realtime Database לצורך קבלת הנתונים האלה, ואיך אתם מתכננים להמשיך לתמוך בהן.
חשוב להביא בחשבון את העלויות של החיוב גם ב-Realtime Database וגם ב-Cloud Firestore.
מיפוי הנתונים
הנתונים ב-Realtime Database מובְנים כעץ יחיד, בעוד ש-Cloud Firestore תומך בהיררכיות נתונים מפורשות יותר באמצעות מסמכים, אוספים ואוספים משניים. אם מעבירים חלק מהנתונים מ-Realtime Database אל Cloud Firestore, כדאי לשקול ארכיטקטורה אחרת לנתונים.
הבדלים עיקריים שכדאי להביא בחשבון
אם מעבירים נתונים מעץ Realtime Database הקיים למסמכים ולאוספים ב-Cloud Firestore, חשוב לזכור את ההבדלים העיקריים הבאים בין מסדי הנתונים, שעשויים להשפיע על אופן המבנה של הנתונים ב-Cloud Firestore:
- שאילתות שטוחות מציעות גמישות רבה יותר במבנים היררכיים של נתונים.
- שאילתות מורכבות מספקות רמת פירוט גבוהה יותר ומפחיתות את הצורך בנתונים כפולים.
- הסמן של השאילתה מאפשר חלוקה לדפים יעילה יותר.
- עסקאות כבר לא דורשות שורש משותף לכל הנתונים, והן יעילות יותר.
- עלויות החיוב שונות בין Realtime Database לבין Cloud Firestore. במקרים רבים, Cloud Firestore עשוי להיות יקר יותר מ-Realtime Database, במיוחד אם מסתמכים על הרבה פעולות קטנות. כדאי לצמצם את מספר הפעולות במסד הנתונים ולהימנע מכתיבת מידע מיותר. מידע נוסף על ההבדלים בחיוב בין Realtime Database לבין Cloud Firestore
שיטות מומלצות בפעולה
הדוגמה הבאה משקפת חלק מהשיקולים שצריך לקחת בחשבון כשעוברים את הנתונים בין מסדי נתונים. תוכלו להשתמש בקריאות רדודות וביכולות שיפור של שאילתות כדי ליצור מבני נתונים טבעיים יותר מאשר אלו שהשתמשתם בהם ב-Realtime Database.
כדאי לחשוב על אפליקציית מדריך עיר שעוזרת למשתמשים למצוא ציוני דרך בולטים בערים ברחבי העולם. מכיוון ש-Realtime Database חסר קריאות שטחיות, יכול להיות שתצטרכו לבנות את הנתונים בשני צמתים ברמה העליונה, באופן הבא:
// /cities/$CITY_KEY
{
name: "New York",
population: 8000000,
capital: False
}
// /city-landmark/$CITY_KEY/$LANDMARK_KEY
{
name: "Empire State Building",
category: "Architecture"
}
ב-Cloud Firestore יש קריאות לא ברורות, כך שהרצת שאילתות על מסמכים באוסף לא שולפת נתונים מאוספים של משנה. לכן, אפשר לאחסן מידע על ציוני דרך באוסף משנה:
// /cities/$CITY_ID
{
name: "New York",
population: 8000000,
capital: False,
landmarks: [... subcollection ...]
}
הגודל המקסימלי של המסמכים הוא 1MB, וזו סיבה נוספת לאחסן את הסימנים התחתונים כאוסף משנה, כך שכל מסמך עירוני הוא קטן, ולא מתנפחים עם רשימות בתוך רשימות.
יכולות השאילתות המתקדמות של Cloud Firestore מפחיתות את הצורך לשכפל נתונים לדפוסי גישה נפוצים. לדוגמה, נניח שרוצים להציג באפליקציית מדריך הערים את כל הבירות לפי סדר האוכלוסייה.
ב-Realtime Database, הדרך היעילה ביותר לעשות זאת היא לשמור רשימה נפרדת של ערי בירה עם נתונים כפולים מהרשימה cities
, באופן הבא:
{
cities: {
// ...
},
capital-cities: {
// ...
}
}
ב-Cloud Firestore אפשר להשתמש ברשימה של ערים בירה לפי סדר האוכלוסייה כשאילתה אחת:
db.collection('cities')
.where('capital', '==', true)
.orderBy('population')
מידע נוסף על מודל הנתונים של Cloud Firestore פתרונות עם רעיונות נוספים לתכנון מבנה של מסד הנתונים של Cloud Firestore
אבטחת הנתונים
בין אם אתם משתמשים ב-Cloud Firestore Security Rules ל-Android, ב-Apple או בלקוחות אינטרנט, או בניהול הרשאות גישה (IAM) לשרתים, חשוב לוודא שהנתונים שלכם מאובטחים ב-Cloud Firestore וגם ב-Realtime Database. אימות משתמש מטופל על ידי 'אימות' בשני מסדי הנתונים, כך שלא צריך לשנות את ההטמעה של האימות כשמתחילים להשתמש ב-Cloud Firestore.
הבדלים עיקריים שכדאי להביא בחשבון
- ערכות SDK לנייד ולאינטרנט משתמשות ב-Cloud Firestore Security Rules, וערכות SDK של שרתים משתמשות בניהול הרשאות גישה (IAM) כדי לאבטח נתונים.
- Cloud Firestore Security Rules לא מתבצעת שרשור אלא אם משתמשים בתווים כלליים לחיפוש. מסמכים ואוספים לא יורשים כללים בדרך אחרת.
- לא צריך יותר לאמת את הנתונים בנפרד (כפי שעשינו ב-Realtime Database).
- Cloud Firestore בודק את הכללים לפני ביצוע השאילתה כדי לוודא שלמשתמש יש את הגישה המתאימה לכל הנתונים שמוחזרים על ידי השאילתה.
העברת נתונים היסטוריים אל Cloud Firestore
אחרי שמיפיתם את מבני הנתונים והאבטחה למודלים של הנתונים והאבטחה של Cloud Firestore, תוכלו להתחיל להוסיף את הנתונים. אם אתם מתכננים לשלוח שאילתות על נתונים היסטוריים אחרי שתעבירו את האפליקציה מ-Realtime Database ל-Cloud Firestore, עליכם להוסיף ייצוא של הנתונים הישנים למסד הנתונים החדש של Cloud Firestore. אם אתם מתכננים להשתמש גם ב-Realtime Database וגם ב-Cloud Firestore באפליקציה, תוכלו לדלג על השלב הזה.
כדי למנוע החלפה של נתונים חדשים בנתונים ישנים, מומלץ להוסיף קודם את הנתונים ההיסטוריים. אם מוסיפים נתונים חדשים לשני מסדי הנתונים בו-זמנית, כפי שמתואר בשלב הבא, חשוב לתת עדיפות לנתונים החדשים שנוספו ל-Cloud Firestore על ידי Cloud Functions.
כדי להעביר נתונים היסטוריים אל Cloud Firestore:
- לייצא את הנתונים מ-Realtime Database או להשתמש בגיבוי עדכני.
- עוברים לקטע Realtime Database במסוף Firebase.
- בכרטיסייה Data, בוחרים את הצומת ברמת הבסיס של מסד הנתונים ובוחרים באפשרות Export JSON בתפריט.
יוצרים את מסד הנתונים החדש ב-Cloud Firestore ומוסיפים את הנתונים.
כשאתם מעבירים חלק מהנתונים אל Cloud Firestore, כדאי לשקול את האסטרטגיות הבאות:
- כותבים סקריפט מותאם אישית שיעביר את הנתונים בשבילכם. אנחנו לא יכולים להציע תבנית לסקריפט הזה, כי לכל מסד נתונים יש צרכים ייחודיים, אבל Cloud Firestore מומחים בערוץ Slack שלנו או ב-Stack Overflow יכולים לבדוק את הסקריפט או להציע עצות למקרה הספציפי שלכם.
- משתמשים ב-SDK של השרת (Node.js, Java, Python או Go) כדי לכתוב נתונים ישירות ל-Cloud Firestore. הוראות להגדרת ערכות ה-SDK של השרת מפורטות במאמר תחילת העבודה.
- כדי לזרז העברות של כמויות גדולות של נתונים, כדאי להשתמש בכתיבה באשכולות ולשלוח עד 500 פעולות בבקשת רשת אחת.
- כדי לא לחרוג ממגבלות הקצב של Cloud Firestore, כדאי להגביל את הפעולות ל-500 שינויי כתיבה לשנייה לכל קולקציה.
הוספת נתונים חדשים אל Cloud Firestore
כדי לשמור על התאמה בין מסדי הנתונים, מוסיפים נתונים חדשים לשני מסדי הנתונים בזמן אמת. משתמשים ב-Cloud Functions כדי להפעיל כתיבה ב-Cloud Firestore בכל פעם שלקוח כותב ב-Realtime Database. חשוב לוודא שהערך של Cloud Firestore מקבל קדימות לנתונים חדשים שמקורם ב-Cloud Functions על פני כל כתיבה שאתם מבצעים מהעברת הנתונים ההיסטוריים.
יוצרים פונקציה שכותבת נתונים חדשים או משתנים ל-Cloud Firestore בכל פעם שלקוח כותב נתונים ל-Realtime Database. מידע נוסף על טריגרים של Realtime Database ל-Cloud Functions.
הופכים את Cloud Firestore למסד הנתונים הראשי של הנתונים שהועברו
אם החלטתם להשתמש ב-Cloud Firestore כמסד הנתונים הראשי של חלק מהנתונים שלכם, חשוב להביא בחשבון את כל הפונקציות של שיקוף הנתונים שהגדרתם ולאמת את Cloud Firestore Security Rules.
אם השתמשתם ב-Cloud Functions כדי לשמור על תאימות בין מסדי הנתונים, חשוב לוודא שאתם לא מכפילים פעולות כתיבה בשני מסדי הנתונים בלולאה. אפשר להחליף את הפונקציה כך שתכתוב למסד נתונים יחיד, או להסיר את הפונקציה לגמרי ולהתחיל להפסיק בהדרגה את פעולת הכתיבה לנתונים שמועברים באפליקציות שעדיין קשורות ל-Realtime Database. האופן שבו תפעלו את זה באפליקציה שלכם תלוי בצרכים הספציפיים שלכם ובמשתמשים שלכם.
מוודאים שהנתונים מאובטחים כראוי. מאמתים את ההגדרה של Cloud Firestore Security Rules או IAM.