การสร้างแบบจำลอง ER และคาร์ดินาลิตีของความสัมพันธ์
แปลงข้อกำหนดให้เป็นเอนทิตี ความสัมพันธ์ และตารางเชื่อม
การสร้างแบบจำลอง ER และคาร์ดินาลิตีของความสัมพันธ์ เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดการสร้างแบบจำลอง ER จึงเป็นหัวข้อในการสัมภาษณ์
หลังจากเรียนรู้การทำให้เป็นบรรทัดฐานแล้ว ผู้สัมภาษณ์จะทดสอบว่าคุณสามารถ เปลี่ยนข้อกำหนดให้เป็นแบบแผนโครงสร้างฐานข้อมูล ได้หรือไม่ คำถามมักเปิดกว้าง เช่น "ออกแบบฐานข้อมูลสำหรับแอปเรียกรถร่วมกัน" หรือ "สร้างแบบจำลองระบบห้องสมุด"
นี่คือแบบฝึกหัดการสร้างแบบจำลองเอนทิตี-ความสัมพันธ์ (ER) ผู้สัมภาษณ์กำลังดูว่าคุณระบุเอนทิตี แอตทริบิวต์ และความสัมพันธ์ระหว่างเอนทิตีเหล่านั้น รวมถึง คาร์ดินาลิตี ได้อย่างไร
ทักษะสำคัญคือการเปลี่ยนคำนามและคำกริยาในภาษาทั่วไปให้เป็นตารางและคีย์ต่างประเทศ
เอนทิตี แอตทริบิวต์ และความสัมพันธ์
องค์ประกอบพื้นฐานสามประการประกอบกันเป็นแบบจำลอง ER ทุกแบบ:
- เอนทิตี: สิ่งที่คุณจัดเก็บข้อมูลเกี่ยวกับสิ่งนั้น (ลูกค้า คำสั่งซื้อ ผลิตภัณฑ์) โดยปกติจะกลายเป็นตาราง
- แอตทริบิวต์: คุณสมบัติของเอนทิตี (ชื่อ ราคา เวลาที่สร้าง) โดยปกติจะกลายเป็นคอลัมน์
- ความสัมพันธ์: วิธีที่เอนทิตีเชื่อมโยงกัน (ลูกค้า สร้างคำสั่งซื้อ) ซึ่งนำไปใช้ด้วยคีย์ต่างประเทศหรือตารางเชื่อมโยง
เคล็ดลับจากคำถาม: คำนามกลายเป็นเอนทิตีหรือแอตทริบิวต์ ส่วนคำกริยากลายเป็นความสัมพันธ์
คาร์ดินาลิตี: แนวคิดหลัก
คาร์ดินาลิตีอธิบายว่ามีอินสแตนซ์ของเอนทิตีหนึ่งกี่รายการที่สัมพันธ์กับอีกเอนทิตีหนึ่ง โดยแบ่งได้เป็นสามกลุ่ม:
- หนึ่งต่อหนึ่ง (1:1): แถวหนึ่งในฝั่งนี้ตรงกับแถวในอีกฝั่งได้ไม่เกินหนึ่งแถว
- หนึ่งต่อหลาย (1:N): แถวหนึ่งในฝั่งนี้ตรงกับหลายแถวในอีกฝั่ง (เป็นกรณีที่พบบ่อยที่สุด)
- หลายต่อหลาย (M:N): แถวในทั้งสองฝั่งต่างก็ตรงกับหลายแถวในอีกฝั่ง
การกำหนดคาร์ดินาลิตีให้ถูกต้องจะเป็นตัวกำหนดว่าจะวางคีย์ต่างประเทศไว้ที่ใด และจำเป็นต้องมีตารางเชื่อมโยงหรือไม่
การนำความสัมพันธ์หนึ่งต่อหลายไปใช้
ความสัมพันธ์หนึ่งต่อหลายนำไปใช้โดยวาง คีย์ต่างประเทศไว้ที่ฝั่ง "หลาย" ลูกค้าหนึ่งรายมีคำสั่งซื้อหลายรายการ ดังนั้นแถวของคำสั่งซื้อแต่ละแถวจึงมี customer_id
ในการสัมภาษณ์ ควรระบุทิศทางให้ชัดเจนเสมอ: "ลูกค้าหนึ่งรายต่อคำสั่งซื้อหลายรายการ ดังนั้น FK จึงอยู่ในตารางคำสั่งซื้อ"
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT NOT NULL,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);การนำความสัมพันธ์หลายต่อหลายไปใช้
ฐานข้อมูลเชิงสัมพันธ์ไม่สามารถจัดเก็บความสัมพันธ์ M:N ได้โดยตรง คำตอบที่ผู้สัมภาษณ์ต้องการคือ ตารางเชื่อมโยง (เรียกอีกอย่างว่าตารางสะพาน ตารางเชื่อม หรือตารางเชื่อมโยง)
นักเรียนลงทะเบียนเรียนได้หลายรายวิชา และแต่ละรายวิชามีนักเรียนหลายคน ให้สร้างตาราง enrollments ซึ่งมีคีย์ประกอบด้วยคีย์ต่างประเทศทั้งสองตัว วิธีนี้จะแปลงความสัมพันธ์ M:N ให้เป็นความสัมพันธ์หนึ่งต่อหลายสองความสัมพันธ์
CREATE TABLE students (
student_id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE courses (
course_id INT PRIMARY KEY,
title VARCHAR(100)
);
CREATE TABLE enrollments (
student_id INT,
course_id INT,
enrolled_at DATE,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(student_id),
FOREIGN KEY (course_id) REFERENCES courses(course_id)
);ตารางเชื่อมโยงสามารถเก็บข้อมูลได้
คำถามต่อยอดที่พบบ่อยคือ: "คุณจะเก็บผลการเรียนที่นักเรียนได้รับจากรายวิชาไว้ที่ใด"
ผลการเรียนเป็นของ ความสัมพันธ์ ไม่ใช่ของนักเรียนหรือรายวิชาเพียงอย่างใดอย่างหนึ่ง ดังนั้นจึงควรเก็บไว้ในตารางเชื่อมโยง นี่คือประเด็นที่ผู้สัมภาษณ์ต้องการตรวจสอบ: แอตทริบิวต์ของความสัมพันธ์ M:N ควรอยู่บนตารางสะพาน
ตัวอย่างเช่น วันที่ลงทะเบียนเรียน ผลการเรียน จำนวนในรายการคำสั่งซื้อ และบทบาทในการเป็นสมาชิกโครงการ
ALTER TABLE enrollments
ADD COLUMN grade CHAR(2);
-- grade describes THIS student in THIS course,
-- so it belongs on the junction tableการนำความสัมพันธ์หนึ่งต่อหนึ่งไปใช้
ความสัมพันธ์ 1:1 พบได้น้อยกว่า โดยนำไปใช้ด้วยการให้ตารางที่ขึ้นต่อมีคีย์ต่างประเทศซึ่งเป็น คีย์ไม่ซ้ำ ด้วย (มักเป็นคีย์หลักของตารางนั้นเอง)
ตัวอย่างเช่น user และ user_profile ซึ่งมีรายละเอียดเพิ่มเติมที่อาจมีหรือไม่มีก็ได้ การกำหนดให้ user_id เป็นคีย์หลักของตารางข้อมูลประวัติจะบังคับให้ผู้ใช้แต่ละคนมีข้อมูลประวัติได้ไม่เกินหนึ่งรายการ
CREATE TABLE users (
user_id INT PRIMARY KEY,
email VARCHAR(255)
);
CREATE TABLE user_profiles (
user_id INT PRIMARY KEY, -- 1:1 enforced here
bio TEXT,
avatar_url VARCHAR(255),
FOREIGN KEY (user_id) REFERENCES users(user_id)
);ความเป็นทางเลือกและการมีส่วนร่วม
คาร์ดินาลิตีมีอีกมิติหนึ่งที่ผู้สัมภาษณ์ให้ความสำคัญ นั่นคือ ความเป็นทางเลือก (เรียกอีกอย่างว่าการมีส่วนร่วม)
- จำเป็น: คำสั่งซื้อทุกคำสั่งต้องมีลูกค้า ดังนั้น
customer_idจึงเป็นNOT NULL - เป็นทางเลือก: ผู้ใช้อาจมีหรือไม่มีข้อมูลประวัติก็ได้ ดังนั้นความสัมพันธ์นี้จึงอาจไม่มีอยู่
คุณแสดงการมีส่วนร่วมที่จำเป็นด้วย NOT NULL บนคีย์ต่างประเทศ การกล่าวถึงการยอมให้เป็น NULL แสดงว่าคุณคำนึงถึงข้อจำกัดในโลกจริง ไม่ใช่เพียงโครงสร้างเท่านั้น
ความสัมพันธ์ที่อ้างอิงตัวเอง
ความสัมพันธ์บางอย่างเชื่อมเอนทิตีเข้ากับตัวมันเอง พนักงานมีผู้จัดการซึ่งก็เป็นพนักงานเช่นกัน และหมวดหมู่หนึ่งมีหมวดหมู่แม่
คุณสร้างแบบจำลองกรณีนี้ด้วยคีย์ต่างประเทศที่อ้างอิงถึง ตารางเดียวกัน ผู้สัมภาษณ์คาดหวังให้คุณนึกถึงกรณีนี้เมื่อออกแบบแผนผังองค์กรและโครงสร้างต้นไม้ และแนวคิดนี้ก็เข้าคู่กันได้อย่างเป็นธรรมชาติกับการเชื่อมตารางกับตัวเองและนิพจน์ตารางร่วมแบบเรียกซ้ำ
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(100),
manager_id INT NULL,
FOREIGN KEY (manager_id) REFERENCES employees(employee_id)
);
-- manager_id NULL = top of the hierarchy (e.g. CEO)ตัวอย่างการสร้างแบบจำลองขนาดย่อม
ฝึกใช้วิธีเปลี่ยนคำกริยาเป็นความสัมพันธ์ คำถามคือ: "ลูกค้าสร้างคำสั่งซื้อ แต่ละคำสั่งซื้อมีผลิตภัณฑ์หลายรายการ และผลิตภัณฑ์แต่ละรายการมาจากผู้จัดหา"
- ลูกค้า 1:N คำสั่งซื้อ (FK รหัสลูกค้าในตารางคำสั่งซื้อ)
- คำสั่งซื้อ M:N ผลิตภัณฑ์ -> ตารางเชื่อมโยง
order_items(พร้อมจำนวน) - ผู้จัดหา 1:N ผลิตภัณฑ์ (FK รหัสผู้จัดหาในตารางผลิตภัณฑ์)
ระบุคาร์ดินาลิตีแต่ละรายการและตำแหน่งของคีย์ การอธิบายเช่นนี้คือจุดชนะในการสัมภาษณ์
คำถามเพื่อขอความชัดเจน
ผู้สัมภาษณ์ให้คะแนนผู้สมัครที่ถามคำถามก่อนเริ่มออกแบบ คำถามเพื่อขอความชัดเจนที่ดี ได้แก่:
- "ผลิตภัณฑ์หนึ่งรายการมาจากผู้จัดหาได้มากกว่าหนึ่งรายหรือไม่" (ใช้ตัดสินใจระหว่างหนึ่งต่อหลายกับหลายต่อหลาย)
- "คำสั่งซื้อทุกคำสั่งต้องมีรายการอย่างน้อยหนึ่งรายการหรือไม่" (การมีส่วนร่วม)
- "เราต้องการประวัติ หรือเพียงสถานะปัจจุบันเท่านั้น" (เป็นปัจจัยให้ต้องสร้างตารางเพิ่มเติม)
คำตอบเหล่านี้เปลี่ยนทั้งคาร์ดินาลิตีและจำนวนตาราง ดังนั้นอย่าตั้งสมมติฐานเอง การถามคำถามแสดงถึงประสบการณ์ในระดับสูง
ตรวจสอบความเข้าใจ
คุณกำลังสร้างแบบจำลองนักเรียนและรายวิชา โดยนักเรียนแต่ละคนสามารถลงทะเบียนเรียนได้หลายรายวิชา และแต่ละรายวิชามีนักเรียนได้หลายคน
สรุปทบทวน: การสร้างแบบจำลอง ER และคาร์ดินัลลิตี
ตอนนี้คุณสามารถรับมือกับคำถามการออกแบบสคีมาแบบปลายเปิดได้แล้ว:
- เปลี่ยน คำนามให้เป็นเอนทิตี/แอตทริบิวต์ และคำกริยาให้เป็นความสัมพันธ์
- 1:N: ใส่คีย์ต่างประเทศไว้ที่ฝั่งที่มีหลายรายการ
- M:N: ใช้ตารางเชื่อมที่เก็บคีย์ต่างประเทศทั้งสองฝั่ง รวมถึงแอตทริบิวต์ของความสัมพันธ์ (ถ้ามี)
- 1:1: ใช้คีย์ร่วมกันหรือคีย์ไม่ซ้ำกันในตารางที่ขึ้นต่อกัน
- ใช้
NOT NULLเพื่อแสดงการมีส่วนร่วมที่จำเป็น และใช้คีย์ต่างประเทศที่อ้างอิงตนเองสำหรับโครงสร้างลำดับชั้น - ถามคำถามเพื่อขอความชัดเจนก่อนตัดสินคาร์ดินัลลิตี
คำถามที่พบบ่อย
บทเรียน “การสร้างแบบจำลอง ER และคาร์ดินาลิตีของความสัมพันธ์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างแบบจำลอง ER และคาร์ดินาลิตีของความสัมพันธ์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างแบบจำลอง ER และคาร์ดินาลิตีของความสัมพันธ์”
แปลงข้อกำหนดให้เป็นเอนทิตี ความสัมพันธ์ และตารางเชื่อม คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้างแบบจำลอง ER และคาร์ดินาลิตีของความสัมพันธ์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม
ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การทำให้เป็นบรรทัดฐานจนถึง 3NF
- การสร้างแบบจำลอง ER และคาร์ดินาลิตีของความสัมพันธ์
- สคีมาแบบดาวและการออกแบบคลังข้อมูล
- ชุดโจทย์สัมภาษณ์จำลองฉบับเต็ม