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

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

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

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

คอลเล็กชันและเอกสารถูกสร้างขึ้นโดยปริยายใน 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

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

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

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

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

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

อ้างอิง

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

Web version 9

import { doc } from "firebase/firestore";

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

Web version 8

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Swift
หมายเหตุ: ผลิตภัณฑ์นี้ไม่สามารถใช้ได้กับเป้าหมาย watchOS และ App Clip
let alovelaceDocumentRef = db.collection("users").document("alovelace")
วัตถุประสงค์-C
หมายเหตุ: ผลิตภัณฑ์นี้ไม่สามารถใช้ได้กับเป้าหมาย watchOS และ App Clip
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");
Python
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');
ไป
alovelaceRef := client.Collection("users").Doc("alovelace")
PHP
$document = $db->collection('samples/php/users')->document('alovelace');
ความสามัคคี
DocumentReference documentRef = db.Collection("users").Document("alovelace");
ค#
DocumentReference documentRef = db.Collection("users").Document("alovelace");
ทับทิม
document_ref = firestore.col("users").doc("alovelace")

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

คุณยังสามารถสร้างการอ้างอิงถึง คอลเลกชัน :

Web version 9

import { collection } from "firebase/firestore";

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

Web version 8

var usersCollectionRef = db.collection('users');
Swift
หมายเหตุ: ผลิตภัณฑ์นี้ไม่สามารถใช้ได้กับเป้าหมาย watchOS และ App Clip
let usersCollectionRef = db.collection("users")
วัตถุประสงค์-C
หมายเหตุ: ผลิตภัณฑ์นี้ไม่สามารถใช้ได้กับเป้าหมาย watchOS และ App Clip
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");
Python
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');
ไป
usersRef := client.Collection("users")
PHP
$collection = $db->collection('samples/php/users');
ความสามัคคี
CollectionReference collectionRef = db.Collection("users");
ค#
CollectionReference collectionRef = db.Collection("users");
ทับทิม
collection_ref = firestore.col "users"

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

Web version 9

import { doc } from "firebase/firestore"; 

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

Web version 8

var alovelaceDocumentRef = db.doc('users/alovelace');
Swift
หมายเหตุ: ผลิตภัณฑ์นี้ไม่สามารถใช้ได้กับเป้าหมาย watchOS และ App Clip
let aLovelaceDocumentReference = db.document("users/alovelace")
วัตถุประสงค์-C
หมายเหตุ: ผลิตภัณฑ์นี้ไม่สามารถใช้ได้กับเป้าหมาย watchOS และ App Clip
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");
Python
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');
ไป
alovelaceRef := client.Doc("users/alovelace")
PHP
$document = $db->document('users/alovelace');
ความสามัคคี
DocumentReference documentRef = db.Document("users/alovelace");
ค#
DocumentReference documentRef = db.Document("users/alovelace");
ทับทิม
document_path_ref = firestore.doc "users/alovelace"

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

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

คุณสามารถสร้างคอลเลกชันที่เรียกว่า rooms เพื่อจัดเก็บห้องสนทนาต่างๆ:

  • ห้อง

    • A

      name : "my chat room"

    • B

      ...

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

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

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

คุณสามารถสร้างคอลเล็กชันย่อยที่เรียกว่า messages สำหรับเอกสารทุกห้องในคอลเล็กชัน rooms ของคุณ:

  • ห้อง

    • A

      name : "my chat room"

      • ข้อความ

        • ข้อความ

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

        • ข้อความ

          ...

    • B

      ...

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

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');
Swift
หมายเหตุ: ผลิตภัณฑ์นี้ไม่สามารถใช้ได้กับเป้าหมาย watchOS และ App Clip
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
วัตถุประสงค์-C
หมายเหตุ: ผลิตภัณฑ์นี้ไม่สามารถใช้ได้กับเป้าหมาย watchOS และ App Clip
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");
Python
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');
ไป
messageRef := client.Collection("rooms").Doc("roomA").
	Collection("messages").Doc("message1")
PHP
$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
ความสามัคคี
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
ค#
DocumentReference documentRef = db
    .Collection("Rooms").Document("RoomA")
    .Collection("Messages").Document("Message1");
ทับทิม
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

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

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

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