ข้ามไปยังเนื้อหา

วาดความสัมพันธ์

มีให้อ่านอีก 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)

A card model of a region from above: one distribution center joined by red threads to many small stores, and a second center with its own.
ภาพสร้างด้วย AI

โมดูลที่ 2 จาก 6 ในบท การสร้างโมเดลข้อมูลเพื่อความหมาย บทที่ 2 ของหลักสูตร Data Architect แต่ละโมดูลอ่านแยกกันได้ ก่อนหน้า: ฟังหาคำนาม · ถัดไป: สร้างโมเดลเชิงตรรกะ

คำถามที่โมดูลนี้ตอบ: จะเปลี่ยนเอนทิตีที่เป็นไปได้ให้เป็นโมเดลข้อมูลเชิงแนวคิดได้อย่างไร?

เรามีคำนามอยู่บนกระดานแล้ว ตอนนี้ผมอยากรู้เกี่ยวกับเส้นระหว่างกล่อง เพราะกลุ่มของเอนทิตียังไม่ใช่โมเดลข้อมูลจริงๆ ความหมายส่วนใหญ่อยู่ในความสัมพันธ์ พันธมิตรค้าปลีกดำเนินงานศูนย์กระจายสินค้า ใบรายการสินค้าระบุการจัดส่ง การจัดส่งไปถึงผู้รับ ทีมจัดส่งประจำรถบรรทุก ทุกประโยคเหล่านั้นบอกบางอย่างเกี่ยวกับธุรกิจ และทุกประโยคให้คำถามใหม่แก่ผม

ผมยังไม่อยากพูดถึง Salesforce ผมไม่ได้ถามว่านี่ควรเป็นความสัมพันธ์แบบ lookup หรือ master-detail ไม่ได้คิดถึง Junction Object ของ Salesforce (ออบเจกต์ที่กำหนดเองที่มีความสัมพันธ์ master-detail สองชุด) หรือตัดสินใจว่าจะเกิดอะไรขึ้นเมื่อเรกคอร์ดแม่ถูกลบ ผมพยายามเข้าใจความสัมพันธ์ทางธุรกิจ

ลองดู “พันธมิตรค้าปลีกดำเนินงานศูนย์กระจายสินค้า” ฟังดูง่าย แต่พันธมิตรค้าปลีกมี DC แห่งเดียวหรือหลายแห่ง? ที่ Steve Trucking พันธมิตรค้าปลีกแต่ละรายดำเนินงานศูนย์กระจายสินค้าระดับภูมิภาคในทุกภูมิภาคที่ Steve Trucking ให้บริการ จึงเป็นหลายแห่ง DC หนึ่งแห่งเป็นของพันธมิตรค้าปลีกมากกว่าหนึ่งรายได้ไหม? DC มีความสำคัญในตัวเอง มีพนักงานและประวัติของตัวเอง หรือเป็นแค่ที่อยู่? ถ้าพันธมิตรค้าปลีกเลิกใช้บริการ เรายังสนใจ DC ของเขาไหม?

นั่นไม่ใช่คำถามเกี่ยวกับ Salesforce มันคือคำถามทางธุรกิจ และคำตอบอาจเปลี่ยนโมเดลไปโดยสิ้นเชิง

ก่อนจะลงลึกกว่านี้ ผมอยากให้ภาษาที่เราจะใช้กับทุกไดอะแกรมจากนี้ไป มันเป็นภาษาเล็กๆ เส้นระหว่างสองกล่องบอกว่าสองสิ่งนั้นสัมพันธ์กัน และเครื่องหมายที่ปลายเส้นบอกว่ามีกี่อัน

เริ่มด้วยเส้นธรรมดา ไม่มีเครื่องหมายเลย นั่นคือจุดที่ผมเริ่มบนไวต์บอร์ด: ผมรู้ว่าคำนามสองคำนี้สัมพันธ์กัน แค่ยังไม่ได้ถามว่าอย่างไร แล้วปลายเส้นก็ได้เครื่องหมาย ขีดเดียวพาดขวางเส้นหมายถึงหนึ่ง ส่วนตีนกา (crow’s foot) ปลายที่แตกเป็นสามแฉกเหมือนเท้านก หมายถึงหลาย ภายหลังในโมดูลนี้ คุณจะเห็นเครื่องหมายตัวที่สองปรากฏข้างตัวแรก เป็นขีดหรือวงกลม และตัวนั้นตอบคำถามอีกข้อ: มีเป็นศูนย์ได้ไหม?

กฎข้อเดียวที่ต้องจำ: คุณอ่านแต่ละเครื่องหมายที่กล่องที่มันแตะ เครื่องหมายที่ใกล้กล่องที่สุดคือจำนวนมากที่สุดที่มีได้ เครื่องหมายถัดออกไปคือจำนวนน้อยที่สุด

การอ่านเส้น คำอธิบายสัญลักษณ์ของภาษาไดอะแกรมในหลักสูตร เส้นธรรมดาที่ไม่มีเครื่องหมายหมายความว่าสองสิ่งสัมพันธ์กัน แต่ยังไม่ได้กำหนดว่ากี่รายการ ขีดเดียวที่ปลายเส้นหมายถึงหนึ่ง ตีนกาหมายถึงหลาย เมื่อมีเครื่องหมายตัวที่สองสำหรับความเป็นทางเลือก: สองขีดหมายถึงหนึ่งพอดี วงกลมและขีดหมายถึงศูนย์หรือหนึ่ง ขีดและตีนกาหมายถึงหนึ่งหรือหลาย วงกลมและตีนกาหมายถึงศูนย์หรือหลาย เครื่องหมายแต่ละตัวอ่านที่กล่องที่มันแตะ เริ่มต้น: เส้นธรรมดา เส้นธรรมดา สองสิ่งนี้สัมพันธ์กัน ยังไม่ได้กำหนดว่ากี่รายการ ต่อมา: หนึ่งหรือหลาย หนึ่ง ขีดเดียว (ขีดขวาง): หนึ่งรายการ ของกล่องที่มันแตะ หลาย ตีนกา: หลายรายการ ของกล่องที่มันแตะ ต่อมา: เป็นศูนย์ได้ไหม? หนึ่งพอดี สองขีด: อย่างน้อยหนึ่ง อย่างมากหนึ่ง ศูนย์หรือหนึ่ง วงกลม แล้วขีด: อาจยังไม่มีอยู่ หนึ่งหรือหลาย ขีด แล้วตีนกา: อย่างน้อยหนึ่ง ศูนย์หรือหลาย วงกลม แล้วตีนกา: ไม่มีเลยก็ได้ อ่านแต่ละปลายที่กล่องที่มันแตะ: เครื่องหมายที่ใกล้กล่องที่สุดคือจำนวนมากที่สุดที่เป็นไปได้ เครื่องหมายถัดออกมาคือจำนวนน้อยที่สุด © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

ก่อนไปที่ Steve Trucking กลับไปที่สุนัขจากโมดูลที่ 1 เรามีห้ากล่อง: เจ้าของ ผู้เพาะพันธุ์ สุนัข สายพันธุ์ และท่า ตอนนี้ผมถามเรื่องเส้นระหว่างพวกมัน

หนึ่งหรือหลาย? เจ้าของหนึ่งคนมีสุนัขได้มากกว่าหนึ่งตัว Ana มีสองตัว สุนัขหนึ่งตัวมีเจ้าของหนึ่งคน อย่างน้อยก็ในโมเดลของเรา นั่นคือหนึ่งต่อหลาย: ขีดที่ฝั่งเจ้าของ ตีนกาที่ฝั่งสุนัข ผู้เพาะพันธุ์ก็มีรูปแบบเดียวกัน: ผู้เพาะพันธุ์หนึ่งรายเพาะพันธุ์สุนัขหลายตัว

ไม่มีเลยได้ไหม? Max มาจากสถานพักพิงสัตว์ เขาจึงไม่มีผู้เพาะพันธุ์เลย ปลายฝั่งผู้เพาะพันธุ์จึงได้วงกลม: สุนัขหนึ่งตัวมีผู้เพาะพันธุ์ศูนย์หรือหนึ่งราย แต่สุนัขทุกตัวมีเจ้าของ ปลายฝั่งนั้นจึงได้ขีดที่สอง: หนึ่งพอดี

หลายต่อหลาย? สุนัขหนึ่งตัวทำได้หลายท่า และท่าหนึ่ง เช่น นั่ง ก็มีสุนัขหลายตัวทำได้ นั่นคือหลายต่อหลาย และนั่นคือจุดที่ผมไปมองหาแนวคิดที่ซ่อนอยู่ มีอะไรเกี่ยวกับการที่สุนัขตัวนี้ทำท่านี้ได้ไหม? เธอทำได้ดีแค่ไหน และเรียนมันเมื่อไร ความสัมพันธ์มีข้อเท็จจริงของตัวเอง มันจึงกลายเป็นสิ่งหนึ่งของตัวเอง: ท่าของสุนัข (Dog Trick) ในชื่อภาษาอังกฤษ สุนัขมาก่อน เพราะสุนัขคือตัวขับเคลื่อน

แต่ละเส้นหมายถึงอะไร? เจ้าของเป็นเจ้าของสุนัข ผู้เพาะพันธุ์เพาะพันธุ์มัน สุนัขทำท่าของมันได้ ตั้งชื่อเส้น แล้วใครก็อ่านโมเดลกลับให้คุณฟังได้

ตอนนี้ หรือตลอดเวลา? มีใครสนใจไหมว่าวันนี้ Bella ทำท่านั่งได้ดีแค่ไหน หรือเธอไปถึงจุดนั้นได้อย่างไร? ถ้าครูฝึกตรวจเธอทุกสองสามเดือน การตรวจแต่ละครั้งก็คือเรกคอร์ดของตัวเอง: การประเมินท่า (Trick Assessment) พร้อมวันที่ ระดับทักษะ และผู้ตรวจ อยู่ใต้ท่าของสุนัขที่มันสังกัด แม้แต่ความสัมพันธ์ที่กลายเป็นสิ่งหนึ่งแล้วก็มีประวัติของตัวเองได้

สายพันธุ์ผมยังปล่อยไว้โดยไม่เชื่อมก่อน มันยังเป็นคำถามจากโมดูลที่ 1 ว่าเป็นกล่องของตัวเองหรือเป็นคำบนสุนัข และโมดูลที่ 4 จะตัดสินเรื่องนี้

โมเดลสุนัขพร้อมความสัมพันธ์ กล่องเจ็ดกล่อง เจ้าของเป็นเจ้าของสุนัขหนึ่งหรือหลายตัว และสุนัขแต่ละตัวมีเจ้าของหนึ่งคนพอดี ผู้เพาะพันธุ์เพาะพันธุ์สุนัขหนึ่งหรือหลายตัว และสุนัขมีผู้เพาะพันธุ์ศูนย์หรือหนึ่งราย สุนัขทำท่าของสุนัขได้ศูนย์หรือหลายรายการ และท่าปรากฏในท่าของสุนัขศูนย์หรือหลายรายการ ท่าของสุนัขแต่ละรายการคือสุนัขหนึ่งตัวและท่าหนึ่งท่า ท่าของสุนัขแต่ละรายการถูกประเมินในการประเมินท่าศูนย์หรือหลายครั้ง สายพันธุ์ยังอยู่โดดๆ ยังไม่ได้เชื่อม เป็นเจ้าของ เพาะพันธุ์ ทำได้ ปรากฏใน ถูกประเมินใน เจ้าของ ผู้เพาะพันธุ์ สุนัข สายพันธุ์ ท่าของสุนัข ท่า การประเมินท่า หนึ่งพอดี ศูนย์หรือหนึ่ง หนึ่งหรือหลาย ศูนย์หรือหลาย © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

คำถามทุกข้อเหล่านั้นใช้ได้แบบเดียวกันกับธุรกิจจริง ทีนี้มาถามคำถามเหล่านั้นกับ Steve Trucking กัน

หนึ่งในสิ่งแรกที่ผมอยากเข้าใจเกี่ยวกับความสัมพันธ์คือ cardinality นั่นเป็นศัพท์ทางฐานข้อมูล คำถามนั้นง่ายกว่ามาก: สิ่งนี้กี่อันสัมพันธ์กับสิ่งนั้นได้กี่อัน? ในระดับแนวคิดมีรูปแบบพื้นฐานสามแบบ

นี่เป็นขั้นตอนสำคัญในกระบวนการ: หยิบคำนามสองคำที่ต่างกันแล้วเข้าใจความสัมพันธ์ของมัน ในสถานการณ์ส่วนใหญ่จะเป็นหนึ่งต่อหลาย หรือหลายต่อหนึ่ง เฉพาะในกรณีที่หาได้ยากเท่านั้นที่คุณจะเจอแบบหนึ่งต่อหนึ่ง

หนึ่งต่อหลายมีอยู่ทุกที่ พันธมิตรค้าปลีกหนึ่งรายมีศูนย์กระจายสินค้าหลายแห่ง ใบรายการสินค้าหนึ่งใบระบุการจัดส่งหลายรายการ เส้นทางหนึ่งเส้นมีจุดแวะราวสิบจุด เมื่อผมได้ยินภาษาแบบนั้น ผมก็เริ่มวาดเส้น

และตอนนี้เส้นก็ได้เครื่องหมาย แต่ละปลายบอกจำนวนของกล่องที่มันแตะ: ขีดสำหรับหนึ่ง ตีนกาสำหรับหลาย อ่านจากแต่ละกล่อง: พันธมิตรค้าปลีกหนึ่งรายมีศูนย์กระจายสินค้าหลายแห่ง

ตัวเชื่อมพื้นฐาน หนึ่งต่อหลาย กล่องสองคู่ แต่ละคู่เชื่อมด้วยเส้นในสัญลักษณ์ตีนกาแบบพื้นฐาน พันธมิตรค้าปลีกหนึ่งรายดำเนินงานศูนย์กระจายสินค้าหลายแห่ง: ขีดเดียวที่ปลายฝั่งพันธมิตรค้าปลีก และตีนกาที่ปลายฝั่งศูนย์กระจายสินค้า ใบรายการสินค้าหนึ่งใบระบุการจัดส่งหลายรายการ โดยทำเครื่องหมายแบบเดียวกัน แต่ละปลายมีคำอธิบายเป็นข้อความกำกับ พันธมิตรค้าปลีก หนึ่งรายการ ศูนย์กระจายสินค้า หลายรายการ ดำเนินงาน ใบรายการสินค้า หนึ่งรายการ การจัดส่ง หลายรายการ ระบุ พันธมิตรค้าปลีก ศูนย์กระจายสินค้า ใบรายการสินค้า การจัดส่ง ขีดเดียวคือหนึ่ง ตีนกาคือหลาย อ่านแต่ละปลายจากกล่องที่มันแตะ © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

ความสัมพันธ์หนึ่งต่อหนึ่งมีอยู่จริง แต่หาได้ยาก และเมื่อผมเจอ ผมจะถามคำถามบางข้อ นี่เป็นคำนามสองคำที่ต่างกันจริงๆ หรือเป็นคำเดียวกัน? ถ้าต่างกัน ความสัมพันธ์แบบหนึ่งต่อหนึ่งระหว่างมันคืออะไร? และมันจะเป็นหนึ่งต่อหนึ่งตลอดไป หรือแค่หนึ่งต่อหนึ่งตอนนี้? นี่คือคำถามสำคัญในการออกแบบโมเดลข้อมูล ทีมจัดส่งกับรถบรรทุกดูเหมือนหนึ่งต่อหนึ่งในเช้าวันใดวันหนึ่ง: สองคน รถหนึ่งคัน เส้นทางหนึ่งเส้น แต่ตลอดหนึ่งเดือนมันไม่ใช่ และนั่นคือที่ซ่อนของความสัมพันธ์ที่น่าสนใจที่สุดในโมเดลนี้

ความสัมพันธ์หลายต่อหลายน่าสนใจเป็นพิเศษ เพราะมันมักบอกเราว่ามีแนวคิดอีกอย่างหนึ่งในธุรกิจ ทีมจัดส่งหนึ่งทีมขับรถบรรทุกมากกว่าหนึ่งคันในช่วงเวลาต่างๆ ได้ไหม? ได้ รถบรรทุกหนึ่งคันถูกขับโดยทีมมากกว่าหนึ่งทีมได้ไหม? ตลอดอายุการใช้งานของมัน ได้แน่นอน ดังนั้นทีมจัดส่งกับรถบรรทุกจึงมีความสัมพันธ์แบบหลายต่อหลาย แต่ตอนนี้ผมอยากรู้มากขึ้น ธุรกิจสนใจว่าทีมหนึ่งใช้รถคันหนึ่งเมื่อไรหรือไม่? สำหรับเส้นทางไหน ในวันไหน? ใครเป็นคนมอบหมาย? ถ้าตัวความสัมพันธ์เองมีข้อมูลที่เราสนใจ เราก็ค้นพบแนวคิดทางธุรกิจอีกอย่างหนึ่ง: การมอบหมายทีม (Crew Assignment)

นั่นเป็นนิสัยการสร้างโมเดลที่สำคัญ บางครั้งสิ่งที่น่าสนใจที่สุดไม่ใช่คำนามที่เราได้ยินตอนแรก แต่มันซ่อนอยู่ในความสัมพันธ์ระหว่างคำนามสองคำ

นี่คือหนึ่งในจุดที่ผมอยากให้ผู้ดูแลระบบเริ่มคิดต่างออกไป ใน Salesforce เราคุ้นกับการพูดถึงออบเจกต์และฟิลด์ จึงง่ายที่จะถือว่ากล่องเป็นส่วนสำคัญ และเส้นเป็นแค่ท่อเชื่อม แต่ตัวความสัมพันธ์เองก็มีความหมายทางธุรกิจได้

ลองดูการจัดส่งกับสินค้าในนั้น การจัดส่งหนึ่งรายการขนสินค้าได้หลายชิ้น เช่น เครื่องซักผ้ากับเครื่องอบผ้า สินค้าหนึ่งชิ้น เช่น ตู้เย็นรุ่นเดียวกัน ปรากฏในการจัดส่งหลายพันรายการ ง่ายพอ แต่ถ้าผมต้องรู้ว่าสินค้านั้นมีกี่ชิ้นในการจัดส่งนี้ ต้องติดตั้งไหม หรือต้องขนของเก่าทิ้งไหมล่ะ? ผมไม่ได้สนใจแค่ความสัมพันธ์ระหว่างการจัดส่งกับสินค้าอีกต่อไป ผมสนใจรายการจัดส่ง (Delivery Item) และแนวคิดนั้นสมควรมีเอนทิตีของตัวเอง

ถ้าคุณมาจากสาย Salesforce คุณอาจกำลังคิดว่า “นั่นคือ junction object” คุณไม่ผิด แต่ผมไม่อยากเริ่มตรงนั้น รายการจัดส่งเป็นแนวคิดทางธุรกิจก่อนที่จะเป็น Junction Object ของ Salesforce ธุรกิจมาก่อน การ implement มาทีหลัง

นี่คือนิสัยบางอย่างของผมสำหรับเอนทิตีความสัมพันธ์เหล่านี้ ไม่ว่าสุดท้ายจะถูกสร้างไว้ที่ไหน

ตั้งชื่อมัน ถ้าธุรกิจมีคำเรียกอยู่แล้ว ให้ใช้คำของพวกเขา ถ้าไม่มี ให้เอาชื่อของแม่ทั้งสองมารวมกัน ลองนึกถึงคำสั่งซื้อกับสินค้า สิ่งที่อยู่ตรงกลางคือ Order Item: คำสั่งซื้อ และรายการในคำสั่งซื้อ มันเป็นลูกของแม่ทั้งสอง และใน Salesforce อาจลงเอยเป็น Junction Object ของ Salesforce แต่ชื่อไหนควรมาก่อน: Item Order หรือ Order Item? ดูว่าแม่แต่ละตัวเป็นข้อมูลประเภทไหน สินค้าเป็นข้อมูลอ้างอิง คำสั่งซื้อเป็นธุรกรรม และคำสั่งซื้อคือตัวขับเคลื่อน จึงเป็น Order Item หรือ Order Product แบบเดียวกับที่ Salesforce มี Opportunity Product ที่ Steve Trucking มันคือ Delivery Item (รายการจัดส่ง) ชื่อที่เป็นตัวขับเคลื่อนมาก่อน และเรกคอร์ดจะเรียงอยู่ข้างเจ้าของของมันในทุกรายการที่คุณจะเปิดดู

ให้คีย์ของมันเอง มันชวนให้พูดว่ารายการจัดส่งถูกระบุด้วยการจัดส่งบวกสินค้าแล้วจบตรงนั้น นั่นคือคีย์ผสม (compound key) และคีย์ผสมจัดการยากกว่ามาก: ทุกระบบที่ชี้มายังเรกคอร์ดต้องถือทั้งสองครึ่ง ให้เอนทิตีความสัมพันธ์มีตัวระบุของตัวเอง และเก็บการจัดส่งบวกสินค้าไว้เป็นกฎเรื่องความไม่ซ้ำ ไม่ใช่เป็นตัวตน

แม่สอง ลูกหนึ่ง: ให้คีย์ของตัวเองแก่มัน แม่สองและลูกหนึ่ง การจัดส่ง (ID ของเรกคอร์ดคือ ID การจัดส่ง วันที่จัดส่ง สถานะ) ประกอบด้วยรายการจัดส่งหลายรายการ สินค้า (ID ของเรกคอร์ดคือ ID สินค้า ชื่อ หมายเลขรุ่น) อยู่ในรายการจัดส่งหลายรายการ รายการจัดส่งอยู่ระหว่างทั้งสอง: มี ID ของเรกคอร์ดของตัวเอง คือ ID รายการจัดส่ง และเก็บ ID การจัดส่งและ ID สินค้าของแม่ทั้งสอง พร้อมจำนวน หมายเหตุด้านล่าง: ID การจัดส่งบวก ID สินค้าเป็นกฎเรื่องความไม่ซ้ำ ไม่ใช่ ID ของเรกคอร์ด ข้อมูลธุรกรรม ข้อมูลอ้างอิง ประกอบด้วย อยู่ใน การจัดส่ง ID การจัดส่ง ID ของเรกคอร์ด วันที่จัดส่ง สถานะ รายการจัดส่ง ID รายการจัดส่ง ID ของเรกคอร์ด ID การจัดส่ง ID สินค้า จำนวน สินค้า ID สินค้า ID ของเรกคอร์ด ชื่อ หมายเลขรุ่น ID การจัดส่ง + ID สินค้า: เป็นกฎเรื่องความไม่ซ้ำ ไม่ใช่ ID ของเรกคอร์ด หนึ่ง หลาย © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

สังเกตสิ่งที่ไม่มีอยู่บนมัน: หมายเลขซีเรียล จำนวนกับหมายเลขซีเรียลไม่ควรอยู่บนเรกคอร์ดเดียวกัน จำนวนนับสิ่งของหลายชิ้น หมายเลขซีเรียลระบุสิ่งของชิ้นหนึ่งโดยเฉพาะ ถ้าธุรกิจต้องการหมายเลขซีเรียล แต่ละชิ้นก็จะเป็นเรกคอร์ดของตัวเอง ตู้เย็นห้าเครื่องคือห้าเรกคอร์ด ผมนึกไม่ออกว่าจะมีกรณีไหนที่ต้องมีรายการจัดส่งพร้อม Delivery Item Detail อยู่ข้างใต้ มันต้องเป็นอย่างใดอย่างหนึ่ง: แบบรวมยอดที่มีจำนวน หรือหนึ่งเรกคอร์ดต่อหนึ่งชิ้น ในที่นี้ คือจำนวน

จับตาแอตทริบิวต์ที่ต้องการประวัติ เอนทิตีความสัมพันธ์บางตัวลงตัวทันทีที่ถูกสร้าง: เครื่องซักผ้าในการจัดส่งนี้ก็ยังเป็นเครื่องซักผ้าในการจัดส่งนี้ ตัวอื่นเปลี่ยนไปเรื่อยๆ ทีมหนึ่งได้รถคันที่ 117 สัปดาห์นี้ และสัปดาห์หน้ารถคันนั้นไปอยู่กับทีมอื่น เมื่อความสัมพันธ์เปลี่ยนและธุรกิจสนใจว่ามันเคยเป็นอย่างไร เอนทิตีความสัมพันธ์ก็ต้องมีวันที่ และการมอบหมายทีมคือตัวที่ต้องจับตา ถามตั้งแต่เนิ่นๆ ว่าธุรกิจสนใจตอนนี้ หรือตลอดช่วงเวลา เดี๋ยวเราจะกลับมาเรื่องนี้

“หนึ่งต่อหลาย” ไม่พอที่จะเข้าใจความสัมพันธ์ ผมยังอยากรู้ว่าความสัมพันธ์นั้นหมายถึงอะไร

การจัดส่งมีสถานที่ สถานที่ไหน? ศูนย์กระจายสินค้าที่ออกเดินทาง? บ้านของผู้รับที่ไปถึง? สองอย่างนั้นใช้แทนกันไม่ได้ สองโมเดลอาจมีกล่องเหมือนกันทุกกล่องและ cardinality เหมือนกัน แต่เส้นอาจมีความหมายต่างกันโดยสิ้นเชิง นั่นคือเหตุผลที่โมเดลที่ดีไม่ใช่แค่กล่องที่เชื่อมด้วยเส้น เส้นต้องมีชื่อ ถ้าผมส่งไดอะแกรมให้สถาปนิกอีกคน เขาไม่ควรต้องเดาว่าความสัมพันธ์หมายถึงอะไร และถ้าผมแสดงให้ฝ่ายธุรกิจดู มันควรใช้ภาษาที่พวกเขาคุ้นเคย

เส้นต้องมีชื่อ สองแผง แต่ละแผงมีกล่องสถานที่อยู่เหนือกล่องการจัดส่ง เชื่อมกันด้วยสองเส้น แต่ละเส้นทำเครื่องหมายว่าสถานที่หนึ่งแห่งต่อการจัดส่งหลายรายการ ในแผงซ้าย “เส้นไม่มีชื่อ” สองเส้นไม่มีป้ายกำกับและดูเหมือนกันทุกอย่าง ในแผงขวา “เส้นที่มีชื่อ” เส้นหนึ่งมีป้าย “ออกจาก” และอีกเส้นมีป้าย “จัดส่งไปที่” กล่องเหมือนกัน cardinality เหมือนกัน: มีแค่ชื่อที่บอกว่าเส้นไหนคือเส้นไหน เส้นไม่มีชื่อ เส้นที่มีชื่อ ออกจาก จัดส่งไปที่ สถานที่ การจัดส่ง สถานที่ การจัดส่ง กล่องเหมือนกัน cardinality เหมือนกัน มีแค่ชื่อที่บอกว่าเส้นไหนคือเส้นไหน © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

มีอีกคำถามหนึ่งซ่อนอยู่ใน “มีกี่อัน?”: ความสัมพันธ์นี้บังคับหรือไม่? การจัดส่งมีอยู่ได้ก่อนถูกจัดลงเส้นทางไหม? ต้องมีได้: ใบรายการสินค้ามาถึงหนึ่งหรือสองวันก่อนการจัดส่ง และเส้นทางถูกสรุปในเย็นวันก่อน การจัดส่งมีอยู่ได้โดยไม่มีพันธมิตรค้าปลีกไหม? ไม่ได้ ทุกการจัดส่งมาจากใบรายการสินค้าของพันธมิตร นั่นคือความเป็นทางเลือก (optionality)

อีกครั้ง อย่ากระโดดไปที่ช่อง Required ของ Salesforce ทันที การพูดว่า “ทุกการจัดส่งต้องมีพันธมิตรค้าปลีก” ต่างจากการพูดว่า “Salesforce ควรบังคับฟิลด์พันธมิตรค้าปลีกเมื่อสร้างเรกคอร์ด” อาจลงเอยเป็นการ implement แบบเดียวกัน แต่ไม่ใช่ข้อความเดียวกัน ข้อแรกเป็นกฎทางธุรกิจ ข้อที่สองเป็นวิธีหนึ่งในการบังคับใช้ ในฐานะสถาปนิก เราอยากเข้าใจข้อแรกก่อนตัดสินใจข้อที่สอง

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

อ่านเครื่องหมายทั้งสองที่แต่ละปลาย กล่องสามกล่องเรียงกัน: ใบรายการสินค้า การจัดส่ง จุดแวะ ใบรายการสินค้าระบุการจัดส่งหนึ่งหรือหลายรายการ และการจัดส่งแต่ละรายการอยู่บนใบรายการสินค้าหนึ่งใบพอดี: สองขีดที่ปลายฝั่งใบรายการสินค้า ตีนกาและขีดที่ปลายฝั่งการจัดส่ง จุดแวะส่งของของการจัดส่งศูนย์หรือหลายรายการ และการจัดส่งแต่ละรายการอยู่ที่จุดแวะศูนย์หรือหนึ่งจุด: วงกลมและตีนกาที่ปลายฝั่งการจัดส่ง วงกลมและขีดที่ปลายฝั่งจุดแวะ ใกล้กล่องที่สุดคือจำนวนมากที่สุด เครื่องหมายถัดออกมาคือจำนวนน้อยที่สุด ใบรายการสินค้า หนึ่งรายการพอดี การจัดส่ง หนึ่งหรือหลายรายการ ระบุ จุดแวะ ศูนย์หรือหนึ่งรายการ การจัดส่ง ศูนย์หรือหลายรายการ ส่งของ ใบรายการสินค้า การจัดส่ง จุดแวะ ใกล้กล่องที่สุด: จำนวนมากที่สุด (หนึ่ง หรือหลาย) เครื่องหมายถัดออกมา: จำนวนน้อยที่สุด (ขีดคืออย่างน้อยหนึ่ง วงกลมคือศูนย์) © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

นี่คือคำถามที่ผมถามบ่อย: คุณหมายถึงตอนนี้ หรือตลอดช่วงเวลา?

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

การมอบหมายทีม: ทีมไหนมีรถคันไหน แม่สองและลูกหนึ่ง ทีมจัดส่ง (ID ของเรกคอร์ดคือ ID ทีมจัดส่ง ชื่อ สถานะ) ทำงานในการมอบหมายทีมหลายรายการ รถบรรทุก (ID ของเรกคอร์ดคือ ID รถบรรทุก เรียกได้ด้วยหมายเลขประจำคัน ยี่ห้อ รุ่น สถานะ) ถูกใช้ในการมอบหมายทีมหลายรายการ การมอบหมายทีมแต่ละรายการมี ID ของเรกคอร์ดของตัวเอง และเก็บ ID ทีมจัดส่งและ ID รถบรรทุก โดยไม่มีวันที่ หมายเหตุด้านล่าง: ทีมไหนมีรถคันไหน แต่ไม่ได้บอกว่าตั้งแต่เมื่อไร ทำงานใน ใช้ใน ทีมจัดส่ง ID ทีมจัดส่ง ID ของเรกคอร์ด ชื่อ สถานะ การมอบหมายทีม ID การมอบหมายทีม ID ของเรกคอร์ด ID ทีมจัดส่ง ID รถบรรทุก รถบรรทุก ID รถบรรทุก ID ของเรกคอร์ด หมายเลขประจำคัน หรือเรียกว่า ยี่ห้อ รุ่น สถานะ ทีมไหนมีรถคันไหน แต่ไม่ได้บอกว่าตั้งแต่เมื่อไร หนึ่ง หลาย © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

นี่เป็นต้นเหตุทั่วไปของความผิดพลาดในการสร้างโมเดล เราสร้างโมเดลของสถานะปัจจุบันเพราะนั่นคือสิ่งที่เราเห็นบนหน้าจอ แล้วหลายสัปดาห์ต่อมา พันธมิตรค้าปลีกยื่นเรื่องเคลมความเสียหาย และมีคนถามว่า “ทีมไหนใช้รถคันที่ 117 ในวันที่ 17 มีนาคม?” แล้วเราก็พบว่าเราเขียนทับคำตอบทุกครั้งที่การมอบหมายเปลี่ยน

วิธีหนึ่งในการเก็บประวัตินั้นคือทำให้การมอบหมายเป็นเรกคอร์ดของตัวเอง เมื่อทีมได้รับมอบหมาย เราสร้างการมอบหมายทีมพร้อมวันที่เริ่มต้น เมื่อการมอบหมายเปลี่ยน เราใส่วันที่สิ้นสุดในเรกคอร์ดเก่าและสร้างเรกคอร์ดใหม่พร้อมวันที่เริ่มต้นของมันเอง ตอนนี้ “ใครได้รับการมอบหมายนั้นเมื่อหกเดือนก่อน?” ก็เป็นคำถามที่ตอบได้ง่าย แทนที่จะต้องขุดผ่าน field history หรือล็อกการเปลี่ยนแปลงข้อมูล และเมื่อทีมหนึ่งมีการมอบหมายมากมาย ก็จะมีคนถามว่าอันไหนคืออันปัจจุบัน ผมจึงเพิ่มแฟล็ก Active ด้วย

การมอบหมายทีมตามเวลา: วันที่และแฟล็ก Active แม่สองและลูกหนึ่ง พร้อมวันที่ ทีมจัดส่ง (ID ของเรกคอร์ดคือ ID ทีมจัดส่ง ชื่อ สถานะ) ทำงานในการมอบหมายทีมหลายรายการ รถบรรทุก (ID ของเรกคอร์ดคือ ID รถบรรทุก เรียกได้ด้วยหมายเลขประจำคัน ยี่ห้อ รุ่น สถานะ) ถูกใช้ในการมอบหมายทีมหลายรายการ การมอบหมายทีมแต่ละรายการมี ID ของเรกคอร์ดของตัวเอง และเก็บ ID ทีมจัดส่งและ ID รถบรรทุก วันที่เริ่มต้น วันที่สิ้นสุด และแฟล็ก Active หมายเหตุด้านล่าง: ทุกการเปลี่ยนแปลงปิดการมอบหมายหนึ่งและเริ่มรายการถัดไป และ Active บอกว่ารายการไหนคือปัจจุบัน ทำงานใน ใช้ใน ทีมจัดส่ง ID ทีมจัดส่ง ID ของเรกคอร์ด ชื่อ สถานะ การมอบหมายทีม ID การมอบหมายทีม ID ของเรกคอร์ด ID ทีมจัดส่ง ID รถบรรทุก วันที่เริ่มต้น วันที่สิ้นสุด Active รถบรรทุก ID รถบรรทุก ID ของเรกคอร์ด หมายเลขประจำคัน หรือเรียกว่า ยี่ห้อ รุ่น สถานะ ทุกการเปลี่ยนแปลงปิดการมอบหมายหนึ่ง และเริ่มรายการถัดไป Active บอกว่ารายการไหนคือปัจจุบัน หนึ่ง หลาย © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

ดังนั้นเมื่อมีคนเล่าให้ผมฟังเรื่องความสัมพันธ์ ผมไม่ได้ถามแค่ว่าสิ่งต่างๆ สัมพันธ์กันอย่างไร ผมถามว่า: ความสัมพันธ์นั้นเปลี่ยนไหม และเราสนใจประวัติของมันหรือไม่?

โมเดล Steve Trucking ของเราเริ่มมีประโยชน์ เรารู้ว่าความสัมพันธ์ไหนเป็นหนึ่งต่อหลาย ตรงไหนที่ความสัมพันธ์หลายต่อหลายซ่อนแนวคิดอีกอย่างไว้ ความสัมพันธ์ไหนเป็นทางเลือก และอันไหนเปลี่ยนไปตามเวลา และเรายังไม่ได้สร้างออบเจกต์ Salesforce สักตัว นั่นเป็นความตั้งใจ

โมเดลเชิงแนวคิดหลังโมดูลที่ 1 และ 2 โมเดลเชิงแนวคิดของ Steve Trucking จัดกลุ่มเป็นข้อมูลลูกค้า ข้อมูลธุรกรรม และข้อมูลอ้างอิง พันธมิตรค้าปลีกส่งใบรายการสินค้าที่ระบุการจัดส่ง และดำเนินงานศูนย์กระจายสินค้า การจัดส่งแต่ละรายการออกจากศูนย์กระจายสินค้า ไปที่ผู้รับ และประกอบด้วยรายการจัดส่ง เส้นทางมีจุดแวะที่ส่งของของการจัดส่ง การมอบหมายทีมเชื่อมทีมจัดส่งและรถบรรทุกเข้ากับเส้นทาง โมเดลจึงเก็บไว้ว่าใครขับรถคันไหน และเมื่อไร ข้อมูลลูกค้า ข้อมูลธุรกรรม ข้อมูลอ้างอิง ดำเนินงาน ส่ง ระบุ ประกอบด้วย ออกจาก จัดส่งไปที่ มี ส่งของ วิ่ง ทำงานใน ใช้ใน พันธมิตรค้าปลีก ร้านค้าปลีกที่เราจัดส่งให้ ผู้รับ ผู้ที่รับของ ใบรายการสินค้า รายการจัดส่ง ของพันธมิตร การจัดส่ง คำสั่งซื้อหนึ่งรายการ ถึงผู้รับหนึ่งคน รายการจัดส่ง ของที่อยู่บนรถ เส้นทาง จุดแวะในรอบวิ่ง หนึ่งวัน จุดแวะ ที่อยู่หนึ่งแห่ง บนเส้นทาง การมอบหมายทีม ใครขับรถคันไหน เมื่อไร ศูนย์กระจายสินค้า จุดที่การจัดส่ง ออกเดินทาง ทีมจัดส่ง สองคน รถบรรทุก ยานพาหนะ หนึ่งพอดี ศูนย์หรือหนึ่ง หนึ่งหรือหลาย ศูนย์หรือหลาย © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

ไดอะแกรมนี้ควรเป็นสิ่งที่ผมวางตรงหน้าฝ่ายธุรกิจได้ และพวกเขาไม่ควรต้องรู้จัก Salesforce เพื่อบอกผมว่ามันถูกหรือไม่ ถ้าพวกเขายืนยันมันไม่ได้เพราะเต็มไปด้วยศัพท์ Salesforce ผมก็ขยับเข้าสู่การออกแบบเชิงกายภาพเร็วเกินไป

เมื่อผมไล่ดูความสัมพันธ์ในโมเดลเชิงแนวคิด ผมกำลังตัดสินใจว่า:

  • เอนทิตีทางธุรกิจหลักสัมพันธ์กันอย่างไร
  • แต่ละความสัมพันธ์เป็นหนึ่งต่อหนึ่ง หนึ่งต่อหลาย หรือหลายต่อหลาย ทั้งตอนนี้และตลอดช่วงเวลา
  • แต่ละความสัมพันธ์บังคับหรือเป็นทางเลือก
  • ความสัมพันธ์แบบหลายต่อหลายซ่อนแนวคิดทางธุรกิจที่มีความหมายไว้หรือไม่
  • ความสัมพันธ์เปลี่ยนไปตามเวลาหรือไม่ และเราต้องการประวัติของมันหรือไม่

lookup หรือ master-detail การตั้งค่า junction พฤติกรรมการลบต่อเนื่อง และการแชร์ เป็นการตัดสินใจเชิงกายภาพ เราจะไปถึง ตอนนี้เรายังตอบคำถามที่สำคัญกว่าอยู่: ธุรกิจนี้ทำงานอย่างไรจริงๆ? เมื่อเราเข้าใจเอนทิตีและความสัมพันธ์ระหว่างกันแล้ว เราก็เริ่มเพิ่มรายละเอียดที่อธิบายพวกมันได้ นั่นคือตอนที่โมเดลเชิงแนวคิดเริ่มกลายเป็นโมเดลข้อมูลเชิงตรรกะ