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

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

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

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

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

เอกสาร

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

เอกสารที่แทนผู้ใช้ 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

    • การแข่งขัน

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

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

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

ชื่อเอกสารภายในคอลเล็กชันจะไม่ซ้ำกัน คุณสามารถระบุ เช่น User-ID หรือให้ 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+KTX

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+KTX

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+KTX

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 ของคุณ:

  • ห้อง

    • roomA

      name : "my chat room"

      • ข้อความ

        • ข้อความ1

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

        • message2

          ...

    • ห้อง B

      ...

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

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+KTX

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 ระดับ

คอลเล็กชัน