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

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

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

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

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

وثائق

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

قد يبدو المستند الذي يمثل مستخدم alovelace كما يلي:

  • ألوفليس

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

تسمى الكائنات المعقدة والمتداخلة في المستند بالخرائط. على سبيل المثال، يمكنك تنظيم اسم المستخدم من المثال أعلاه باستخدام الخريطة، مثل هذا:

  • ألوفليس

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

قد تلاحظ أن المستندات تشبه إلى حد كبير JSON. في الواقع، هم في الأساس. توجد بعض الاختلافات (على سبيل المثال، تدعم المستندات أنواع بيانات إضافية ويقتصر حجمها على 1 ميجابايت)، ولكن بشكل عام، يمكنك التعامل مع المستندات كسجلات JSON خفيفة الوزن.

المجموعات

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

    • ألوفليس

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

    • تأصيل

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

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

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

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

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

مراجع

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

Web modular API

import { doc } from "firebase/firestore";

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

Web namespaced API

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"];

Kotlin+KTX

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

Java

DocumentReference 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("users").document("alovelace")

Python

a_lovelace_ref = db.collection("users").document("alovelace")
سي ++
DocumentReference alovelace_document_reference =
    db->Collection("users").Document("alovelace");
Node.js
const alovelaceDocumentRef = db.collection('users').doc('alovelace');
يذهب

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

func createDocReference(client *firestore.Client) {

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

	_ = alovelaceRef
}
بي أتش بي

بي أتش بي

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

$document = $db->collection('samples/php/users')->document('alovelace');
وحدة
DocumentReference documentRef = db.Collection("users").Document("alovelace");
ج #

ج #

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

DocumentReference documentRef = db.Collection("users").Document("alovelace");
روبي
document_ref = firestore.col("users").doc("alovelace")

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

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

Web modular API

import { collection } from "firebase/firestore";

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

Web namespaced API

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

Kotlin+KTX

val usersCollectionRef = db.collection("users")

Java

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

Dart

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

Python

users_ref = db.collection("users")
سي ++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
يذهب

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

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

	_ = usersRef
}
بي أتش بي

بي أتش بي

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

$collection = $db->collection('samples/php/users');
وحدة
CollectionReference collectionRef = db.Collection("users");
ج #

ج #

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

CollectionReference collectionRef = db.Collection("users");
روبي
collection_ref = firestore.col "users"

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

Web modular API

import { doc } from "firebase/firestore"; 

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

Web namespaced API

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"];

Kotlin+KTX

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

Java

DocumentReference 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("users/alovelace")

Python

a_lovelace_ref = db.document("users/alovelace")
سي ++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
const alovelaceDocumentRef = db.doc('users/alovelace');
يذهب

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
}
بي أتش بي

بي أتش بي

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

$document = $db->document('users/alovelace');
وحدة
DocumentReference documentRef = db.Document("users/alovelace");
ج #

ج #

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

DocumentReference documentRef = db.Document("users/alovelace");
روبي
document_path_ref = firestore.doc "users/alovelace"

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

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

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

  • Rooms

    • غرفة أ

      name : "my chat room"

    • غرفة ب

      ...

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

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

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

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

  • Rooms

    • غرفة أ

      name : "my chat room"

      • الرسائل

        • رسالة 1

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

        • رسالة 2

          ...

    • غرفة ب

      ...

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

Web modular API

import { doc } from "firebase/firestore"; 

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

Web namespaced API

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"];

Kotlin+KTX

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");
جافا
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
بايثون
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")
سي ++
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');
يذهب

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

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

	_ = messageRef
}
بي أتش بي

بي أتش بي

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

$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
وحدة
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
ج #

ج #

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

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 مستوى.