نموذج بيانات 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 نظامًا تخطيطيًا ، لذلك لديك الحرية الكاملة في تحديد الحقول التي تضعها في كل مستند وأنواع البيانات التي تخزنها في تلك الحقول. يمكن أن تحتوي المستندات الموجودة ضمن نفس المجموعة على حقول مختلفة أو تخزين أنواع مختلفة من البيانات في تلك الحقول. ومع ذلك ، من المستحسن استخدام نفس الحقول وأنواع البيانات عبر مستندات متعددة ، بحيث يمكنك الاستعلام عن المستندات بسهولة أكبر.

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

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

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

مراجع

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

إصدار الويب 9

import { doc } from "firebase/firestore";

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

إصدار الويب 8

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
سويفت
ملاحظة: هذا المنتج غير متوفر على أهداف كليب watchOS والتطبيقات.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
ج موضوعية
ملاحظة: هذا المنتج غير متوفر على أهداف كليب watchOS والتطبيقات.
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")
بي أتش بي
$document = $db->collection('samples/php/users')->document('lovelace');
وحدة
DocumentReference documentRef = db.Collection("users").Document("alovelace");
سي #
DocumentReference documentRef = db.Collection("users").Document("alovelace");
روبي
document_ref = firestore.col("users").doc("alovelace")

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

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

إصدار الويب 9

import { collection } from "firebase/firestore";

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

إصدار الويب 8

var usersCollectionRef = db.collection('users');
سويفت
ملاحظة: هذا المنتج غير متوفر على أهداف كليب watchOS والتطبيقات.
let usersCollectionRef = db.collection("users")
ج موضوعية
ملاحظة: هذا المنتج غير متوفر على أهداف كليب watchOS والتطبيقات.
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")
بي أتش بي
$collection = $db->collection('samples/php/users');
وحدة
CollectionReference collectionRef = db.Collection("users");
سي #
CollectionReference collectionRef = db.Collection("users");
روبي
collection_ref = firestore.col "users"

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

إصدار الويب 9

import { doc } from "firebase/firestore"; 

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

إصدار الويب 8

var alovelaceDocumentRef = db.doc('users/alovelace');
سويفت
ملاحظة: هذا المنتج غير متوفر على أهداف كليب watchOS والتطبيقات.
let aLovelaceDocumentReference = db.document("users/alovelace")
ج موضوعية
ملاحظة: هذا المنتج غير متوفر على أهداف كليب watchOS والتطبيقات.
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")
بي أتش بي
$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 لتخزين مختلف غرف الدردشة:

  • الغرف

    • ROOMA

      name : "my chat room"

    • roomB

      ...

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

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

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

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

  • الغرف

    • ROOMA

      name : "my chat room"

      • الرسائل

        • message1

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

        • message2

          ...

    • roomB

      ...

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

إصدار الويب 9

import { doc } from "firebase/firestore"; 

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

إصدار الويب 8

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
سويفت
ملاحظة: هذا المنتج غير متوفر على أهداف كليب watchOS والتطبيقات.
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
ج موضوعية
ملاحظة: هذا المنتج غير متوفر على أهداف كليب watchOS والتطبيقات.
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")
بي أتش بي
$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 مستوى.