Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Firebase Firestore, Flutter ile kullanıcıların bulut tabanlı bir veritabanında verilerini depolamalarına, güncellemelerine, sorgulamalarına ve gerçek zamanlı olarak senkronize etmelerine olanak tanır. Firestore, özellikle mobil uygulamalar için optimize edilmiş bir NoSQL veritabanıdır ve belgeler (document) ve koleksiyonlar (collection) şeklinde organize edilmiştir.
Firestore’u kullanmaya başlamadan önce Flutter projenizde Firebase ile bağlantı kurmanız gerekir:
flutter pub add firebase_core
flutter pub add cloud_firestore
main.dart
dosyasına Firebase başlatma kodunu ekleyin: import 'package:firebase_core/firebase_core.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
Firestore, verileri koleksiyonlar ve belgeler halinde depolar:
Örneğin, users
koleksiyonu altında userId
adında belgeler oluşturabilirsiniz.
Bir koleksiyona veri eklemek için add()
veya set()
metodunu kullanabilirsiniz.
add()
: Firestore otomatik olarak bir belge ID’si oluşturur.set()
: Belirli bir ID ile belge oluşturmanızı sağlar.import 'package:cloud_firestore/cloud_firestore.dart';
// Veri eklemek için bir örnek
Future<void> addUser() {
// `users` koleksiyonuna veri ekliyoruz
return FirebaseFirestore.instance.collection('users').add({
'name': 'Eray',
'age': 25,
'isVerified': true
});
}
// Belirli bir ID ile veri eklemek
Future<void> setUser(String userId) {
return FirebaseFirestore.instance
.collection('users')
.doc(userId)
.set({
'name': 'Eray',
'age': 25,
'isVerified': true
});
}
Firestore’dan veri okuma, gerçek zamanlı ve tek seferlik okuma olarak iki şekilde yapılabilir.
Tek seferlik veri okumak için get()
metodunu kullanabilirsiniz:
Future<void> getUser(String userId) async {
DocumentSnapshot document = await FirebaseFirestore.instance
.collection('users')
.doc(userId)
.get();
if (document.exists) {
print("Kullanıcı Adı: ${document['name']}");
}
}
Gerçek zamanlı güncellemeleri izlemek için snapshots()
metodunu kullanabilirsiniz:
FirebaseFirestore.instance.collection('users').snapshots().listen((snapshot) {
for (var document in snapshot.docs) {
print(document.data());
}
});
Bir belgeyi güncellemek için update()
metodunu kullanabilirsiniz:
Future<void> updateUser(String userId) {
return FirebaseFirestore.instance
.collection('users')
.doc(userId)
.update({
'age': 26,
'isVerified': false,
});
}
Not:
update()
metodu sadece mevcut alanları günceller. Eğer alan yoksa hata verir.
Bir belgeyi veya alanı silmek için delete()
metodunu kullanabilirsiniz:
// Belge silme
Future<void> deleteUser(String userId) {
return FirebaseFirestore.instance
.collection('users')
.doc(userId)
.delete();
}
// Alan silme
Future<void> deleteField(String userId) {
return FirebaseFirestore.instance
.collection('users')
.doc(userId)
.update({
'age': FieldValue.delete(),
});
}
Firestore’da veriyi filtrelemek için where()
metodunu kullanabilirsiniz:
Future<void> getVerifiedUsers() async {
QuerySnapshot querySnapshot = await FirebaseFirestore.instance
.collection('users')
.where('isVerified', isEqualTo: true)
.get();
for (var doc in querySnapshot.docs) {
print(doc.data());
}
}
Veriyi belirli bir alana göre sıralamak için orderBy()
metodunu kullanabilirsiniz:
Future<void> getUsersSortedByAge() async {
QuerySnapshot querySnapshot = await FirebaseFirestore.instance
.collection('users')
.orderBy('age', descending: true)
.get();
for (var doc in querySnapshot.docs) {
print(doc.data());
}
}
Büyük veri kümelerinde, limit ve offset kullanarak sorguyu sınırlayabilirsiniz:
Future<void> getLimitedUsers() async {
QuerySnapshot querySnapshot = await FirebaseFirestore.instance
.collection('users')
.limit(5)
.get();
for (var doc in querySnapshot.docs) {
print(doc.data());
}
}
Gerçek zamanlı veri güncellemeleri için snapshots()
kullanarak sürekli izleme yapabilirsiniz:
FirebaseFirestore.instance
.collection('users')
.doc('userId')
.snapshots()
.listen((documentSnapshot) {
print(documentSnapshot.data());
});
Transaction, veri bütünlüğünü sağlamak için bir dizi işlemi bir arada yürütmeyi sağlar. Örneğin, bir kullanıcı bakiyesi güncellemesi yapmak için kullanabilirsiniz:
Future<void> runTransactionExample(String userId, double amount) async {
FirebaseFirestore.instance.runTransaction((transaction) async {
DocumentSnapshot snapshot = await transaction.get(
FirebaseFirestore.instance.collection('users').doc(userId));
if (!snapshot.exists) {
throw Exception("Kullanıcı bulunamadı!");
}
double newBalance = snapshot['balance'] + amount;
transaction.update(snapshot.reference, {'balance': newBalance});
});
}
Equality: Belirli bir alandaki değerin tam eşleşmesini sorgular.
dart FirebaseFirestore.instance .collection('users') .where('age', isEqualTo: 25) .get();
Büyüktür, Küçüktür Filtreleri:
isGreaterThan
, isLessThan
, isGreaterThanOrEqualTo
, isLessThanOrEqualTo
gibi operatörler kullanılır.
dart FirebaseFirestore.instance .collection('products') .where('price', isGreaterThan: 100) .get();
Aynı anda birden fazla filtre kullanarak sorgular oluşturabilirsiniz. Ancak, Firestore aynı alanda isGreaterThan
ve isLessThan
gibi farklı operatörlerle filtrelemeyi aynı anda destekler.
AND Filtreleme:
dart FirebaseFirestore.instance .collection('items') .where('price', isGreaterThan: 100) .where('stock', isGreaterThan: 10) .get();
or
operatörünü doğrudan desteklemez, ancak iki ayrı sorgunun sonuçlarını birleştirerek elde edilebilir.Belirli bir değerin bir dizi içinde olup olmadığını sorgulamak için array-contains
kullanılır.
dart FirebaseFirestore.instance .collection('groups') .where('members', arrayContains: 'user123') .get();
array-contains-any
operatörünü kullanabilirsiniz.dart FirebaseFirestore.instance .collection('groups') .where('members', arrayContainsAny: ['user123', 'user456']) .get();
Sorguları belirli alanlara göre sıralamak için orderBy
kullanılır.
dart FirebaseFirestore.instance .collection('users') .orderBy('age', descending: true) .get();
Sorgudan dönecek belge sayısını sınırlamak için limit
kullanılır.
dart FirebaseFirestore.instance .collection('posts') .orderBy('date', descending: true) .limit(10) .get();
Firestore, verileri sayfalandırmak için startAt
, startAfter
, endAt
, ve endBefore
yöntemlerini sağlar. Bu, büyük veri setleriyle çalışırken yararlıdır.
dart FirebaseFirestore.instance .collection('posts') .orderBy('date') .startAfter([lastDocument.data()['date']]) .limit(10) .get();
FirebaseFirestore.instance
.collection('products')
.where('category', isEqualTo: 'electronics')
.where('price', isLessThan: 300)
.orderBy('rating', descending: true)
.limit(5)
.get();
collectionGroup
sorgusu yapılabilir.FirebaseFirestore.instance
.collectionGroup('comments')
.where('postId', isEqualTo: 'post123')
.get();
Firebase Firestore’da Gerçek Zamanlı Güncellemeler, kullanıcıya veriler üzerinde bir değişiklik olduğunda bunu anında yansıtma olanağı sağlar.
Firestore’da gerçek zamanlı güncellemeler sağlamak için snapshots()
metodu kullanılır. Bu yöntemle, belirli bir koleksiyon veya belge üzerinde bir değişiklik olduğunda hemen haber verilir, böylece veriler anlık olarak güncellenir.
Koleksiyon Dinleme: Tüm koleksiyonu dinler ve bir belge eklenip silindiğinde veya güncellendiğinde güncellemeleri sağlar.
FirebaseFirestore.instance
.collection('users')
.snapshots()
.listen((querySnapshot) {
querySnapshot.docs.forEach((doc) {
print(doc['name']);
});
});
Belge Dinleme: Sadece belirli bir belgeye ait değişiklikleri dinlemek için kullanılır.
FirebaseFirestore.instance
.collection('users')
.doc('userID')
.snapshots()
.listen((documentSnapshot) {
print(documentSnapshot['name']);
});
Flutter’ın StreamBuilder
widget’ı, bir stream’den veri çekip gerçek zamanlı olarak UI’a yansıtmak için en uygun yöntemlerden biridir.
StreamBuilder
, bir stream
alır ve veri her güncellendiğinde builder
fonksiyonunu çağırır. Bu sayede verilerin değişiklikleri anında UI’a yansıtılır.StreamBuilder(
stream: FirebaseFirestore.instance.collection('users').snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError) {
return Text('Bir hata oluştu: ${snapshot.error}');
}
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
}
return ListView(
children: snapshot.data!.docs.map((DocumentSnapshot document) {
Map<String, dynamic> data = document.data()! as Map<String, dynamic>;
return ListTile(
title: Text(data['name']),
subtitle: Text(data['email']),
);
}).toList(),
);
},
);
Gerçek zamanlı güncellemeler için dikkat edilmesi gereken bazı performans detayları vardır:
StreamBuilder
kullanırken gereksiz yere fazla sayıda stream açmamaya dikkat edin. Örneğin, ekran kapandığında bağlantıyı kapatmak uygulamanın kaynaklarını daha iyi kullanmasını sağlar.Gerçek zamanlı güncellemeleri belirli durumlara göre (örn. kullanıcı çevrimiçi veya aktifse) yönetmek, verimlilik açısından önemlidir. Örneğin, kullanıcı çevrimdışına çıktığında veya ekran değiştiğinde stream’in durdurulması, gereksiz veri trafiğini azaltabilir.
Firebase Firestore, çevrimdışı mod ve önbellekleme desteği ile çevrimdışı senkronizasyon ve veri yönetimini sağlar. Bu, Flutter uygulamaları için özellikle önemlidir, çünkü kullanıcıların internet bağlantısı olmadığında bile uygulamanın çalışmasını sağlar.
Firestore’un çevrimdışı desteği sayesinde, uygulamanız internet bağlantısı olmadan da çalışır. Bu özellik varsayılan olarak etkinleştirilmiştir ve kullanıcıların çevrimdışıyken yaptığı veri ekleme, güncelleme veya silme işlemleri çevrimiçi hale geldiklerinde otomatik olarak senkronize edilir.
FirebaseFirestore.instance.settings
ayarlarını kullanarak çevrimdışı önbellekleme özelliğini kapatabilirsiniz: FirebaseFirestore.instance.settings = Settings(
persistenceEnabled: false, // Çevrimdışı desteği kapatır
);
Firestore, cihazda belirli bir miktar yer kaplayan bir önbellek yönetim sistemine sahiptir. Zamanla bu önbellek gereksiz büyüyebilir ve belirli bir sınırı aştığında eski veriler otomatik olarak temizlenir. Ancak, manuel temizlik işlemleri yapmak isterseniz, clearPersistence()
metodunu kullanabilirsiniz.
await FirebaseFirestore.instance.clearPersistence();
Settings
içerisinde cacheSizeBytes
parametresi ile bu boyutu özelleştirebilirsiniz: FirebaseFirestore.instance.settings = Settings(
cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED, // Sınırsız önbellek
);
clearPersistence()
ile verilerinizi temizleyebilir, cacheSizeBytes
ile önbellek boyutunu kontrol edebilirsiniz.Diyelim ki, bir alışveriş uygulamanız var ve kullanıcılar çevrimdışıyken bile alışveriş listesi oluşturup düzenleyebiliyor. Firestore’un çevrimdışı desteği ile kullanıcılar bu listelere internet bağlantısı olmadan erişebilir, öğeler ekleyebilir veya silebilir. İnternete bağlandıklarında ise tüm veriler senkronize edilir.
Firebase Firestore güvenlik kuralları, veritabanı erişim güvenliğini sağlamak için belirli kurallar tanımlamanıza olanak tanır. Bu kurallar, kullanıcıların veritabanında hangi verilere erişebileceğini ve bu verilerle neler yapabileceğini belirler. Firestore güvenlik kurallarını doğru yapılandırmak, veri güvenliğini sağlamak için kritik öneme sahiptir.
Firestore güvenlik kuralları, veritabanınıza yapılan tüm okuma ve yazma işlemlerini kontrol etmek için kullanılır. Bu kurallar, allow
anahtar kelimesi ile yapılandırılır ve read
(okuma) veya write
(yazma) işlemlerini izin vermek için kullanılır.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true; // Herkese açık erişim sağlar (örnek olarak)
}
}
}
Bu kural, veritabanındaki tüm belgelere okuma ve yazma izni verir. Ancak gerçek uygulamalarda herkese açık erişim önerilmez.
Kullanıcıların kimlik doğrulamasını temel alarak, veritabanına erişimlerini düzenlemek Firestore’un sağladığı güçlü güvenlik özelliklerinden biridir. Firestore güvenlik kurallarında, yalnızca kimliği doğrulanmış kullanıcıların belirli işlemleri yapmasına izin verebilirsiniz.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
Bu örnekte, yalnızca kimliği doğrulanmış kullanıcıların (request.auth != null) okuma ve yazma işlemi yapmasına izin verilir. Bu kural, tüm veritabanı için geçerli olup kimliği doğrulanmamış kullanıcıların erişimini engeller.
Firestore güvenlik kurallarında koşullar ekleyerek daha ayrıntılı ve dinamik erişim kontrolü sağlayabilirsiniz. Örneğin, her kullanıcının yalnızca kendi verisine erişmesine izin vermek için koşullu güvenlik kuralları oluşturabilirsiniz.
service cloud.firestore {
match /databases/{database}/documents {
// Kullanıcının yalnızca kendi verisine erişebilmesi için kurallar
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}
Bu örnekte, users
koleksiyonundaki her bir belge userId
ile tanımlanmıştır. Bu kural sayesinde, kimliği doğrulanmış her kullanıcı yalnızca userId
değeri kendi kimlik doğrulama kimliği ile eşleştiğinde okuma ve yazma işlemi yapabilir.
Firestore güvenlik kurallarını daha da dinamik hale getirerek koşullar ekleyebilirsiniz. Örneğin, belirli bir alanın değeri veya belgenin içindeki diğer verilerle koşul belirleyebilirsiniz.
role
alanı kontrolü ekleyebilirsiniz: service cloud.firestore {
match /databases/{database}/documents {
match /adminData/{documentId} {
allow read, write: if request.auth.token.role == 'admin';
}
}
}
Bu kuralda, adminData
koleksiyonundaki verilere yalnızca role
değeri admin
olan kullanıcıların erişmesi sağlanmıştır. role
değeri Firebase Authentication kullanıcı token’ında saklanır.
service cloud.firestore {
match /databases/{database}/documents {
match /posts/{postId} {
allow read: if resource.data.isPublished == true;
}
}
}
Bu örnekte, posts
koleksiyonundaki yalnızca isPublished
alanı true
olan belgelere okuma izni verilir. Bu, yayınlanmamış gönderilere kullanıcıların erişmesini engeller.
Güvenlik kurallarını test etmek, uygulamanızın güvenliğini sağlamak için önemlidir. Firestore, kurallarınızı Firebase konsolundaki “Rules Playground” bölümünde test etmenizi sağlar.
Firebase Firestore’da verileri düzenlemek ve ilişkisel veri yapıları oluşturmak için etkili veri yapılandırma stratejileri kullanmak önemlidir. Firestore, ilişkisel verilerle çalışmaya uygun esnek bir yapı sunar. Veri yapısının planlanması ve ilişkilerin belirlenmesi, performans ve verimlilik açısından oldukça önemlidir.
Firestore, belgeler ve koleksiyonlar arasında hiyerarşik yapılar oluşturmanıza izin verir. Bu özellik, bir belgenin altına başka bir koleksiyon eklemeyi mümkün kılar ve bu koleksiyonlar ile ilişkisel veri yapıları kurmanıza yardımcı olur.
users (Koleksiyon)
└── userId (Belge)
└── orders (Alt Koleksiyon)
└── orderId (Belge)
Bu yapıda orders
alt koleksiyonu, her bir kullanıcının ayrı bir belge altında sipariş bilgilerini saklar.
doc()
ve collection()
metotlarını kullanabilirsiniz: // Kullanıcının bir siparişine erişme
FirebaseFirestore.instance
.collection('users')
.doc('userId')
.collection('orders')
.doc('orderId')
.get();
Firestore, NoSQL bir veritabanı olduğundan, ilişkisel veritabanları gibi normalizasyon ve denormalizasyon kararları performans açısından önemlidir. Veriyi daha hızlı ve daha verimli erişim için optimize edebilirsiniz.
{
"postId": "12345",
"content": "This is a post",
"userId": "user_001" // Normalizasyon ile yalnızca referans tutulur
}
posts
koleksiyonundaki her belgeye kullanıcı adını ekleyerek doğrudan erişim sağlayabilirsiniz: {
"postId": "12345",
"content": "This is a post",
"userId": "user_001",
"userName": "John Doe" // Denormalizasyon ile kullanıcının adını doğrudan kaydedin
}
posts
ve comments
koleksiyonları oluşturulabilir. comments
, her gönderiye bağlı bir alt koleksiyon olarak tanımlanabilir.Firestore’da veri yapınızı oluştururken farklı ilişki türlerini göz önünde bulundurabilirsiniz:
profile
koleksiyonu ile user
koleksiyonu arasında bir ilişki kurmak için userId
referansını profile
belgesine ekleyebilirsiniz.posts
koleksiyonu oluşturabilir veya tüm gönderileri bir posts
koleksiyonunda saklayıp userId
ile ilişkilendirebilirsiniz.group_members
adında bir yardımcı koleksiyon oluşturabilirsiniz. Bu koleksiyon, kullanıcı kimlikleri ve grup kimliklerini ilişkilendirir. // Yardımcı bir çok-çok ilişki koleksiyonu örneği
{
"groupId": "group_001",
"userId": "user_001"
}
Diyelim ki, bir sosyal medya uygulaması geliştiriyorsunuz ve kullanıcıların profil bilgileri, gönderileri, beğenileri ve yorumları gibi verileriniz var. Bu veriler için yapabileceğiniz yapılandırma:
users (Koleksiyon)
└── userId (Belge)
└── name: "John Doe"
└── email: "john@example.com"
└── posts (Alt Koleksiyon)
└── postId (Belge)
└── content: "Hello World!"
└── likes: ["user_001", "user_002"]
└── comments (Alt Koleksiyon)
└── commentId (Belge)
└── userId: "user_003"
└── text: "Nice post!"
Bu yapı, kullanıcıların her gönderiye ve yoruma erişimini kolaylaştırır ve ilişkisel yapı sağlar.
Firestore’daki veri yapısını iyi planlamak ve optimize etmek, sorgu performansını artırır ve uygulamanın verimli çalışmasını sağlar. Firestore’un sunduğu esnek yapılar sayesinde hem ilişkisel veritabanı ilişkilerini hem de NoSQL veritabanı avantajlarını bir araya getirerek uygulamanızı geliştirebilirsiniz.
Firebase Firestore’da performans optimizasyonu, verilerin daha hızlı ve daha verimli bir şekilde sunulmasını sağlamak için çeşitli stratejilerin uygulanmasını içerir. Firestore gibi NoSQL veritabanlarında veri erişimini optimize etmek, büyük ölçekli uygulamalar için kritik öneme sahiptir.
Firestore’da indeksleme, veri erişimini hızlandırmanın en etkili yollarından biridir. İndeksler, sorguların daha hızlı gerçekleştirilmesini sağlar ve sonuç olarak performansı artırır. Firestore, bazı temel indeksleri otomatik olarak oluşturur, ancak karmaşık sorgular için özel indeksler oluşturmak gerekebilir.
age
hem de status
alanlarına göre sıralama veya filtreleme yapılması gerektiğinde, Firestore bir kompozit indeks talep edebilir. // Yaşa ve statüye göre filtreleme
FirebaseFirestore.instance
.collection('users')
.where('age', isGreaterThan: 18)
.where('status', isEqualTo: 'active')
.get();
Bu sorguda hem age
hem de status
için kompozit indeks gerektiği belirtilir.
Firestore Indexes
bölümünde, tüm kompozit indeksleri görebilir ve gerektiğinde kaldırabilir veya düzenleyebilirsiniz.Firestore, veritabanında filtreleme yapmanıza olanak tanır, bu da yalnızca gerekli verilerin istemciye gönderilmesini sağlar. İstemci tarafında filtreleme, gereksiz veri çekimi yapar ve uygulamanın performansını düşürür, bu nedenle filtreleme işlemini mümkün olduğunca sunucu tarafında gerçekleştirmek önemlidir.
// Belirli bir kullanıcının gönderilerini çekme
FirebaseFirestore.instance
.collection('posts')
.where('userId', isEqualTo: 'user_001')
.get();
Bu sorgu, yalnızca userId
değeri user_001
olan gönderileri getirir, böylece istemciye gereksiz veri çekilmez.
Firestore, büyük veri kümelerinde gezinmeyi kolaylaştırmak için sayfa yapma (pagination) desteği sağlar. Sorgu sonuçlarını sayfa sayfa çekerek hem bellek kullanımını hem de performansı optimize edebilirsiniz.
startAt()
, startAfter()
, endAt()
, ve endBefore()
metodları ile sayfalama yapılabilir. Örneğin, bir limit()
ile belirli sayıda belge çektikten sonra bir sonraki sayfaya geçişi sağlayabilirsiniz: // İlk 10 belgeyi getir
QuerySnapshot firstPage = await FirebaseFirestore.instance
.collection('posts')
.orderBy('timestamp')
.limit(10)
.get();
// Sonraki 10 belgeyi getir
QuerySnapshot nextPage = await FirebaseFirestore.instance
.collection('posts')
.orderBy('timestamp')
.startAfterDocument(firstPage.docs[firstPage.docs.length - 1])
.limit(10)
.get();
Bu sayede sayfa sayfa veri çekebilir ve bellekte gereksiz yer kaplayan verilerden kaçınabilirsiniz.
Firestore’da denormalizasyon, yani belirli verileri tekrarlayarak saklama, performansı artıran yaygın bir tekniktir. Her bir belgeye, başka bir belgeye bağımlı verilere ihtiyaç duyulmadan erişim sağlanabilir.
{
"postId": "12345",
"content": "This is a post",
"userId": "user_001",
"userName": "John Doe",
"userProfileImage": "https://example.com/profile.jpg"
}
Bu yapı, kullanıcının adı ve profil resmi gibi bilgilerin her sorguda kullanıcı belgesinden çekilmesine gerek kalmadan hızlı erişim sağlar.
Firestore’da her veri çekme işlemi, hem okuma maliyetini artırır hem de performansı etkiler. Bu nedenle yalnızca gereken verileri çekmek ve fazla sorgulardan kaçınmak önemlidir.
select()
metodu ile sadece gerekli alanları çekerek veri transferini ve maliyeti azaltabilirsiniz: // Yalnızca kullanıcı adı ve e-posta alanlarını çek
FirebaseFirestore.instance
.collection('users')
.doc('user_001')
.select(['name', 'email'])
.get();
Bu sorgu, yalnızca name
ve email
alanlarını çeker, böylece istemciye gereksiz veri indirilmez.
source
ayarını Source.cache
olarak belirleyerek çevrimdışı veri okuma işlemlerini zorlayabilirsiniz: // Yalnızca önbellekten okuma
FirebaseFirestore.instance
.collection('posts')
.get(GetOptions(source: Source.cache));
Firestore’da sık veri güncellemeleri, maliyeti ve yükü artırır. Veriler sık değişmiyorsa, gereksiz güncellemelerden kaçınmak için yapıyı yeniden gözden geçirebilirsiniz.
FieldValue
kullanabilirsiniz. Örneğin, bir sayaç değeri güncellenecekse, yalnızca değişiklik olduğunda güncelleme yapılabilir: // Like sayısını artırma
FirebaseFirestore.instance
.collection('posts')
.doc('postId')
.update({
'likes': FieldValue.increment(1),
});
Bu optimizasyon teknikleri sayesinde, Firestore veritabanınızın performansını artırabilir, maliyetleri azaltabilir ve kullanıcı deneyimini iyileştirebilirsiniz. Firestore gibi bir NoSQL veritabanında performansı artırmak için doğru veri yapısını ve sorgu tekniklerini kullanmak hayati öneme sahiptir.
Bir sonraki yazıda görüşmek dileğiyle!”