ออบเจกต์ที่กำหนดเอง
มีให้อ่านอีก 28 ภาษา
English · Español · 日本語 · Português (Brasil) · Français · Deutsch · Italiano · 한국어 · 简体中文 · Português (Portugal) · 繁體中文 · Bahasa Indonesia · Türkçe · Polski · Tiếng Việt · Nederlands · العربية · עברית · Українська · हिन्दी · Русский · Svenska · Dansk · Norsk bokmål · Suomi · Español (México) · Français (Canada) · Deutsch (Schweiz)

โมดูลที่ 3 จาก 10 ในบท สถาปัตยกรรมข้อมูล Salesforce บทที่ 3 ของหลักสูตร Data Architect แต่ละโมดูลอ่านแยกกันได้ ก่อนหน้า: มองไปที่ยานแม่: โมเดลข้อมูลมาตรฐาน · ถัดไป: ข้อมูลนี้อยู่ที่ไหน?
คำถามที่โมดูลนี้ตอบ: เมื่อ Salesforce ไม่มีสิ่งที่ต้องการ คุณได้อะไรจริงๆ เมื่อสร้างออบเจกต์ของคุณเอง?
ในโมดูลที่แล้วเราดูสิ่งที่ Salesforce สร้างไว้แล้ว บางครั้งมันไม่มีสิ่งที่คุณต้องการ Steve Trucking มีรถบรรทุก และไม่มีออบเจกต์ Truck มาตรฐาน คุณจึงสร้างมันขึ้นมา: ออบเจกต์ที่กำหนดเอง
นี่คือสิ่งที่ผมอยากให้คุณเห็นในโมดูลนี้ ออบเจกต์ที่กำหนดเองถูกสร้างในเมทาดาทา เหมือนทุกอย่างในโมดูลที่ 1 และทันทีที่มันมีอยู่ มันก็มาพร้อมชุดฟังก์ชันมาตรฐาน มันไม่ใช่ตารางเปล่า และหน้าจอที่คุณกรอกเพื่อสร้างมันกำลังถามคำถามทางสถาปัตยกรรมกับคุณ ไม่ว่าคุณจะสังเกตหรือไม่
หน้าจอ New Custom Object
หัวข้อที่มีชื่อว่า “หน้าจอ New Custom Object ”ไปที่ Setup → Object Manager → Create → Custom Object แล้วคุณจะได้ฟอร์มยาวหนึ่งฟอร์ม คนส่วนใหญ่กรอกสองช่องแรกแล้วคลิก Save มาชะลอลงแล้วอ่านมันกัน
Label และ Plural Label “Truck” และ “Trucks” นี่คือสิ่งที่ผู้ใช้เห็น ในแท็บ เลย์เอาต์หน้า และรายงาน คุณเปลี่ยนมันทีหลังได้โดยไม่เจ็บตัวมาก
Object Name ช่องนี้ต่างออกไป: มันคือ API name ชื่อที่โค้ด การผสานรวม รายงาน และตอนนี้เอเจนต์ใช้ พิมพ์ “Truck” แล้ว Salesforce จะทำให้เป็น Truck__c การเปลี่ยนมันทีหลังหมายถึงการตามหาทุกอย่างที่อ้างถึงมัน ซึ่งก็คือการทดสอบความย้อนกลับได้จากบทที่ 1 อีกครั้ง ตั้งช่องนี้ให้ถูกตั้งแต่ครั้งแรก
Description กรอกมัน ทุกครั้ง ในโมดูลที่ 1 ผมบอกว่าเมทาดาทาไม่ใช่ของประดับอีกต่อไป: ผู้ดูแลระบบคนถัดไปอ่านมัน และเครื่องมือ AI ทุกตัวที่พยายามทำความเข้าใจ org ของคุณก็อ่านมันเช่นกัน ออบเจกต์ที่กำหนดเองที่มีคำอธิบายว่างเปล่าคือกล่องที่ไม่มีป้ายติด
Record Name ออบเจกต์ที่กำหนดเองทุกตัวมีฟิลด์ Name และตรงนี้คือที่ที่คุณตัดสินว่ามันคืออะไร ชื่อแบบ Text เช่น “Truck 117” หรือ Auto Number (ตัวเลขอัตโนมัติ) เช่น T-000184 ซึ่ง Salesforce กรอกให้คุณ อ่านคำเตือนบนหน้าจอนั้น: ถ้าคุณวางแผนจะแทรกเรกคอร์ดปริมาณมากผ่าน API Salesforce บอกให้คุณใช้ Text นั่นคือแพลตฟอร์มกำลังบอกบางอย่างเกี่ยวกับขนาด ก่อนที่คุณจะสร้างเรกคอร์ดสักรายการ

Salesforce Setup, New Custom Object: ส่วน Record Name พร้อมคำเตือน (ภาพหน้าจอ 2026-10-12) ขนาดเต็ม
Optional Features Allow Reports, Allow Activities, Track Field History, Allow in Chatter Groups ปิดไว้เป็นค่าเริ่มต้น แต่ละตัวคือความสามารถที่คุณเปิดให้ออบเจกต์นี้ ตัดสินอย่างตั้งใจ
Object Classification Allow Sharing, Allow Bulk API Access, Allow Streaming API Access ทั้งหมดเปิดเป็นค่าเริ่มต้น หน้าจอบอกไว้ชัดเจน: เมื่อเปิดสิ่งเหล่านี้ ออบเจกต์จะเป็นออบเจกต์ Enterprise Application เมื่อปิด จะเป็นออบเจกต์ Light Application ชื่อเหล่านั้นสอดคล้องกับสิทธิ์การใช้งานแบบสมัครสมาชิกแอปของ Salesforce: Lightning Platform Light App ไม่มีการแชร์ระดับเรกคอร์ด และใช้ Bulk API หรือ Streaming API ไม่ได้ ส่วน Enterprise App ใช้ได้ คำแนะนำของผม: เปิดไว้ เว้นแต่คุณรู้แน่ชัดว่าทำไมไม่ควร ปิดการเข้าถึง Bulk API บนออบเจกต์ที่คุณจะโหลดข้อมูลปริมาณมากในภายหลัง แล้วคุณจะรู้ว่าทำไมมันจึงสำคัญ
Deployment Status และ Search “In Development” ซ่อนออบเจกต์จากผู้ใช้ระหว่างที่คุณสร้างมัน “Deployed” ทำให้มันใช้งานจริง และ Allow Search ปิดไว้เป็นค่าเริ่มต้น ผู้ใช้จึงหาเรกคอร์ดเหล่านี้ใน global search ไม่เจอจนกว่าคุณจะเปิดมัน ข้อนี้ทำให้คนพลาดทุกครั้ง

ค่าเริ่มต้น: การตั้งค่า API ทั้งสามเปิด Deployed และ Allow Search ปิด (ภาพหน้าจอ 2026-10-12) ขนาดเต็ม
คลิก Save แล้ว Object Manager จะแสดงออบเจกต์ให้คุณเห็น: API name Truck__c เครื่องหมายถูกที่ Custom ป้ายชื่อ และสถานะการ deploy แต่ลองดูทางด้านซ้าย: Fields & Relationships, Page Layouts, Lightning Record Pages, Record Types, Validation Rules, Triggers, Flow Triggers, Object Access, Field Access รายการนั้นคือโมดูลที่ 1 ที่มองเห็นได้ ออบเจกต์ไม่ได้เป็นแค่ที่เก็บข้อมูล มันคือที่ที่พฤติกรรมทั้งหมดนั้นแขวนอยู่

Object Manager, Truck: API name Truck__c, Custom และทุกอย่างที่แขวนอยู่กับออบเจกต์ (ภาพหน้าจอ 2026-10-12) ขนาดเต็ม
ฟิลด์ที่คุณไม่ได้สร้าง
หัวข้อที่มีชื่อว่า “ฟิลด์ที่คุณไม่ได้สร้าง ”เปิด Fields & Relationships บนออบเจกต์ที่กำหนดเองที่เพิ่งสร้างใหม่ แล้วจะเห็นว่ามันมีฟิลด์อยู่แล้ว ออบเจกต์ที่กำหนดเองทุกตัวได้ชุดมาตรฐาน:
- Name ชื่อเรกคอร์ดที่คุณเพิ่งเลือก ใช้ในเลย์เอาต์หน้า related list, lookup และผลการค้นหา
- Owner ผู้ใช้หรือคิวที่เป็นเจ้าของเรกคอร์ด
- Created By และ Last Modified By ผู้ใช้ที่สร้างมัน และผู้ใช้ที่แก้ไขมันล่าสุด
- Currency ถ้าเปิดใช้หลายสกุลเงิน และ Division ถ้า org ของคุณใช้ division
และเบื้องหลัง คือ ID ของเรกคอร์ดจากโมดูลที่ 1 และวันที่สร้างกับวันที่แก้ไข ส่งออกเรกคอร์ดสักสองสามรายการด้วย Data Loader แล้วคุณจะเห็นทั้งหมด
หนึ่งในนั้นหายไปได้ ทำให้ออบเจกต์ที่กำหนดเองของคุณเป็นฝั่ง detail ของความสัมพันธ์แบบ master-detail แล้วฟิลด์ Owner จะหายไป: ความเป็นเจ้าของมาจากเรกคอร์ด master แทน นั่นเป็นเรื่องใหญ่กว่าที่ฟังดู และเราจะกลับมาเรื่องนี้ในโมดูลที่ 7 และ 8
คำนำหน้าและคำต่อท้าย: สิ่งที่คุณกำลังดูอยู่
หัวข้อที่มีชื่อว่า “คำนำหน้าและคำต่อท้าย: สิ่งที่คุณกำลังดูอยู่ ”ในโมดูลที่แล้วผมบอกว่าออบเจกต์มาตรฐานไม่มีคำนำหน้าและไม่มีคำต่อท้าย ทุกอย่างอื่นมี และเมื่อคุณอ่านมันออก รายการฟิลด์จะบอกคุณได้ชัดเจนว่ากำลังดูอะไรอยู่
| หน้าตาเป็นแบบนี้ | มันคืออะไร |
|---|---|
Account, Case | ออบเจกต์หรือฟิลด์มาตรฐาน: ไม่มีคำนำหน้า ไม่มีคำต่อท้าย |
Truck__c | ออบเจกต์ที่กำหนดเอง หรือฟิลด์ที่กำหนดเอง เช่น Unit_Number__c |
abc__Inspection__c | ออบเจกต์ที่กำหนดเองจาก managed package: abc คือ namespace ของผู้ให้บริการ |
Delivery_History__b | big object (โมดูลที่ 4) |
Shipment__x | ออบเจกต์ภายนอก: ข้อมูลอยู่ในอีกระบบ (โมดูลที่ 4) |
Allergies__pc | ฟิลด์ผู้ติดต่อที่กำหนดเองบนบัญชีบุคคล (โมดูลที่ 2) |
Truck__r | ความสัมพันธ์เบื้องหลัง lookup ที่กำหนดเอง เมื่อคุณตามมันในคิวรี |
มีบางอย่างที่ควรสังเกต
จนถึงตอนนี้นั่นเป็นแค่รายการ นี่คือวิธีที่ผมสอน: เป็นชั้นๆ มีออบเจกต์สามประเภท มาตรฐาน กำหนดเอง และ managed package และทุกประเภทมีฟิลด์ชนิดเดียวกันอยู่บนตัวได้: ฟิลด์มาตรฐานที่มันมีมาแต่แรก และฟิลด์ที่กำหนดเองที่มีคนเพิ่มเข้าไป
ออบเจกต์มาตรฐาน Account ไม่มีคำนำหน้าและไม่มีคำต่อท้าย ฟิลด์มาตรฐานของมันก็เช่นกัน: Name, Industry, OwnerId คุณเพิ่มฟิลด์ที่กำหนดเองให้ออบเจกต์มาตรฐานส่วนใหญ่ได้ และทุกฟิลด์ที่คุณเพิ่มจะลงท้ายด้วย __c: Region__c (Custom Fields (opens in a new tab)) คำต่อท้ายนั้นคือสิ่งที่ทำให้คุณปลอดภัย Salesforce เพิ่มฟิลด์มาตรฐานใหม่ให้ Account ในรีลีสต่างๆ และเพราะฟิลด์ของคุณลงท้ายด้วย __c เสมอ ส่วนของพวกเขาไม่เคย ฟิลด์มาตรฐานในอนาคตจึงไม่มีวันชนกับฟิลด์ที่คุณมีอยู่แล้ว
ออบเจกต์ที่กำหนดเอง ออบเจกต์ของคุณเองลงท้ายด้วย __c: Truck__c (Custom Objects (opens in a new tab)) และฟิลด์ที่กำหนดเองที่คุณใส่บนมันก็เช่นกัน: Unit_Number__c แต่ฟิลด์ที่มันมีมาตั้งแต่เกิด ซึ่งก็คือฟิลด์จากส่วนที่แล้ว เป็นฟิลด์มาตรฐาน: Name, OwnerId, CreatedDate ไม่มีคำต่อท้าย ดังนั้นแม้แต่บนออบเจกต์ของคุณเอง คำต่อท้ายก็บอกคุณว่าใครสร้างแต่ละฟิลด์
ออบเจกต์ของ managed package เมื่อคุณติดตั้ง managed package จาก AppExchange ออบเจกต์และฟิลด์ของมันจะมาพร้อมคำนำหน้า namespace (namespace prefix) ของผู้ให้บริการ: abc__Inspection__c และฟิลด์อย่าง abc__Result__c คำนำหน้านั้นเป็นของผู้ให้บริการรายนั้นรายเดียว และมันไม่เปลี่ยน (Namespace Prefix (opens in a new tab)) ในคำพูดของ Salesforce เอง คำนำหน้าถูกเติมให้แต่ละคอมโพเนนต์เพื่อให้มันไม่ซ้ำ: name__c กลายเป็น prefix__name__c (AppExchange Object Prefixes and the API (opens in a new tab)) ผู้ให้บริการสองรายจึงส่งออบเจกต์ชื่อ Invoice__c ได้ทั้งคู่ โดยไม่มีวันชนกันเอง หรือชนกับคุณ ออบเจกต์ของแพ็กเกจยังคงมีฟิลด์มาตรฐานของมัน Name และ OwnerId โดยไม่มีคำนำหน้า แพ็กเกจยังเพิ่มฟิลด์ที่มีคำนำหน้าของตัวเองให้ออบเจกต์มาตรฐานได้ด้วย เช่น abc__Score__c บน Account และคุณก็เพิ่มฟิลด์ที่กำหนดเองของคุณให้ออบเจกต์ของแพ็กเกจได้: Depot__c บน abc__Inspection__c ใช้คำต่อท้าย __c ของคุณ แต่ไม่มีวันใช้คำนำหน้าของผู้ให้บริการ เพราะคุณเป็นคนสร้างมัน ไม่ใช่พวกเขา (Known Issue: unmanaged custom field on a managed package object (opens in a new tab))
อ่าน API name ใดก็ได้ แล้วคุณจะรู้ว่าใครสร้างมัน ไม่มีคำต่อท้าย: Salesforce __c ที่ไม่มีคำนำหน้า: org ของคุณ abc__ อยู่ข้างหน้า: ผู้ให้บริการ นั่นสำคัญทุกครั้งที่คุณวางแผนการเปลี่ยนแปลง สิ่งที่เป็นของคุณ คุณเปลี่ยนได้ สิ่งที่เป็นของ Salesforce คุณตั้งค่าและขยายได้ สิ่งที่เป็นของผู้ให้บริการส่วนใหญ่ถูกล็อก: มีบางอย่าง เช่นเลย์เอาต์หน้าและข้อความช่วยเหลือ ที่คุณแก้ไขได้ แต่แพ็กเกจส่วนใหญ่และ API name ทุกชื่อเป็นของผู้ให้บริการ และการอัปเกรดของพวกเขาก็นำการเปลี่ยนแปลงของพวกเขามาด้วย (Editable Properties After Package Promotion or Installation (opens in a new tab))
Unmanaged package ไม่มีคำนำหน้า ติดตั้ง unmanaged package แล้วออบเจกต์ของมันจะลงมาใน org ของคุณเหมือนคุณสร้างมันเอง โดยไม่มีคำนำหน้า ถ้ามันนำ Truck__c มาด้วย และคุณมีอยู่แล้วหนึ่งตัว คุณก็เจอชื่อชนกัน ตรวจสอบก่อนติดตั้ง
สร้างเฉพาะสิ่งที่ Salesforce ไม่มี
หัวข้อที่มีชื่อว่า “สร้างเฉพาะสิ่งที่ Salesforce ไม่มี ”การสร้างออบเจกต์ที่กำหนดเองนั้นง่าย และนั่นคือเหตุผลที่ผมคิดว่าเราสร้างมันมากเกินไป หน้าจอ New Custom Object จะยินดีสร้าง Customer__c ให้คุณใน org ที่มี Account อยู่แล้ว ดังนั้นก่อนคลิก ให้ถามคำถามจากโมดูลที่แล้ว: ยานแม่มีสิ่งนี้อยู่แล้วหรือยัง? ถ้ามี ใช้มัน ถ้าไม่มี สร้างมัน และกรอกหน้าจอทั้งหมดแบบสถาปนิก
โมดูลถัดไปถามคำถามที่มาก่อนนั้นอีก: ข้อมูลนี้ควรอยู่ใน Salesforce เลยหรือเปล่า?
สิ่งที่สถาปนิกต้องตัดสินใจในเรื่องนี้
หัวข้อที่มีชื่อว่า “สิ่งที่สถาปนิกต้องตัดสินใจในเรื่องนี้ ”- Salesforce มีออบเจกต์มาตรฐานสำหรับสิ่งนี้อยู่แล้วหรือไม่ ก่อนจะสร้างออบเจกต์ที่กำหนดเอง
- API name ที่เลือกครั้งเดียว และคำอธิบายที่เขียนไว้สำหรับคนและเครื่องจักร
- ชื่อเรกคอร์ด: Text หรือ Auto Number โดยคำนึงถึงปริมาณที่คุณคาดไว้
- ฟีเจอร์เสริม การเข้าถึง API และการค้นหาตัวไหนที่จะเปิด อย่างตั้งใจ
- คำต่อท้ายใน org บอกอะไรคุณ: กำหนดเอง, managed, big, ภายนอก, บัญชีบุคคล
- แพ็กเกจที่คุณกำลังจะติดตั้งอาจชนกับสิ่งที่คุณสร้างไว้หรือไม่
ศึกษาเพิ่มเติม
หัวข้อที่มีชื่อว่า “ศึกษาเพิ่มเติม ”- Custom Objects (opens in a new tab) และ Custom Fields (opens in a new tab), Object Reference (ภาษาอังกฤษ ตรวจสอบเมื่อ 2026-10-13): “ชื่อของออบเจกต์ที่กำหนดเองมีคำต่อท้ายเป็นขีดล่างสองตัวตามด้วยตัว ‘c’ พิมพ์เล็ก” ฟิลด์ที่กำหนดเองก็เช่นกัน และตารางออบเจกต์มาตรฐานที่รองรับฟิลด์ที่กำหนดเอง
- AppExchange Object Prefixes and the API (opens in a new tab), Object Reference (ภาษาอังกฤษ ตรวจสอบเมื่อ 2026-10-13): คำนำหน้า namespace ทำให้แต่ละคอมโพเนนต์ในแพ็กเกจไม่ซ้ำ “name__c กลายเป็น prefix__name__c”
- Namespace Prefix (opens in a new tab), Apex Developer Guide (ภาษาอังกฤษ ตรวจสอบเมื่อ 2026-10-13): คำนำหน้า namespace แยกชื่อออบเจกต์และฟิลด์ของ managed package ออกจากชื่อใน org อื่น
- Editable Properties After Package Promotion or Installation (opens in a new tab), Second-Generation Managed Packaging Developer Guide (ภาษาอังกฤษ ตรวจสอบเมื่อ 2026-10-13): คุณสมบัติใดของคอมโพเนนต์ในแพ็กเกจที่นักพัฒนา ผู้สมัครใช้ ทั้งคู่ หรือไม่มีใครแก้ไขได้
- Custom Object Standard Fields (opens in a new tab), Salesforce Help (ภาษาอังกฤษ ตรวจสอบเมื่อ 2026-10-12): ฟิลด์มาตรฐานที่ออบเจกต์ที่กำหนดเองทุกตัวได้ (Name, Owner, Created By, Last Modified By, Currency, Division) และทำไม Owner จึงถูกนำออกบนฝั่ง detail ของความสัมพันธ์แบบ master-detail
- Standard User Licenses (opens in a new tab), Salesforce Help (ภาษาอังกฤษ ตรวจสอบเมื่อ 2026-10-12): Lightning Platform Light App “ใช้ Bulk API หรือ Streaming API ไม่ได้” ส่วน Enterprise App “รองรับการแชร์ระดับเรกคอร์ด ใช้ Bulk API และ Streaming API ได้”
