โมเดลข้อมูลใน Cloud Firestore

Cloud Firestore เป็นฐานข้อมูล NoSQL ที่เน้นเอกสาร ต่างจากฐานข้อมูล SQL ตรงที่ไม่มีตารางหรือแถว แต่คุณจะจัดเก็บข้อมูลในเอกสารแทน ซึ่งจะจัดระเบียบเป็นคอลเล็กชัน

เอกสารแต่ละฉบับมีชุดคู่คีย์-ค่า Cloud Firestore ได้รับการเพิ่มประสิทธิภาพสำหรับการจัดเก็บคอลเล็กชันเอกสารขนาดเล็กจำนวนมาก

เอกสารทั้งหมดต้องจัดเก็บไว้ในคอลเล็กชัน เอกสารอาจมีคอลเล็กชันย่อยและออบเจ็กต์ที่ซ้อนกัน ซึ่งทั้ง 2 อย่างนี้อาจมีฟิลด์ดั้งเดิม เช่น สตริง หรือออบเจ็กต์ที่ซับซ้อน เช่น รายการ

ระบบจะสร้างคอลเล็กชันและเอกสารโดยนัยใน Cloud Firestore เพียงกำหนดข้อมูลให้กับเอกสารภายในคอลเล็กชัน หากไม่มีทั้งคอลเล็กชัน หรือเอกสาร Cloud Firestore จะสร้างให้

เอกสาร

ใน Cloud Firestore หน่วยพื้นที่เก็บข้อมูลคือเอกสาร เอกสารคือ ระเบียนน้ำหนักเบาที่มีฟิลด์ซึ่งแมปกับค่า เอกสารแต่ละฉบับจะ ระบุด้วยชื่อ

เอกสารที่แสดงถึงผู้ใช้ alovelace อาจมีลักษณะดังนี้

  • alovelace

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

ออบเจ็กต์ที่ซับซ้อนและซ้อนกันในเอกสารเรียกว่าแผนที่ เช่น คุณสามารถ จัดโครงสร้างชื่อผู้ใช้จากตัวอย่างด้านบนด้วยแผนที่ได้ดังนี้

  • alovelace

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

คุณอาจสังเกตเห็นว่าเอกสารมีลักษณะคล้ายกับ JSON มาก ซึ่งจริงๆ แล้วก็เป็นเช่นนั้น แม้ว่าจะมีข้อแตกต่างบางอย่าง (เช่น เอกสารรองรับประเภทข้อมูลเพิ่มเติมและมีขนาดจำกัดที่ 1 MB) แต่โดยทั่วไปแล้ว คุณสามารถถือว่าเอกสารเป็นระเบียน JSON ขนาดเล็กได้

คอลเล็กชัน

เอกสารจะอยู่ในคอลเล็กชัน ซึ่งเป็นเพียงคอนเทนเนอร์สำหรับเอกสาร ตัวอย่างเช่น คุณอาจมีusersคอลเล็กชันเพื่อเก็บผู้ใช้ต่างๆ โดยแต่ละคน จะแสดงด้วยเอกสาร

  • ผู้ใช้ ราย

    • alovelace

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

    • aturing

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

Cloud Firestore ไม่มีสคีมา คุณจึงมีอิสระอย่างเต็มที่ในการเลือกช่องที่จะใส่ในแต่ละเอกสารและประเภทข้อมูลที่จะจัดเก็บในช่องเหล่านั้น เอกสารภายในคอลเล็กชันเดียวกันอาจมีฟิลด์ที่แตกต่างกันทั้งหมด หรือจัดเก็บข้อมูลประเภทต่างๆ ในฟิลด์เหล่านั้น อย่างไรก็ตาม เราขอแนะนำให้ใช้ฟิลด์และประเภทข้อมูลเดียวกันในเอกสารหลายฉบับ เพื่อให้คุณค้นหาเอกสารได้ง่ายขึ้น

คอลเล็กชันมีเอกสารเท่านั้น โดยต้องไม่มีฟิลด์ดิบที่มีค่าโดยตรง และต้องไม่มีคอลเล็กชันอื่นๆ (ดูคำอธิบายวิธีจัดโครงสร้างข้อมูลที่ซับซ้อนมากขึ้นใน Cloud Firestore ได้ที่ข้อมูลแบบลำดับชั้น)

ชื่อของเอกสารภายในคอลเล็กชันต้องไม่ซ้ำกัน คุณสามารถระบุคีย์ของคุณเอง เช่น รหัสผู้ใช้ หรือจะให้ Cloud Firestore สร้างรหัสแบบสุ่ม ให้คุณโดยอัตโนมัติก็ได้

คุณไม่จำเป็นต้อง "สร้าง" หรือ "ลบ" คอลเล็กชัน หลังจากสร้างเอกสารแรกในคอลเล็กชันแล้ว คอลเล็กชันจะพร้อมใช้งาน หากคุณลบเอกสารทั้งหมดในคอลเล็กชัน คอลเล็กชันนั้นจะไม่มีอยู่อีกต่อไป

รายการอ้างอิง

เอกสารทุกฉบับใน Cloud Firestore จะมีตัวระบุที่ไม่ซ้ำกันตามตำแหน่ง ในฐานข้อมูล ตัวอย่างก่อนหน้าแสดงเอกสาร alovelace ภายในคอลเล็กชัน users หากต้องการอ้างอิงตำแหน่งนี้ในโค้ด คุณสามารถสร้างการอ้างอิงถึงตำแหน่งดังกล่าวได้

Web

import { doc } from "firebase/firestore";

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

Web

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Swift
หมายเหตุ: ผลิตภัณฑ์นี้ไม่พร้อมใช้งานในเป้าหมาย watchOS และ App Clip
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective-C
หมายเหตุ: ผลิตภัณฑ์นี้ไม่พร้อมใช้งานในเป้าหมาย watchOS และ App Clip
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];

Kotlin

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

Java

DocumentReference 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");
Python
a_lovelace_ref = db.collection("users").document("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');
Go

import (
	"cloud.google.com/go/firestore"
)

func createDocReference(client *firestore.Client) {

	alovelaceRef := client.Collection("users").Doc("alovelace")

	_ = alovelaceRef
}
PHP

PHP

ดูข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและสร้างCloud Firestoreไคลเอ็นต์ได้ที่ Cloud Firestoreไลบรารีของไคลเอ็นต์

$document = $db->collection('samples/php/users')->document('alovelace');
Unity
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#

C#

ดูข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและสร้างCloud Firestoreไคลเอ็นต์ได้ที่ Cloud Firestoreไลบรารีของไคลเอ็นต์

DocumentReference documentRef = db.Collection("users").Document("alovelace");
Ruby
document_ref = firestore.col("users").doc("alovelace")

การอ้างอิงคือออบเจ็กต์ที่มีขนาดเล็กซึ่งชี้ไปยังตำแหน่งในฐานข้อมูล คุณสร้างการอ้างอิงได้ไม่ว่าจะมีข้อมูลอยู่ในนั้นหรือไม่ก็ตาม และ การสร้างการอ้างอิงจะไม่ดำเนินการใดๆ ในเครือข่าย

นอกจากนี้ คุณยังสร้างการอ้างอิงถึงคอลเล็กชันได้ด้วย

Web

import { collection } from "firebase/firestore";

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

Web

var usersCollectionRef = db.collection('users');
Swift
หมายเหตุ: ผลิตภัณฑ์นี้ไม่พร้อมใช้งานในเป้าหมาย watchOS และ App Clip
let usersCollectionRef = db.collection("users")
Objective-C
หมายเหตุ: ผลิตภัณฑ์นี้ไม่พร้อมใช้งานในเป้าหมาย watchOS และ App Clip
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

Kotlin

val usersCollectionRef = db.collection("users")

Java

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

Dart

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

Python

users_ref = db.collection("users")
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
Go

import (
	"cloud.google.com/go/firestore"
)

func createCollectionReference(client *firestore.Client) {
	usersRef := client.Collection("users")

	_ = usersRef
}
PHP

PHP

ดูข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและสร้างCloud Firestoreไคลเอ็นต์ได้ที่ Cloud Firestoreไลบรารีของไคลเอ็นต์

$collection = $db->collection('samples/php/users');
Unity
CollectionReference collectionRef = db.Collection("users");
C#

C#

ดูข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและสร้างCloud Firestoreไคลเอ็นต์ได้ที่ Cloud Firestoreไลบรารีของไคลเอ็นต์

CollectionReference collectionRef = db.Collection("users");
Ruby
collection_ref = firestore.col "users"

คุณยังสร้างการอ้างอิงได้โดยการระบุเส้นทางไปยังเอกสารหรือคอลเล็กชันเป็นสตริง โดยมีคอมโพเนนต์เส้นทางที่คั่นด้วยเครื่องหมายทับ (/) เพื่อความสะดวก ตัวอย่างเช่น หากต้องการสร้างการอ้างอิงไปยังเอกสาร alovelace ให้ทำดังนี้

Web

import { doc } from "firebase/firestore"; 

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

Web

var alovelaceDocumentRef = db.doc('users/alovelace');
Swift
หมายเหตุ: ผลิตภัณฑ์นี้ไม่พร้อมใช้งานในเป้าหมาย watchOS และ App Clip
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
หมายเหตุ: ผลิตภัณฑ์นี้ไม่พร้อมใช้งานในเป้าหมาย watchOS และ App Clip
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

Kotlin

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

Java

DocumentReference 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");
Python
a_lovelace_ref = db.document("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');
Go

import (
	"cloud.google.com/go/firestore"
)

func createDocReferenceFromString(client *firestore.Client) {
	// Reference to a document with id "alovelace" in the collection "users"
	alovelaceRef := client.Doc("users/alovelace")

	_ = alovelaceRef
}
PHP

PHP

ดูข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและสร้างCloud Firestoreไคลเอ็นต์ได้ที่ Cloud Firestoreไลบรารีของไคลเอ็นต์

$document = $db->document('users/alovelace');
Unity
DocumentReference documentRef = db.Document("users/alovelace");
C#

C#

ดูข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและสร้างCloud Firestoreไคลเอ็นต์ได้ที่ Cloud Firestoreไลบรารีของไคลเอ็นต์

DocumentReference documentRef = db.Document("users/alovelace");
Ruby
document_path_ref = firestore.doc "users/alovelace"

ข้อมูลแบบลำดับชั้น

หากต้องการทำความเข้าใจวิธีการทำงานของโครงสร้างข้อมูลแบบลำดับชั้นใน Cloud Firestore ลองพิจารณาแอปแชทตัวอย่างที่มีข้อความและห้องแชท

คุณสร้างคอลเล็กชันที่ชื่อ rooms เพื่อจัดเก็บห้องแชทต่างๆ ได้โดยทำดังนี้

  • ห้องแชท

    • ห้องA

      name : "my chat room"

    • roomB

      ...

เมื่อมีห้องแชทแล้ว ให้ตัดสินใจว่าจะจัดเก็บข้อความอย่างไร คุณอาจไม่ต้องการจัดเก็บไว้ในเอกสารของห้องแชท เอกสารใน Cloud Firestore ควรมีขนาดเล็ก และห้องแชทอาจมีข้อความจำนวนมาก อย่างไรก็ตาม คุณสามารถสร้างคอลเล็กชันเพิ่มเติมภายในเอกสารของห้องแชท เป็นคอลเล็กชันย่อยได้

คอลเล็กชันย่อย

วิธีที่ดีที่สุดในการจัดเก็บข้อความในสถานการณ์นี้คือการใช้คอลเล็กชันย่อย คอลเล็กชันย่อยคือคอลเล็กชันที่เชื่อมโยงกับเอกสารที่เฉพาะเจาะจง

คุณสร้างคอลเล็กชันย่อยที่ชื่อ messages สำหรับเอกสารห้องทุกห้องในคอลเล็กชัน rooms ได้โดยทำดังนี้

  • ห้องแชท

    • ห้องA

      name : "my chat room"

      • ข้อความ

        • ข้อความ 1

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

        • ข้อความ 2

          ...

    • roomB

      ...

ในตัวอย่างนี้ คุณจะต้องสร้างการอ้างอิงถึงข้อความในคอลเล็กชันย่อย ด้วยโค้ดต่อไปนี้

Web

import { doc } from "firebase/firestore"; 

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

Web

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
Swift
หมายเหตุ: ผลิตภัณฑ์นี้ไม่พร้อมใช้งานในเป้าหมาย watchOS และ App Clip
let messageRef = db
  .collection("rooms").document("roomA")
  .collection("messages").document("message1")
Objective-C
หมายเหตุ: ผลิตภัณฑ์นี้ไม่พร้อมใช้งานในเป้าหมาย watchOS และ App Clip
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];

Kotlin

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

Java

DocumentReference 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");
Python
room_a_ref = db.collection("rooms").document("roomA")
message_ref = room_a_ref.collection("messages").document("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');
Go

import (
	"cloud.google.com/go/firestore"
)

func createSubcollectionReference(client *firestore.Client) {
	messageRef := client.Collection("rooms").Doc("roomA").
		Collection("messages").Doc("message1")

	_ = messageRef
}
PHP

PHP

ดูข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและสร้างCloud Firestoreไคลเอ็นต์ได้ที่ Cloud Firestoreไลบรารีของไคลเอ็นต์

$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
Unity
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
C#

C#

ดูข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและสร้างCloud Firestoreไคลเอ็นต์ได้ที่ Cloud Firestoreไลบรารีของไคลเอ็นต์

DocumentReference documentRef = db
    .Collection("Rooms").Document("RoomA")
    .Collection("Messages").Document("Message1");
Ruby
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

สังเกตรูปแบบการสลับของคอลเล็กชันและเอกสาร คอลเล็กชัน และเอกสารต้องเป็นไปตามรูปแบบนี้เสมอ คุณอ้างอิงคอลเล็กชัน ในคอลเล็กชันหรือเอกสารในเอกสารไม่ได้

คอลเล็กชันย่อยช่วยให้คุณจัดโครงสร้างข้อมูลแบบลำดับชั้นได้ ซึ่งจะช่วยให้เข้าถึงข้อมูลได้ง่ายขึ้น หากต้องการรับข้อความทั้งหมดใน roomA คุณสามารถสร้างการอ้างอิงคอลเล็กชัน ไปยังคอลเล็กชันย่อย messages และโต้ตอบกับคอลเล็กชันย่อยนั้นได้เช่นเดียวกับ การอ้างอิงคอลเล็กชันอื่นๆ

เอกสารในคอลเล็กชันย่อยอาจมีคอลเล็กชันย่อยด้วยเช่นกัน ซึ่งช่วยให้คุณ ซ้อนข้อมูลได้มากยิ่งขึ้น คุณซ้อนข้อมูลได้สูงสุด 100 ระดับ