Cloud Firestore Veri modeli

Cloud Firestore, NoSQL, belge odaklı bir veritabanıdır. SQL veritabanından farklı olarak, tablo veya satır yoktur. Bunun yerine, verileri koleksiyonlar halinde düzenlenen belgelerde depolarsınız.

Her belge bir dizi anahtar/değer çifti içerir. Cloud Firestore, büyük küçük belge koleksiyonlarını depolamak için optimize edilmiştir.

Tüm belgeler koleksiyonlarda saklanmalıdır. Belgeler, her ikisi de dizeler gibi ilkel alanlar veya listeler gibi karmaşık nesneler içerebilen alt koleksiyonlar ve iç içe nesneler içerebilir.

Koleksiyonlar ve belgeler, Cloud Firestore'da dolaylı olarak oluşturulur. Bir koleksiyon içindeki bir belgeye veri atamanız yeterlidir. Koleksiyon veya belge yoksa, Cloud Firestore onu oluşturur.

Belgeler

Cloud Firestore'da depolama birimi belgedir. Belge, değerlerle eşleşen alanları içeren hafif bir kayıttır. Her belge bir adla tanımlanır.

alovelace kullanıcısını temsil eden bir belge şöyle görünebilir:

  • aşkı

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

Bir belgedeki karmaşık, iç içe nesnelere haritalar denir. Örneğin, yukarıdaki örnekteki kullanıcının adını aşağıdaki gibi bir harita ile yapılandırabilirsiniz:

  • aşkı

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

Belgelerin JSON'a çok benzediğini fark edebilirsiniz. Aslında, temelde öyleler. Bazı farklılıklar vardır (örneğin, belgeler ek veri türlerini destekler ve boyut olarak 1 MB ile sınırlıdır), ancak genel olarak belgeleri hafif JSON kayıtları olarak değerlendirebilirsiniz.

Koleksiyonlar

Belgeler, yalnızca belgeler için kapsayıcı olan koleksiyonlarda yaşar. Örneğin, her biri bir belgeyle temsil edilen çeşitli kullanıcılarınızı içeren bir users koleksiyonunuz olabilir:

  • kullanıcıları

    • aşkı

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

    • çekici

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

Cloud Firestore şemasızdır, bu nedenle her belgeye hangi alanları koyacağınız ve bu alanlarda hangi veri türlerini depolayacağınız konusunda tam bir özgürlüğe sahipsiniz. Aynı koleksiyondaki belgelerin tümü farklı alanlar içerebilir veya bu alanlarda farklı veri türleri depolayabilir. Ancak, belgeleri daha kolay sorgulayabilmeniz için aynı alanları ve veri türlerini birden çok belgede kullanmak iyi bir fikirdir.

Bir koleksiyon belgeler içerir ve başka hiçbir şey içermez. Değerleri olan ham alanları doğrudan içeremez ve diğer koleksiyonları içeremez. (Cloud Firestore'da daha karmaşık verilerin nasıl yapılandırılacağına ilişkin açıklama için Hiyerarşik Verilere bakın.)

Bir koleksiyon içindeki belgelerin adları benzersizdir. Kullanıcı kimlikleri gibi kendi anahtarlarınızı sağlayabilir veya Cloud Firestore'un sizin için otomatik olarak rastgele kimlikler oluşturmasına izin verebilirsiniz.

Koleksiyonları "oluşturmanıza" veya "silmenize" gerek yoktur. Bir koleksiyondaki ilk belgeyi oluşturduktan sonra koleksiyon var olur. Bir koleksiyondaki tüm belgeleri silerseniz, artık mevcut olmaz.

Referanslar

Cloud Firestore'daki her belge, veritabanındaki konumuyla benzersiz bir şekilde tanımlanır. Önceki örnek, koleksiyon users içinde alovelace bir belge gösterdi. Kodunuzda bu konuma başvurmak için ona bir referans oluşturabilirsiniz.

Web version 9

import { doc } from "firebase/firestore";

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

Web version 8

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Süratli
Not: Bu ürün, watchOS ve App Clip hedeflerinde mevcut değildir.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Amaç-C
Not: Bu ürün, watchOS ve App Clip hedeflerinde mevcut değildir.
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];

Java

DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");

Kotlin+KTX

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

Dart

final alovelaceDocumentRef = db.collection("users").doc("alovelace");
Java
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
piton
a_lovelace_ref = db.collection(u'users').document(u'alovelace')

Python

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');
Gitmek
alovelaceRef := client.Collection("users").Doc("alovelace")
PHP
$document = $db->collection('samples/php/users')->document('alovelace');
Birlik
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
DocumentReference documentRef = db.Collection("users").Document("alovelace");
yakut
document_ref = firestore.col("users").doc("alovelace")

Referans, yalnızca veritabanınızdaki bir konuma işaret eden hafif bir nesnedir. Orada veri bulunsun veya bulunmasın bir referans oluşturabilirsiniz ve referans oluşturmak herhangi bir ağ işlemi gerçekleştirmez.

Ayrıca koleksiyonlara referanslar da oluşturabilirsiniz:

Web version 9

import { collection } from "firebase/firestore";

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

Web version 8

var usersCollectionRef = db.collection('users');
Süratli
Not: Bu ürün, watchOS ve App Clip hedeflerinde mevcut değildir.
let usersCollectionRef = db.collection("users")
Amaç-C
Not: Bu ürün, watchOS ve App Clip hedeflerinde mevcut değildir.
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

Java

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

Kotlin+KTX

val usersCollectionRef = db.collection("users")

Dart

final usersCollectionRef = db.collection("users");
Java
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
piton
users_ref = db.collection(u'users')

Python

users_ref = db.collection("users")
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
Gitmek
usersRef := client.Collection("users")
PHP
$collection = $db->collection('samples/php/users');
Birlik
CollectionReference collectionRef = db.Collection("users");
C#
CollectionReference collectionRef = db.Collection("users");
yakut
collection_ref = firestore.col "users"

Kolaylık sağlamak için, bir belgenin veya koleksiyonun yolunu bir eğik çizgiyle ( / ) ayrılmış yol bileşenleriyle bir dize olarak belirterek de referanslar oluşturabilirsiniz. Örneğin, alovelace belgesine bir referans oluşturmak için:

Web version 9

import { doc } from "firebase/firestore"; 

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

Web version 8

var alovelaceDocumentRef = db.doc('users/alovelace');
Süratli
Not: Bu ürün, watchOS ve App Clip hedeflerinde mevcut değildir.
let aLovelaceDocumentReference = db.document("users/alovelace")
Amaç-C
Not: Bu ürün, watchOS ve App Clip hedeflerinde mevcut değildir.
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

Java

DocumentReference alovelaceDocumentRef = db.document("users/alovelace");

Kotlin+KTX

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

Dart

final aLovelaceDocRef = db.doc("users/alovelace");
Java
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
piton
a_lovelace_ref = db.document(u'users/alovelace')

Python

a_lovelace_ref = db.document("users/alovelace")
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
const alovelaceDocumentRef = db.doc('users/alovelace');
Gitmek
alovelaceRef := client.Doc("users/alovelace")
PHP
$document = $db->document('users/alovelace');
Birlik
DocumentReference documentRef = db.Document("users/alovelace");
C#
DocumentReference documentRef = db.Document("users/alovelace");
yakut
document_path_ref = firestore.doc "users/alovelace"

Hiyerarşik Veriler

Cloud Firestore'da hiyerarşik veri yapılarının nasıl çalıştığını anlamak için mesajlar ve sohbet odaları içeren örnek bir sohbet uygulamasını düşünün.

Farklı sohbet odalarını depolamak için rooms adlı bir koleksiyon oluşturabilirsiniz:

  • odaları

    • odası

      name : "my chat room"

    • odasıB

      ...

Artık sohbet odalarınız olduğuna göre, mesajlarınızı nasıl saklayacağınıza karar verin. Bunları sohbet odasının belgesinde saklamak istemeyebilirsiniz. Cloud Firestore'daki belgeler hafif olmalıdır ve bir sohbet odası çok sayıda mesaj içerebilir. Ancak, sohbet odanızın belgesinde alt koleksiyonlar olarak ek koleksiyonlar oluşturabilirsiniz.

alt koleksiyonlar

Bu senaryoda iletileri depolamanın en iyi yolu alt koleksiyonları kullanmaktır. Alt koleksiyon, belirli bir belgeyle ilişkili bir koleksiyondur.

rooms koleksiyonunuzdaki her oda belgesi için messages adlı bir alt koleksiyon oluşturabilirsiniz:

  • odaları

    • odası

      name : "my chat room"

      • mesajları

        • mesajı1

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

        • mesajı2

          ...

    • odasıB

      ...

Bu örnekte, aşağıdaki kodla alt koleksiyondaki bir mesaja referans oluşturacaksınız:

Web version 9

import { doc } from "firebase/firestore"; 

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

Web version 8

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
Süratli
Not: Bu ürün, watchOS ve App Clip hedeflerinde mevcut değildir.
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
Amaç-C
Not: Bu ürün, watchOS ve App Clip hedeflerinde mevcut değildir.
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];

Java

DocumentReference messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1");

Kotlin+KTX

val messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1")

Dart

final messageRef = db
    .collection("rooms")
    .doc("roomA")
    .collection("messages")
    .doc("message1");
Java
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
piton
room_a_ref = db.collection(u'rooms').document(u'roomA')
message_ref = room_a_ref.collection(u'messages').document(u'message1')

Python

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');
Gitmek
messageRef := client.Collection("rooms").Doc("roomA").
	Collection("messages").Doc("message1")
PHP
$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
Birlik
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
C#
DocumentReference documentRef = db
    .Collection("Rooms").Document("RoomA")
    .Collection("Messages").Document("Message1");
yakut
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

Koleksiyonların ve belgelerin değişen düzenine dikkat edin. Koleksiyonlarınız ve belgeleriniz her zaman bu modeli izlemelidir. Bir koleksiyondaki bir koleksiyona veya bir belgedeki bir belgeye başvuramazsınız.

Alt koleksiyonlar, verileri hiyerarşik olarak yapılandırmanıza izin vererek verilere erişimi kolaylaştırır. roomA içindeki tüm mesajları almak için, alt koleksiyon messages bir koleksiyon referansı oluşturabilir ve diğer herhangi bir koleksiyon referansı gibi onunla etkileşime girebilirsiniz.

Alt koleksiyonlardaki belgeler, alt koleksiyonlar da içerebilir, bu da daha fazla veri yerleştirmenize olanak tanır. Verileri 100 seviyeye kadar derinliğe yerleştirebilirsiniz.