מודל נתונים של Firestore בענן

Cloud Firestore הוא מסד נתונים המכוון למסמכים NoSQL. בניגוד למסד נתונים של SQL, אין טבלאות או שורות. במקום זאת, אתה לאחסן נתונים ומסמכים, אשר מאורגנים לאוספים.

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

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

אוספים ומסמכים נוצרים באופן מרומז בענן Firestore. כל שעליך לעשות הוא להקצות נתונים למסמך בתוך אוסף. אם האוסף או המסמך אינם קיימים, Cloud Firestore יוצר אותו.

מסמכים

בענן Firestore, יחידת האחסון היא המסמך. מסמך הוא רשומה קלת משקל המכילה שדות, הממופים לערכים. כל מסמך מזוהה על ידי שם.

מסמך המייצג משתמש alovelace עשוי להיראות כך:

  • alovelace

    first : "Ada"
    last : "Lovelace"
    born : 1815

אובייקטים מורכבים ומקוננים במסמך נקראים מפות. לדוגמה, תוכל לבנות את שם המשתמש מהדוגמה שלמעלה באמצעות מפה, כך:

  • alovelace

    name :
    first : "Ada"
    last : "Lovelace"
    born : 1815

יתכן שתבחין כי מסמכים דומים מאוד ל- JSON. למעשה, הם בעצם כאלה. ישנם כמה הבדלים (למשל, מסמכים תומכים בסוגי נתונים נוספים ומוגבלים בגודל של 1 מגהבייט), אך באופן כללי, ניתן להתייחס למסמכים כאל רשומות JSON קלות משקל.

אוספים

המסמכים חיים באוספים, שהם פשוט מיכלים למסמכים. לדוגמא, אתה יכול להיות users אוספים להכיל המשתמשים השונים שלך, כול אחד מהם מיוצג על ידי מסמך:

  • משתמש

    • alovelace

      first : "Ada"
      last : "Lovelace"
      born : 1815

    • aturing

      first : "Alan"
      last : "Turing"
      born : 1912

ענן Firestore הוא חסר סכמה, כך שיש לך חופש מוחלט באילו שדות אתה מכניס בכל מסמך ואילו סוגי נתונים אתה שומר בשדות אלה. מסמכים באותו אוסף יכולים להכיל שדות שונים או לאחסן סוגים שונים של נתונים בשדות אלה. עם זאת, מומלץ להשתמש באותם שדות וסוגי נתונים על פני מספר מסמכים, כך שתוכל לשאול את המסמכים ביתר קלות.

אוסף מכיל מסמכים ותו לא. הוא לא יכול להכיל ישירות שדות גולמיים עם ערכים, והוא לא יכול להכיל אוספים אחרים. (ראה נתונים היררכיים הסבר כיצד מבנה נתונים מורכבים יותר קלאוד firestore.)

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

אינך צריך "ליצור" או "למחוק" אוספים. לאחר יצירת המסמך הראשון באוסף, האוסף קיים. אם תמחק את כל המסמכים באוסף, הוא כבר לא קיים.

הפניות

כל מסמך בענן Firestore מזוהה באופן ייחודי על ידי מיקומו בתוך מסד הנתונים. הדוגמא הקודמת הראתה מסמך alovelace בתוך אוסף users . כדי להתייחס למיקום זה בקוד שלך, אתה יכול ליצור הפניה אליו.

אינטרנט v8

var alovelaceDocumentRef = db.collection('users').doc('alovelace');

אינטרנט v9

import { doc } from "firebase/firestore";

const alovelaceDocumentRef = doc(db, 'users', 'alovelace');
מָהִיר
let alovelaceDocumentRef = db.collection("users").document("alovelace")
מטרה-ג
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];

ג'אווה

DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");

Kotlin + KTX

val alovelaceDocumentRef = db.collection("users").document("alovelace")
ג'אווה
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
פִּיתוֹן
a_lovelace_ref = db.collection(u'users').document(u'alovelace')

פִּיתוֹן

a_lovelace_ref = db.collection("users").document("alovelace")
C ++
DocumentReference alovelace_document_reference =
    db->Collection("users").Document("alovelace");
Node.js
const alovelaceDocumentRef = db.collection('users').doc('alovelace');
ללכת
alovelaceRef := client.Collection("users").Doc("alovelace")
PHP
$document = $db->collection('samples/php/users')->document('lovelace');
אַחְדוּת
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C #
DocumentReference documentRef = db.Collection("users").Document("alovelace");
אוֹדֶם
document_ref = firestore.col("users").doc("alovelace")

הפניה היא אובייקט קל משקל שמצביע רק על מיקום במסד הנתונים שלך. באפשרותך ליצור הפניה בין אם קיימים שם נתונים ובין אם לא, ויצירת הפניה אינה מבצעת פעולות רשת כלשהן.

ניתן גם ליצור אזכור אוספים:

אינטרנט v8

var usersCollectionRef = db.collection('users');

אינטרנט v9

import { collection } from "firebase/firestore";

const usersCollectionRef = collection(db, 'users');
מָהִיר
let usersCollectionRef = db.collection("users")
מטרה-ג
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

ג'אווה

CollectionReference usersCollectionRef = db.collection("users");

Kotlin + KTX

val usersCollectionRef = db.collection("users")
ג'אווה
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
פִּיתוֹן
users_ref = db.collection(u'users')

פִּיתוֹן

users_ref = db.collection("users")
C ++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
ללכת
usersRef := client.Collection("users")
PHP
$collection = $db->collection('samples/php/users');
אַחְדוּת
CollectionReference collectionRef = db.Collection("users");
C #
CollectionReference collectionRef = db.Collection("users");
אוֹדֶם
collection_ref = firestore.col "users"

לנוחיותכם, ניתן גם ליצור הפניות על ידי ציון הנתיב למסמך או אוסף כמחרוזת, עם רכיבים נתיב מופרדים באמצעות קו נטוי ( / ). לדוגמה, כדי ליצור התייחסות alovelace המסמך:

אינטרנט v8

var alovelaceDocumentRef = db.doc('users/alovelace');

אינטרנט v9

import { doc } from "firebase/firestore"; 

const alovelaceDocumentRef = doc(db, 'users/alovelace');
מָהִיר
let aLovelaceDocumentReference = db.document("users/alovelace")
מטרה-ג
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

ג'אווה

DocumentReference alovelaceDocumentRef = db.document("users/alovelace");

Kotlin + KTX

val alovelaceDocumentRef = db.document("users/alovelace")
ג'אווה
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
פִּיתוֹן
a_lovelace_ref = db.document(u'users/alovelace')

פִּיתוֹן

a_lovelace_ref = db.document("users/alovelace")
C ++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
const alovelaceDocumentRef = db.doc('users/alovelace');
ללכת
alovelaceRef := client.Doc("users/alovelace")
PHP
$document = $db->document('users/lovelace');
אַחְדוּת
DocumentReference documentRef = db.Document("users/alovelace");
C #
DocumentReference documentRef = db.Document("users/alovelace");
אוֹדֶם
document_path_ref = firestore.doc "users/alovelace"

נתונים היררכיים

כדי להבין כיצד מבני נתונים היררכיים פועלים בענן Firestore, שקול דוגמה לאפליקציית צ'אט עם הודעות וחדרי צ'אט.

אתה יכול ליצור אוסף שנקרא rooms לאחסון חדרי צ'אט שונים:

  • חדרים

    • roomA

      name : "my chat room"

    • roomB

      ...

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

אוספי משנה

הדרך הטובה ביותר לאחסן הודעות בתרחיש זה היא באמצעות אוספי משנה. אוסף משנה הוא אוסף המשויך למסמך ספציפי.

אתה יכול ליצור subcollection שנקרא messages לכל מסמך חדר שלך rooms לאוסף:

  • חדרים

    • roomA

      name : "my chat room"

      • הודעות

        • message1

          from : "alex"
          msg : "Hello World!"

        • message2

          ...

    • roomB

      ...

בדוגמה זו תיצור הפניה להודעה באוסף המשנה עם הקוד הבא:

אינטרנט v8

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');

אינטרנט v9

import { doc } from "firebase/firestore"; 

const messageRef = doc(db, "rooms", "roomA", "messages", "message1");
מָהִיר
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
מטרה-ג
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];

ג'אווה

DocumentReference messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1");

Kotlin + KTX

val messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1")
ג'אווה
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
פִּיתוֹן
room_a_ref = db.collection(u'rooms').document(u'roomA')
message_ref = room_a_ref.collection(u'messages').document(u'message1')

פִּיתוֹן

room_a_ref = db.collection("rooms").document("roomA")
message_ref = room_a_ref.collection("messages").document("message1")
C ++
DocumentReference message_reference = db->Collection("rooms")
    .Document("roomA")
    .Collection("messages")
    .Document("message1");
Node.js
const messageRef = db.collection('rooms').doc('roomA')
  .collection('messages').doc('message1');
ללכת
messageRef := client.Collection("rooms").Doc("roomA").
	Collection("messages").Doc("message1")
PHP
$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
אַחְדוּת
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
C #
DocumentReference documentRef = db
    .Collection("Rooms").Document("RoomA")
    .Collection("Messages").Document("Message1");
אוֹדֶם
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

שימו לב לדפוס המתחלף של אוספים ומסמכים. האוספים והמסמכים שלך חייבים תמיד להתאים לדפוס זה. אינך יכול להפנות לאוסף באוסף או למסמך במסמך.

אוספי משנה מאפשרים לך לבנות נתונים בצורה היררכית, ולהקל על הגישה לנתונים. כדי לקבל את כל ההודעות roomA , אתה יכול ליצור הפניה אוסף אל subcollection messages ולקיים אינטראקציה איתו כמו אל כל התייחסות איסוף אחרות.

מסמכים באוספי משנה יכולים להכיל גם אוספי משנה, ומאפשרים לך להמשיך לקנן נתונים. אתה יכול לקנן נתונים בעומק של עד 100 רמות.