نموذج بيانات 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 المجموعة. للإشارة إلى هذا الموقع في التعليمات البرمجية الخاصة بك ، يمكنك إنشاء مرجع له.

Web version 9

import { doc } from "firebase/firestore";

const alovelaceDocumentRef = doc(db, 'users', 'alovelace');

Web version 8

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
سويفت
ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
ج موضوعية
ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];

Java

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

Kotlin+KTX

val alovelaceDocumentRef = db.collection("users").document("alovelace")

Dart

final alovelaceDocumentRef = db.collection("users").doc("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')

Python

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

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

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

Web version 9

import { collection } from "firebase/firestore";

const usersCollectionRef = collection(db, 'users');

Web version 8

var usersCollectionRef = db.collection('users');
سويفت
ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
let usersCollectionRef = db.collection("users")
ج موضوعية
ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

Java

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

Kotlin+KTX

val usersCollectionRef = db.collection("users")

Dart

final usersCollectionRef = db.collection("users");
جافا
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
بايثون
users_ref = db.collection(u'users')

Python

users_ref = db.collection("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 :

Web version 9

import { doc } from "firebase/firestore"; 

const alovelaceDocumentRef = doc(db, 'users/alovelace');

Web version 8

var alovelaceDocumentRef = db.doc('users/alovelace');
سويفت
ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
let aLovelaceDocumentReference = db.document("users/alovelace")
ج موضوعية
ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

Java

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

Kotlin+KTX

val alovelaceDocumentRef = db.document("users/alovelace")

Dart

final aLovelaceDocRef = db.doc("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')

Python

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")
بي أتش بي
$document = $db->document('users/alovelace');
وحدة
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

          ...

    • غرفة ب

      ...

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

Web version 9

import { doc } from "firebase/firestore"; 

const messageRef = doc(db, "rooms", "roomA", "messages", "message1");

Web version 8

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
سويفت
ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
ج موضوعية
ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];

Java

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

Kotlin+KTX

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

Dart

final messageRef = db
    .collection("rooms")
    .doc("roomA")
    .collection("messages")
    .doc("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')

Python

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")
بي أتش بي
$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 مستوى.