שימוש ב-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:

  • שאילתות שטוחות מאפשרות גמישות רבה יותר במבני נתונים היררכיים.
  • שאילתות מורכבות מאפשרות פירוט רב יותר ומפחיתות את הצורך בנתונים כפולים.
  • סמני שאילתות (query cursor) מאפשרים חלוקה חזקה יותר לדפים.
  • בטרנזקציות כבר לא נדרש שורש משותף לכל הנתונים, והן יעילות יותר.
  • עלויות החיוב שונות בין 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. במסוף Firebase, נכנסים אל Databases & Storage > מסד נתונים בזמן אמת.
    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.