שימוש ב-Cloud Firestore עם מסד נתונים בזמן אמת ב-Firebase

אתם יכולים להשתמש גם ב-Firebase Realtime Database וגם ב-Cloud Firestore באפליקציה, ולנצל את היתרונות של כל פתרון מסדי נתונים בהתאם לצרכים שלכם. לדוגמה, תוכלו להשתמש בתמיכה של Realtime Database בסטטוס 'באינטרנט', כפי שמתואר במאמר יצירת סטטוס 'באינטרנט' ב-Cloud Firestore.

מידע נוסף על ההבדלים בין מסדי הנתונים

העברת נתונים אל Cloud Firestore

אם החלטתם להעביר חלק מהנתונים מ-Realtime Database אל Cloud Firestore, כדאי להשתמש בתהליך הבא. מכיוון שלכל מסד נתונים יש צרכים ייחודיים ושיקולים מבניים, אין נתיב אוטומטי להעברה. במקום זאת, אפשר לפעול לפי התהליך הכללי הבא:

  1. ממפים את מבנה הנתונים וכללי האבטחה מ-Realtime Database ל-Cloud Firestore. גם Realtime Database וגם Cloud Firestore מסתמכים על אימות ב-Firebase, כך שלא צריך לשנות את אימות המשתמשים לאפליקציה, אבל כללי האבטחה ומודל הנתונים שונים, וחשוב להביא בחשבון את ההבדלים האלה לפני שמתחילים להעביר את הנתונים ל-Cloud Firestore.

  2. העברת נתונים היסטוריים כשמגדירים את מבנה הנתונים החדש ב-Cloud Firestore, אפשר למפות ולהעביר נתונים קיימים מ-Realtime Database למכונה החדשה של Cloud Firestore. עם זאת, אם אתם משתמשים בשני מסדי הנתונים באפליקציה, אין צורך להעביר את הנתונים ההיסטוריים מ-Realtime Database.

  3. העתקת נתונים חדשים ל-Firestore בזמן אמת שימוש ב-Cloud Functions כדי לכתוב נתונים חדשים למסד הנתונים החדש של Cloud Firestore, בזמן הוספתו ל-Realtime Database.

  4. מגדירים את 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. אימות המשתמשים מתבצע על ידי Authentication בשני מסדי הנתונים, כך שאין צורך לשנות את ההטמעה של Authentication כשמתחילים להשתמש ב-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, צריך לבצע את השלבים הבאים:

  1. לייצא את הנתונים מ-Realtime Database או להשתמש בגיבוי עדכני.
    1. עוברים לקטע Realtime Database במסוף Firebase.
    2. בכרטיסייה Data, בוחרים את הצומת ברמת הבסיס של מסד הנתונים ובוחרים באפשרות Export JSON בתפריט.
  2. יוצרים את מסד הנתונים החדש ב-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.

  1. אם השתמשתם ב-Cloud Functions כדי לשמור על תאימות בין מסדי הנתונים, חשוב לוודא שאתם לא מכפילים פעולות כתיבה בשני מסדי הנתונים בלולאה. אפשר להחליף את הפונקציה כך שתכתוב למסד נתונים יחיד, או להסיר את הפונקציה לגמרי ולהתחיל להפסיק בהדרגה את פעולת הכתיבה לנתונים שמועברים באפליקציות שעדיין קשורות ל-Realtime Database. הטיפול בעניין הזה באפליקציה תלוי בצרכים הספציפיים ובמשתמשים שלכם.

  2. מוודאים שהנתונים מאובטחים כראוי. מאמתים את ההגדרה של Cloud Firestore Security Rules או IAM.