שימוש ב-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היכולות המתקדמות של שאילתות ב-'s מפחיתות את הצורך לשכפל נתונים עבור דפוסי גישה נפוצים. לדוגמה, נניח שיש מסך באפליקציית מדריך הערים שמציג את כל ערי הבירה לפי סדר האוכלוסייה. ב-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 או אינטרנט, או ב-Identity Access Management‏ (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 (מסדי נתונים ואחסון) >‏ Realtime Database (מסד נתונים בזמן אמת).
    2. בכרטיסייה Data (נתונים), בוחרים את הצומת ברמת הבסיס של מסד הנתונים ובתפריט בוחרים באפשרות Export JSON (ייצוא JSON).
  2. יוצרים את מסד הנתונים החדש ב-Cloud Firestore ומוסיפים את הנתונים.

    כדאי לשקול את האסטרטגיות הבאות כשמעבירים חלק מהנתונים אל Cloud Firestore:

    • לכתוב סקריפט מותאם אישית שיעביר את הנתונים בשבילכם. אנחנו לא יכולים לספק תבנית לסקריפט הזה, כי לכל מסד נתונים יש צרכים ייחודיים. עם זאת, מומחים בערוץ Slack שלנו או ב-Stack Overflow יכולים לבדוק את הסקריפט שלכם או להציע לכם ייעוץ לגבי המצב הספציפי שלכם.Cloud Firestore
    • משתמשים בערכות ה-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.Cloud Firestore Security Rules

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

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