Firebase Firestore — چیست، اسناد و مجموعه‌های NoSQL

نویسنده: IT Sectr منتشر شده: 2026-04-28 زمان مطالعه: 10 دقیقه

Firebase Firestore یک پایگاه داده اسنادی NoSQL منعطف از Google با همگام‌سازی خودکار در زمان واقعی برای برنامه‌های موبایل و وب است. داده‌ها به صورت مجموعه‌ها و اسناد ذخیره می‌شوند که هر کدام شامل مجموعه‌ای از فیلدهای با ساختار دلخواه هستند. طبق داده‌های Google, 2026، Firestore از تکرار چندمنطقه‌ای با بازیابی خودکار هنگام خرابی پشتیبانی می‌کند. SDK تغییرات را از طریق اتصال WebSocket با تأخیر کمتر از 100 میلی‌ثانیه به سرور ارسال می‌کند.

نکات اصلی

  • Firestore — پایگاه داده اسنادی NoSQL با پشتیبانی از پرس‌وجوها، ایندکس‌ها و تراکنش‌ها.
  • همگام‌سازی داده‌ها در زمان واقعی از طریق WebSocket کار می‌کند — تغییرات روی سرور فوراً به همه کلاینت‌ها تحویل داده می‌شود.
  • Firestore از حالت آفلاین پشتیبانی می‌کند — داده‌ها به صورت محلی ذخیره می‌شوند و پس از بازیابی اتصال همگام‌سازی می‌شوند.
  • مقیاس‌پذیری خودکار تا میلیون‌ها اتصال همزمان بدون تنظیم شرط‌بندی یا تکرار.
  • قوانین امنیتی Security Rules امکان مدیریت دسترسی به داده‌ها را بدون کد سرور فراهم می‌کنند.

Firebase Firestore چیست

Firebase Firestore — یک پایگاه داده ابری NoSQL است که توسط Google در سال 2019 به عنوان جانشین Realtime Database منتشر شد. Firestore بر روی زیرساخت Google Cloud Spanner و Google Cloud Datastore ساخته شده است و سازگاری دقیق داده‌ها را در یک تراکنش و تکرار خودکار چندمنطقه‌ای فراهم می‌کند. SDK از Android، iOS، Web (JavaScript)، Flutter، Kotlin Multiplatform و Unity پشتیبانی می‌کند.

تکامل از Realtime Database

Firestore در Google I/O 2017 با نام «Cloud Firestore» معرفی شد — راه‌حلی که محدودیت‌های کلیدی Realtime Database را برطرف می‌کند: عدم پشتیبانی از پرس‌وجوهای پیچیده، عدم امکان مقیاس‌پذیری داده‌ها در چند گره و سازگاری ضعیف. طبق داده‌های Google (2026)، Firestore روزانه بیش از 1 تریلیون پرس‌وجو پردازش می‌کند و پایگاه داده پیش‌فرض برای 80% پروژه‌های جدید Firebase است. با این حال، Realtime Database به دلیل ساختار ساده JSON برای سناریوهای با تأخیر بسیار کم (بازی‌ها، ویرایش مشترک) همچنان مرتبط است.

محدودیت‌های رایگان Firestore

Firestore با مدل pay-as-you-go با محدودیت رایگان سخاوتمندانه در تعرفه Spark ارائه می‌شود: 1 گیگابایت ذخیره‌سازی، 10 گیگابایت ترافیک شبکه در ماه، 50 هزار عملیات خواندن، 20 هزار عملیات نوشتن و 20 هزار عملیات حذف در روز. در تعرفه Blaze همه موارد مشابه رایگان است و مازاد تعرفه‌گذاری می‌شود: 0.06 دلار به ازای 100 هزار عملیات خواندن، 0.18 دلار به ازای 100 هزار عملیات نوشتن. طبق داده‌های Google (2026)، 90% پروژه‌ها از محدودیت رایگان فراتر نمی‌روند.

مدل داده: مجموعه‌ها، اسناد و فیلدها

مدل داده Firestore به صورت سلسله‌مراتبی سازماندهی شده است: ریشه شامل مجموعه‌ها، هر مجموعه شامل اسناد، هر سند شامل فیلدها (انواع اولیه، آرایه‌ها، Map) و مجموعه‌های تودرتو (subcollections) است. عمق تودرتویی مجموعه‌ها محدود نیست، اما یک سند نمی‌تواند مستقیماً سند دیگری را شامل شود — فقط از طریق ارجاع (Reference type).

مجموعه‌ها و اسناد

مجموعه — ظرفی برای اسناد با شناسه‌های خودکار تولید شده یا تعیین شده است. هر سند یک شیء شبیه JSON با اندازه حداکثر 1 MiB است. فیلدهای سند می‌توانند رشته‌ها، اعداد، مقادیر بولی، آرایه‌ها، Map، مهرهای زمانی (Timestamp)، نقاط جغرافیایی (GeoPoint) و ارجاع به اسناد دیگر (Reference) باشند. اندازه سند با احتساب نام همه فیلدها به 1 MiB محدود شده است.

نوع فیلد Firestoreمثالایندکس می‌شود
String«user@example.com»بله
Number42, 3.14بله
Booleantrue, falseبله
Array[1, 2, 3]فقط contains
Map{«تودرتو»: «مقدار»}بله (بر اساس کلیدها)
Timestamp2026-07-03T12:00:00Zبله
Referenceusers/user123بله

نوشتن دسته‌ای و تراکنش‌ها

Firestore از تراکنش‌های اتمی در سطح پایگاه داده پشتیبانی می‌کند. تراکنش می‌تواند چندین سند را بخواند و بنویسد — Commit به صورت اتمی همه تغییرات را اعمال می‌کند یا هیچکدام. حداکثر 500 عملیات در یک تراکنش، مهلت 60 ثانیه. نوشتن دسته‌ای (batch write) یک عملیات اتمی غیرتراکنشی روی نوشتن بدون مرحله خواندن است. تراکنش‌ها برای عملیات مالی، رزرو مکان و موجودی انبار حیاتی هستند.

مقایسه Firestore و Realtime Database

انتخاب بین Firestore و Realtime Database به نیازهای پروژه بستگی دارد. هر دو پایگاه داده بخشی از اکوسیستم Firebase هستند، همگام‌سازی در زمان واقعی ارائه می‌دهند و در همه پلتفرم‌ها در دسترس هستند، اما در مدل داده، مقیاس‌پذیری و قیمت‌گذاری تفاوت اساسی دارند.

تفاوت‌های کلیدی

Realtime Database داده‌ها را در یک درخت JSON واحد ذخیره می‌کند که برای ساختارهای ساده مناسب است اما مقیاس‌پذیری را در تودرتویی عمیق‌تر از 3 سطح دشوار می‌کند. Firestore از مدل مجموعه-سند با شرط‌بندی خودکار استفاده می‌کند که امکان مقیاس‌پذیری تا میلیون‌ها سند بدون کاهش عملکرد را فراهم می‌کند. طبق داده‌های Google (2026)، Firestore تا 10 هزار اتصال همزمان به یک مجموعه را بدون کاهش سرعت پشتیبانی می‌کند، Realtime Database — تا 200 هزار اتصال به یک نمونه.

قیمت‌گذاری

Realtime Database بر اساس حجم داده‌های منتقل شده (بایت‌های دانلودی) و تعداد اتصالات همزمان تعرفه‌گذاری می‌شود. Firestore — بر اساس تعداد عملیات (خواندن، نوشتن، حذف). برای برنامه‌هایی با به‌روزرسانی‌های کوچک مکرر (چت، اعلان‌ها) Firestore معمولاً مقرون‌به‌صرفه‌تر است — هر عملیات نوشتن بدون توجه به اندازه داده قیمت ثابتی دارد. برای برنامه‌هایی با خواندن نادر حجم زیاد داده، Realtime Database ممکن است ارزان‌تر باشد.

توصیه Google (2026): از Firestore به عنوان پایگاه داده پیش‌فرض برای پروژه‌های جدید استفاده کنید و از Realtime Database برای بازی‌ها و برنامه‌هایی که تأخیر حداقلی (کمتر از 50 میلی‌ثانیه) حیاتی است و ساختار داده مسطح است. هر دو پایگاه داده می‌توانند همزمان در یک پروژه کار کنند.

پرس‌وجوها، ایندکس‌ها و صفحه‌بندی در Firestore

پرس‌وجوهای Firestore بر روی مجموعه‌ها یا گروه‌های مجموعه با فیلتر، مرتب‌سازی و محدودیت اجرا می‌شوند. برخلاف Realtime Database که هر پرس‌وجو پیمایش کل درخت JSON با فیلتر در سمت کلاینت است، Firestore همه پرس‌وجوها را روی سرور با استفاده از ایندکس‌های از پیش ساخته شده اجرا می‌کند. این تضمین می‌کند که پیچیدگی پرس‌وجو فقط به اندازه نتیجه بستگی دارد، نه به اندازه مجموعه.

انواع پرس‌وجوها

Firestore پشتیبانی می‌کند فیلتر بر اساس یک یا چند فیلد (equality, range, in, array-contains, array-contains-any)، مرتب‌سازی صعودی و نزولی، محدودیت و نشانگرها برای صفحه‌بندی. محدودیت‌ها: پرس‌وجوهای ترکیبی با فیلتر بر اساس فیلدهای مختلف (where price > 10 AND where category == «books») نیاز به ایندکس ترکیبی دارند. پرس‌وجوهای OR ممنوع هستند (به جای آن از in و array-contains-any استفاده می‌شود) و پرس‌وجوهای با نابرابری در فیلدهای مختلف ممنوع هستند.

kotlin
data class Product(
    val name: String = "",
    val category: String = "",
    val price: Double = 0.0,
    val inStock: Boolean = false
)

suspend fun FirestoreRepository.queryProducts(): List<Product> {
    return firestore
        .collection("products")
        .whereEqualTo("category", "electronics")
        .whereGreaterThanOrEqualTo("price", 100.0)
        .whereLessThan("price", 500.0)
        .orderBy("price")
        .limit(20)
        .get()
        .await()
        .toObjects(Product::class.java)
}

ایندکس‌های خودکار و ترکیبی

Firestore به طور خودکار برای فیلدهای تکی ایندکس ایجاد می‌کند — پرس‌وجوهای بر اساس یک فیلد بدون هیچ تنظیماتی کار می‌کنند. برای پرس‌وجوهای با دو یا چند فیلد (فیلتر + مرتب‌سازی) ایندکس‌های ترکیبی ایجاد می‌شوند. هنگام اولین ارسال پرس‌وجو، Firestore خطایی با پیوند به کنسول برمی‌گرداند که در آن می‌توان ایندکس را با یک کلیک ایجاد کرد. حداکثر 200 ایندکس ترکیبی برای هر پایگاه داده. ایندکس‌ها را می‌توان از طریق firebase CLI صادر و وارد کرد.

ادغام Firestore در Android

اتصال Firestore به برنامه Android به صورت استاندارد از طریق Firebase BOM انجام می‌شود. پس از افزودن وابستگی firebase-firestore-ktx، شیء FirebaseFirestore از طریق getInstance() در دسترس است — بدون کلید یا توکن اضافی. Firestore از همان پروژه Firebase سایر سرویس‌ها استفاده می‌کند.

groovy
dependencies {
    implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
    implementation("com.google.firebase:firebase-firestore-ktx")
}

// راه‌اندازی
val db = FirebaseFirestore.getInstance()

خواندن و نوشتن داده‌ها

Firestore دو حالت خواندن ارائه می‌دهد: یک‌باره (get) و در زمان واقعی (addSnapshotListener). خواندن یک‌باره سند را یک بار دریافت می‌کند — برای تنظیمات و پیکربندی مفید است. شنونده روی تغییرات مشترک می‌شود — هر به‌روزرسانی سند به طور خودکار داده‌های به‌روز شده را به همه کلاینت‌های متصل در زمان واقعی تحویل می‌دهد. set() یک سند ایجاد یا بازنویسی می‌کند، update() فقط فیلدهای مشخص شده را بدون بازنویسی کل سند تغییر می‌دهد.

طبق داده‌های Google (2026)، برنامه‌های با اندازه متوسط (100 هزار DAU) با Firestore در زمان واقعی حدود 5-10 گیگابایت ترافیک خروجی در ماه مصرف می‌کنند. استفاده از حافظه نهان آفلاین (Persistence Cache) حجم بارگیری‌های تکراری را 60-70% کاهش می‌دهد، زیرا SDK فقط اسناد تغییر یافته را هنگام بازیابی اتصال بارگیری می‌کند.

حالت آفلاین

Persistence Cache — مکانیزم داخلی Firestore برای کار بدون اینترنت است. SDK به طور خودکار همه اسناد خوانده شده را روی دستگاه ذخیره می‌کند (تا 500 MiB در Android). هنگام قطع اتصال، خواندن از حافظه نهان ادامه می‌یابد، نوشتن در صف قرار می‌گیرد. هنگام بازیابی اتصال، همه عملیات به تعویق افتاده به سرور ارسال می‌شوند و حافظه نهان با سرور همگام‌سازی می‌شود. برای کنترل تعارضات از snapshot-metadata.hasPendingWrites و setOptions(ServerTimestampBehavior) استفاده می‌شود.

قوانین امنیتی و اعتبارسنجی داده‌ها

Security Rules — یک زبان اعلامی برای محدودسازی دسترسی به Firestore است که روی سرور Google قبل از هر عملیات خواندن یا نوشتن اجرا می‌شود. Rules نیازی به کد سرور ندارند — در کنسول Firebase یا از طریق firebase CLI نوشته می‌شوند و از طریق Git نسخه‌بندی می‌شوند. هر عملیات از نظر مطابقت با قوانین بررسی می‌شود و در صورت نقض، خطای PERMISSION_DENIED برگردانده می‌شود.

ساختار قوانین

قوانین Firestore Security Rules از بلوک‌های match و عبارات allow تشکیل شده‌اند. match مسیر مجموعه یا سند را مشخص می‌کند، allow عملیات مجاز (read, write, create, update, delete) و شرط — عبارتی شبیه JavaScript که مقدار بولی برمی‌گرداند — را تعیین می‌کند. قوانین می‌توانند احراز هویت (request.auth)، داده‌های درخواست (request.resource.data)، داده‌های موجود (resource.data)، زمان (request.time) و مسیر (request.path) را بررسی کنند.

javascript
rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read: if request.auth != null;
      allow write: if request.auth.uid == userId;
    }

    match /products/{productId} {
      allow read: if true;
      allow create: if request.auth.token.role == "admin";
      allow update: if resource.data.authorId == request.auth.uid;
    }
  }
}

اعتبارسنجی داده‌ها

Security Rules از اعتبارسنجی انواع و مقادیر در سمت سرور پشتیبانی می‌کند. می‌توان نوشتن را در صورتی که قیمت منفی یا نام خالی باشد، ممنوع کرد. همه بررسی‌ها روی سرور Google قبل از نوشتن انجام می‌شوند — این سازگاری داده‌ها را بدون توجه به کلاینت (Android, iOS, Web, Admin SDK) تضمین می‌کند. Rules از Admin SDK مخرب محافظت نمی‌کند — طبق تعریف از قوانین عبور می‌کند. برای حفاظت کامل از Transaction Functions و Firebase Extensions استفاده کنید.

سوالات متداول

تفاوت بین Firestore و Realtime Database چیست؟

Firestore از مدل اسنادی با ایندکس‌ها و پرس‌وجوهای پیچیده استفاده می‌کند. Realtime Database داده‌ها را در درخت JSON ذخیره می‌کند و تأخیر کمتری دارد. Firestore برای پروژه‌های جدید توصیه می‌شود.

Firestore چگونه مقیاس‌پذیر می‌شود؟

Firestore به طور خودکار داده‌ها را بر اساس مجموعه‌ها شرط‌بندی می‌کند — نیازی به تنظیم تکرار یا شرط‌بندی نیست. پایگاه داده میلیون‌ها سند در یک مجموعه و هزاران اتصال همزمان را بدون کاهش عملکرد تحمل می‌کند.

آیا می‌توان داده‌ها را از Realtime Database به Firestore منتقل کرد؟

بله، از Firebase Console استفاده کنید — تابع «Export to Firestore» ساختار JSON Realtime Database را با چند کلیک به مجموعه‌ها و اسناد Firestore تبدیل می‌کند. گره‌های تودرتو به مجموعه‌های تودرتو تبدیل می‌شوند.

Firestore چگونه تعارضات را در نوشتن آفلاین مدیریت می‌کند؟

Last write wins — به طور پیش‌فرض Firestore از سیاست «آخرین نوشتن برنده می‌شود» برای حل تعارضات در نوشتن همزمان استفاده می‌کند. برای پردازش سفارشی از تراکنش‌ها با خواندن مجدد استفاده کنید.

Firestore چقدر فضای ذخیره‌سازی رایگان می‌دهد؟

محدودیت رایگان تعرفه Spark: 1 گیگابایت ذخیره‌سازی، 50 هزار عملیات خواندن و 20 هزار عملیات نوشتن در روز. این برای MVP و برنامه‌های با بار کم کافی است.

خلاصه

  • Firebase Firestore — پایگاه داده اسنادی NoSQL Google با همگام‌سازی در زمان واقعی و مقیاس‌پذیری خودکار.
  • مدل داده: مجموعه‌ها → اسناد → فیلدها (String, Number, Boolean, Array, Map, Timestamp, Reference, GeoPoint).
  • پشتیبانی از پرس‌وجوهای ترکیبی با فیلتر، مرتب‌سازی، صفحه‌بندی و ایندکس‌های ترکیبی برای شرایط پیچیده.
  • حالت آفلاین تا 500 MiB داده را روی دستگاه ذخیره می‌کند با همگام‌سازی خودکار هنگام بازیابی اتصال.
  • Security Rules — زبان سمت سرور برای حقوق دسترسی با اعتبارسنجی انواع و مقادیر بدون نوشتن کد بک‌اند.
  • تکرار چندمنطقه‌ای با بازیابی خودکار هنگام خرابی — داده‌ها حتی در صورت از کار افتادن مرکز داده در دسترس هستند.
  • به عنوان پایگاه داده پیش‌فرض برای پروژه‌های جدید توصیه می‌شود، Realtime Database — برای بازی‌ها و سناریوهای با تأخیر بسیار کم.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید