نموذج بيانات 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

    • aturing

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

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

تحتوي المجموعة على مستندات فقط. لا يمكن أن يحتوي مباشرةً على حقول أولية تتضمّن قيمًا، ولا يمكن أن يحتوي على مجموعات أخرى. (راجِع البيانات الهرمية للحصول على شرح حول كيفية تنظيم البيانات الأكثر تعقيدًا في Cloud Firestore.)

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

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

المراجع

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

Web

import { doc } from "firebase/firestore";

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

Web

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Swift
ملاحظة: لا يتوفّر هذا المنتج على watchOS واستهدافات "مقاطع التطبيقات".
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective-C
ملاحظة: لا يتوفّر هذا المنتج على watchOS واستهدافات "مقاطع التطبيقات".
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];

Kotlin

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

Java

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

Dart

final alovelaceDocumentRef = db.collection("users").doc("alovelace");
Java
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
Python
a_lovelace_ref = db.collection("users").document("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');
Go

import (
	"cloud.google.com/go/firestore"
)

func createDocReference(client *firestore.Client) {

	alovelaceRef := client.Collection("users").Doc("alovelace")

	_ = alovelaceRef
}
PHP

PHP

لمزيد من المعلومات حول تثبيت وإنشاء عميل Cloud Firestore، يُرجى الرجوع إلى مكتبات عميل Cloud Firestore.

$document = $db->collection('samples/php/users')->document('alovelace');
Unity
DocumentReference documentRef = db.Collection("users").Document("alovelace");
#C

#C

لمزيد من المعلومات حول تثبيت وإنشاء عميل Cloud Firestore، يُرجى الرجوع إلى مكتبات عميل Cloud Firestore.

DocumentReference documentRef = db.Collection("users").Document("alovelace");
لغة Ruby
document_ref = firestore.col("users").doc("alovelace")

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

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

Web

import { collection } from "firebase/firestore";

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

Web

var usersCollectionRef = db.collection('users');
Swift
ملاحظة: لا يتوفّر هذا المنتج على watchOS واستهدافات "مقاطع التطبيقات".
let usersCollectionRef = db.collection("users")
Objective-C
ملاحظة: لا يتوفّر هذا المنتج على watchOS واستهدافات "مقاطع التطبيقات".
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

Kotlin

val usersCollectionRef = db.collection("users")

Java

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

Dart

final usersCollectionRef = db.collection("users");
Java
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
Python
users_ref = db.collection("users")

Python

users_ref = db.collection("users")
C++‎
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
Go

import (
	"cloud.google.com/go/firestore"
)

func createCollectionReference(client *firestore.Client) {
	usersRef := client.Collection("users")

	_ = usersRef
}
PHP

PHP

لمزيد من المعلومات حول تثبيت وإنشاء عميل Cloud Firestore، يُرجى الرجوع إلى مكتبات عميل Cloud Firestore.

$collection = $db->collection('samples/php/users');
Unity
CollectionReference collectionRef = db.Collection("users");
#C

#C

لمزيد من المعلومات حول تثبيت وإنشاء عميل Cloud Firestore، يُرجى الرجوع إلى مكتبات عميل Cloud Firestore.

CollectionReference collectionRef = db.Collection("users");
لغة Ruby
collection_ref = firestore.col "users"

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

Web

import { doc } from "firebase/firestore"; 

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

Web

var alovelaceDocumentRef = db.doc('users/alovelace');
Swift
ملاحظة: لا يتوفّر هذا المنتج على watchOS واستهدافات "مقاطع التطبيقات".
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
ملاحظة: لا يتوفّر هذا المنتج على watchOS واستهدافات "مقاطع التطبيقات".
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

Kotlin

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

Java

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

Dart

final aLovelaceDocRef = db.doc("users/alovelace");
Java
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
Python
a_lovelace_ref = db.document("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');
Go

import (
	"cloud.google.com/go/firestore"
)

func createDocReferenceFromString(client *firestore.Client) {
	// Reference to a document with id "alovelace" in the collection "users"
	alovelaceRef := client.Doc("users/alovelace")

	_ = alovelaceRef
}
PHP

PHP

لمزيد من المعلومات حول تثبيت وإنشاء عميل Cloud Firestore، يُرجى الرجوع إلى مكتبات عميل Cloud Firestore.

$document = $db->document('users/alovelace');
Unity
DocumentReference documentRef = db.Document("users/alovelace");
#C

#C

لمزيد من المعلومات حول تثبيت وإنشاء عميل Cloud Firestore، يُرجى الرجوع إلى مكتبات عميل Cloud Firestore.

DocumentReference documentRef = db.Document("users/alovelace");
لغة Ruby
document_path_ref = firestore.doc "users/alovelace"

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

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

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

  • غرفة

    • roomA

      name : "my chat room"

    • roomB

      ...

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

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

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

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

  • غرفة

    • roomA

      name : "my chat room"

      • رسائل

        • message1

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

        • message2

          ...

    • roomB

      ...

في هذا المثال، يمكنك إنشاء مرجع إلى رسالة في المجموعة الفرعية باستخدام الرمز التالي:

Web

import { doc } from "firebase/firestore"; 

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

Web

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
Swift
ملاحظة: لا يتوفّر هذا المنتج على watchOS واستهدافات "مقاطع التطبيقات".
let messageRef = db
  .collection("rooms").document("roomA")
  .collection("messages").document("message1")
Objective-C
ملاحظة: لا يتوفّر هذا المنتج على watchOS واستهدافات "مقاطع التطبيقات".
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];

Kotlin

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

Java

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

Dart

final messageRef = db
    .collection("rooms")
    .doc("roomA")
    .collection("messages")
    .doc("message1");
Java
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
Python
room_a_ref = db.collection("rooms").document("roomA")
message_ref = room_a_ref.collection("messages").document("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');
Go

import (
	"cloud.google.com/go/firestore"
)

func createSubcollectionReference(client *firestore.Client) {
	messageRef := client.Collection("rooms").Doc("roomA").
		Collection("messages").Doc("message1")

	_ = messageRef
}
PHP

PHP

لمزيد من المعلومات حول تثبيت وإنشاء عميل Cloud Firestore، يُرجى الرجوع إلى مكتبات عميل Cloud Firestore.

$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
Unity
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
#C

#C

لمزيد من المعلومات حول تثبيت وإنشاء عميل Cloud Firestore، يُرجى الرجوع إلى مكتبات عميل Cloud Firestore.

DocumentReference documentRef = db
    .Collection("Rooms").Document("RoomA")
    .Collection("Messages").Document("Message1");
لغة Ruby
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

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

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

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