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")
هدف-C
توجه: این محصول در دسترس نیست در 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")
PHP
$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")
هدف-C
توجه: این محصول در دسترس نیست در 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")
PHP
$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")
هدف-C
توجه: این محصول در دسترس نیست در 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")
PHP
$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")
هدف-C
توجه: این محصول در دسترس نیست در 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")
PHP
$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 سطح تودرتو کنید.