โมเดลข้อมูลใน 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 เพื่อเก็บผู้ใช้ต่างๆ โดยแต่ละคนจะแสดงด้วยเอกสาร ดังนี้

  • ผู้ใช้ ราย

    • แอโลเวเลซ

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

      • messages

        • message1

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

        • message2

          ...

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

คอลเล็กชัน