Google 致力于为黑人社区推动种族平等。查看具体举措
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

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

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

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

อ้างอิง

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

เว็บ v8.0

var alovelaceDocumentRef = db.collection('users').doc('alovelace');

เว็บ v9.0

import { doc } from "firebase/firestore";

const alovelaceDocumentRef = doc(db, 'users', 'alovelace');
รวดเร็ว
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')
C ++
DocumentReference alovelace_document_reference =
    db->Collection("users").Document("alovelace");
โหนด js
const alovelaceDocumentRef = db.collection('users').doc('alovelace');
ไป
alovelaceRef := client.Collection("users").Doc("alovelace")
PHP
$document = $db->collection('users')->document('lovelace');
ความสามัคคี
DocumentReference documentRef = db.Collection("users").Document("alovelace");
ค#
DocumentReference documentRef = db.Collection("users").Document("alovelace");
ทับทิม
document_ref = firestore.col("users").doc("alovelace")

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

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

เว็บ v8.0

var usersCollectionRef = db.collection('users');

เว็บ v9.0

import { collection } from "firebase/firestore";

const usersCollectionRef = collection(db, 'users');
รวดเร็ว
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')
C ++
CollectionReference users_collection_reference = db->Collection("users");
โหนด js
const usersCollectionRef = db.collection('users');
ไป
usersRef := client.Collection("users")
PHP
$collection = $db->collection('users');
ความสามัคคี
CollectionReference collectionRef = db.Collection("users");
ค#
CollectionReference collectionRef = db.Collection("users");
ทับทิม
collection_ref = firestore.col "users"

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

เว็บ v8.0

var alovelaceDocumentRef = db.doc('users/alovelace');

เว็บ v9.0

import { doc } from "firebase/firestore"; 

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

Java

0294dead 20

โคตรลิน + 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')
C ++
DocumentReference alovelace_document = db->Document("users/alovelace");
โหนด 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"

    • B

      ...

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

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

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

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

  • ห้อง

    • name : "my chat room"

      • ข้อความ

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

        • ...

    • B

      ...

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

เว็บ v8.0

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');

เว็บ v9.0

import { doc } from "firebase/firestore"; 

const messageRef = doc(db, "rooms", "roomA", "messages", "message1");
รวดเร็ว
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')
C ++
DocumentReference message_reference = db->Collection("rooms")
    .Document("roomA")
    .Collection("messages")
    .Document("message1");
โหนด 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 คอลเลคชันย่อยและโต้ตอบกับ messages ดังกล่าวได้เช่นเดียวกับการอ้างอิงคอลเล็กชันอื่น ๆ

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