Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

โมเดลข้อมูล 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

    • aturing

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

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

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

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

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

อ้างอิง

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

เว็บรุ่น 9

import { doc } from "firebase/firestore";

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

เว็บรุ่น8

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Swift
let alovelaceDocumentRef = db.collection("users").document("alovelace")
วัตถุประสงค์-C
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];

Java

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

คอตลิน+KTX

val alovelaceDocumentRef = db.collection("users").document("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('lovelace');
ความสามัคคี
DocumentReference documentRef = db.Collection("users").Document("alovelace");
ค#
DocumentReference documentRef = db.Collection("users").Document("alovelace");
ทับทิม
document_ref = firestore.col("users").doc("alovelace")

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

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

เว็บรุ่น 9

import { collection } from "firebase/firestore";

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

เว็บรุ่น8

var usersCollectionRef = db.collection('users');
Swift
let usersCollectionRef = db.collection("users")
วัตถุประสงค์-C
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

Java

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

คอตลิน+KTX

val 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 เอกสาร:

เว็บรุ่น 9

import { doc } from "firebase/firestore"; 

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

เว็บรุ่น8

var alovelaceDocumentRef = db.doc('users/alovelace');
Swift
let aLovelaceDocumentReference = db.document("users/alovelace")
วัตถุประสงค์-C
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

Java

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

คอตลิน+KTX

val alovelaceDocumentRef = db.document("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/lovelace');
ความสามัคคี
DocumentReference documentRef = db.Document("users/alovelace");
ค#
DocumentReference documentRef = db.Document("users/alovelace");
ทับทิม
document_path_ref = firestore.doc "users/alovelace"

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

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

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

  • ห้อง

    • ห้องพักเตียง

      name : "my chat room"

    • roomB

      ...

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

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

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

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

  • ห้อง

    • ห้องพักเตียง

      name : "my chat room"

      • ข้อความ

        • message1

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

        • message2

          ...

    • roomB

      ...

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

เว็บรุ่น 9

import { doc } from "firebase/firestore"; 

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

เว็บรุ่น8

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
Swift
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
วัตถุประสงค์-C
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];

Java

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

คอตลิน+KTX

val messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("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 , คุณสามารถสร้างคอลเลกชันที่จะอ้างอิง subcollection messages และโต้ตอบกับมันเหมือนกับที่คุณต้องการใด ๆ อ้างอิงคอลเลกชันอื่น ๆ

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