0Pricing
Coding Interview Prep · บทเรียน

การสร้างแบบจำลอง 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การทำให้เป็นบรรทัดฐานจนถึง 3NF
  2. การสร้างแบบจำลอง ER และคาร์ดินาลิตีของความสัมพันธ์
  3. สคีมาแบบดาวและการออกแบบคลังข้อมูล
  4. ชุดโจทย์สัมภาษณ์จำลองฉบับเต็ม
← กลับไปที่ Coding Interview Prep