Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

نموذج بيانات Cloud Firestore

Cloud Firestore هي قاعدة بيانات NoSQL موجهة للمستندات. على عكس قاعدة بيانات SQL ، لا توجد جداول أو صفوف. بدلاً من ذلك ، تقوم بتخزين البيانات في المستندات ، والتي يتم تنظيمها في مجموعات .

يحتوي كل مستند على مجموعة من أزواج المفتاح والقيمة. تم تحسين Cloud Firestore لتخزين مجموعات كبيرة من المستندات الصغيرة.

يجب تخزين جميع المستندات في مجموعات. يمكن أن تحتوي المستندات على مجموعات فرعية وكائنات متداخلة ، وكلاهما يمكن أن يشتمل على حقول أولية مثل السلاسل أو الكائنات المعقدة مثل القوائم.

يتم إنشاء المجموعات والمستندات بشكل ضمني في Cloud Firestore. ببساطة قم بتعيين البيانات إلى مستند داخل المجموعة. في حالة عدم وجود المجموعة أو المستند ، يقوم Cloud Firestore بإنشائه.

وثائق

في Cloud 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

    • أترينج

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

يعد Cloud Firestore نظامًا تخطيطيًا ، لذلك لديك الحرية الكاملة في تحديد الحقول التي تضعها في كل مستند وأنواع البيانات التي تخزنها في تلك الحقول. يمكن أن تحتوي المستندات الموجودة في نفس المجموعة على حقول مختلفة أو تخزين أنواع مختلفة من البيانات في تلك الحقول. ومع ذلك ، من المستحسن استخدام نفس الحقول وأنواع البيانات عبر مستندات متعددة ، بحيث يمكنك الاستعلام عن المستندات بسهولة أكبر.

مجموعة تحتوي على وثائق ولا شيء غير ذلك. لا يمكن أن تحتوي مباشرة على حقول أولية بقيم ، ولا يمكن أن تحتوي على مجموعات أخرى. (راجع البيانات الهرمية للحصول على شرح لكيفية هيكلة بيانات أكثر تعقيدًا في Cloud Firestore.)

أسماء المستندات داخل المجموعة فريدة من نوعها. يمكنك تقديم المفاتيح الخاصة بك ، مثل معرفات المستخدم ، أو يمكنك السماح لـ Cloud Firestore بإنشاء معرفات عشوائية لك تلقائيًا.

لا تحتاج إلى "إنشاء" أو "حذف" المجموعات. بعد إنشاء أول مستند في مجموعة ، توجد المجموعة. إذا قمت بحذف جميع المستندات في مجموعة ، فإنها لم تعد موجودة.

مراجع

يتم تحديد كل مستند في Cloud Firestore بشكل فريد من خلال موقعه داخل قاعدة البيانات. أظهر المثال السابق مستندًا alovelace داخل مجموعة users المجموعة. للإشارة إلى هذا الموقع في التعليمات البرمجية الخاصة بك ، يمكنك إنشاء مرجع له.

الويب v8

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

الويب الإصدار 9

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')
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")
بي أتش بي
$document = $db->collection('samples/php/users')->document('lovelace');
وحدة
DocumentReference documentRef = db.Collection("users").Document("alovelace");
سي #
DocumentReference documentRef = db.Collection("users").Document("alovelace");
روبي
0648Beaf50

المرجع هو كائن خفيف يشير فقط إلى موقع في قاعدة البيانات الخاصة بك. يمكنك إنشاء مرجع سواء كانت البيانات موجودة أم لا ، ولا يؤدي إنشاء مرجع إلى تنفيذ أي عمليات على الشبكة.

يمكنك أيضًا إنشاء مراجع للمجموعات :

الويب v8

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

الويب الإصدار 9

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')
C ++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
اذهب
usersRef := client.Collection("users")
بي أتش بي
$collection = $db->collection('samples/php/users');
وحدة
CollectionReference collectionRef = db.Collection("users");
سي #
CollectionReference collectionRef = db.Collection("users");
روبي
collection_ref = firestore.col "users"

لتسهيل الأمر ، يمكنك أيضًا إنشاء مراجع عن طريق تحديد المسار إلى مستند أو مجموعة كسلسلة ، مع فصل مكونات المسار بشرطة مائلة للأمام ( / ). على سبيل المثال ، لإنشاء مرجع إلى مستند alovelace :

الويب v8

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

الويب الإصدار 9

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')
C ++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
const alovelaceDocumentRef = db.doc('users/alovelace');
اذهب
alovelaceRef := client.Doc("users/alovelace")
بي أتش بي
$document = $db->document('users/lovelace');
وحدة
DocumentReference documentRef = db.Document("users/alovelace");
سي #
DocumentReference documentRef = db.Document("users/alovelace");
روبي
document_path_ref = firestore.doc "users/alovelace"

البيانات الهرمية

لفهم كيفية عمل هياكل البيانات الهرمية في Cloud Firestore ، ضع في اعتبارك مثالاً لتطبيق دردشة مع الرسائل وغرف الدردشة.

يمكنك إنشاء مجموعة تسمى rooms لتخزين غرف الدردشة المختلفة:

  • الغرف

    • name : "my chat room"

    • ب

      ...

الآن بعد أن أصبح لديك غرف دردشة ، قرر كيفية تخزين رسائلك. قد لا ترغب في تخزينها في وثيقة غرفة المحادثة. يجب أن تكون المستندات في Cloud Firestore خفيفة الوزن ، ويمكن أن تحتوي غرفة الدردشة على عدد كبير من الرسائل. ومع ذلك ، يمكنك إنشاء مجموعات إضافية داخل وثيقة غرفة المحادثة الخاصة بك ، كمجموعات فرعية.

المجموعات الفرعية

أفضل طريقة لتخزين الرسائل في هذا السيناريو هي استخدام المجموعات الفرعية. المجموعة الفرعية هي مجموعة مرتبطة بمستند معين.

يمكنك إنشاء مجموعة فرعية تسمى messages لكل مستند غرفة في مجموعة rooms الخاصة بك:

  • الغرف

    • name : "my chat room"

      • الرسائل

        • 1

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

        • 2

          ...

    • ب

      ...

في هذا المثال ، ستنشئ مرجعًا لرسالة في المجموعة الفرعية بالرمز التالي:

الويب v8

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

الويب الإصدار 9

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')
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")
بي أتش بي
$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
وحدة
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
سي #
DocumentReference documentRef = db
    .Collection("Rooms").Document("RoomA")
    .Collection("Messages").Document("Message1");
روبي
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

لاحظ النمط المتناوب للمجموعات والمستندات. يجب أن تتبع مجموعاتك ووثائقك هذا النمط دائمًا. لا يمكنك الرجوع إلى مجموعة في مجموعة أو مستند في مستند.

تتيح لك المجموعات الفرعية هيكلة البيانات بشكل هرمي ، مما يسهل الوصول إلى البيانات. للحصول على جميع الرسائل في roomA ، يمكنك إنشاء مرجع مجموعة messages المجموعة الفرعية والتفاعل معها كما تفعل مع أي مرجع آخر للمجموعة.

يمكن أن تحتوي المستندات الموجودة في مجموعات فرعية على مجموعات فرعية أيضًا ، مما يتيح لك مزيدًا من البيانات المتداخلة. يمكنك تداخل البيانات حتى عمق 100 مستوى.