SQL
-- 1. สร้างตารางเอนทิตี้หลัก (Entities) 1:N และ 1:N<br>CREATE TABLE students (<br> student_id SERIAL PRIMARY KEY,<br> student_name VARCHAR(100) NOT NULL<br>);<br><br>CREATE TABLE courses (<br> course_id SERIAL PRIMARY KEY,<br> course_name VARCHAR(100) NOT NULL<br>);<br><br>-- 2. สร้าง Junction Table (Enrollments) สำหรับ M:N<br>CREATE TABLE enrollments (<br> student_id INTEGER REFERENCES students(student_id) ON DELETE CASCADE,<br> course_id INTEGER REFERENCES courses(course_id) ON DELETE CASCADE,<br> enrollment_date DATE NOT NULL,<br> PRIMARY KEY (student_id, course_id)<br>);
ในโค้ดข้างต้น enrollments คือ Junction Table ที่ใช้ (student_id, course_id) เป็น Composite Primary Key เพื่อรับประกันว่านักเรียนคนหนึ่งจะไม่ลงทะเบียนในวิชาเดียวกันซ้ำสองครั้ง
การ Query ข้อมูลความสัมพันธ์ (JOIN)
“>การดึงข้อมูลที่เกี่ยวข้องทั้งหมดจำเป็นต้องใช้คำสั่ง JOIN เพื่อเชื่อมโยงข้อมูลจากตารางหลักผ่าน Junction Table เสมือนการเดินทางของข้อมูล:
SQL
SELECT<br> s.student_name, c.course_name,<br> e.enrollment_date<br>FROM students s<br>JOIN enrollments e ON s.student_id = e.student_id<br>JOIN courses c ON e.course_id = c.course_id<br>WHERE s.student_name = 'Alice' AND c.course_name = 'Database Design';
คำสั่งนี้จะดึงข้อมูลที่เชื่อมโยงกันอย่างถูกต้อง โดยใช้ Foreign Key เป็นสะพานเชื่อม ทำให้มั่นใจได้ว่าข้อมูลที่ได้มานั้นเป็นความสัมพันธ์ที่สมบูรณ์ตามหลักการออกแบบสถาปัตยกรรมระบบ
บทสรุป
“>การทำความเข้าใจและนำแนวคิด Association ไปใช้ในการออกแบบ Junction Table สำหรับความสัมพันธ์แบบ Many-to-Many ใน PostgreSQL ไม่ใช่แค่การเขียนโค้ด แต่เป็นการคิดเชิงสถาปัตยกรรมที่สำคัญที่สุดอย่างหนึ่ง การจัดการความสัมพันธ์ที่ถูกต้องนี้จะช่วยให้ฐานข้อมูลของเรามีความสมบูรณ์ (Integrity) มีความยืดหยุ่น และพร้อมรองรับการขยายตัวของระบบขนาดใหญ่ได้อย่างมีประสิทธิภาพ
“>ในฐานะสถาปนิกระบบข้อมูล (System Architect) เราทราบดีว่าการออกแบบฐานข้อมูลที่มีประสิทธิภาพไม่ได้วัดกันที่ความเร็วในการ Query เพียงอย่างเดียว แต่รวมถึงความสามารถในการจัดการความสัมพันธ์ที่ซับซ้อนระหว่างชุดข้อมูลต่างๆ ด้วยแนวคิดเรื่อง ‘Association’ หรือความสัมพันธ์ทางข้อมูล คือหัวใจสำคัญของการสร้าง Schema ที่แข็งแกร่งและยืดหยุ่น
“>ในโลกของฐานข้อมูลเชิงสัมพันธ์ (Relational Database) ความสัมพันธ์เหล่านี้จะถูกนำมาใช้เพื่อเชื่อมโยงเอนทิตี้ (Entities) ต่างๆ เข้าด้วยกัน หากเราไม่เข้าใจหลักการนี้ การดึงข้อมูลที่ครบถ้วนและถูกต้องตามบริบททางธุรกิจจะเป็นไปได้ยาก บทความนี้จะเจาะลึกถึงวิธีการจัดการความสัมพันธ์แบบ Many-to-Many (M:N) ใน PostgreSQL ซึ่งเป็นรูปแบบความสัมพันธ์ที่พบบ่อยที่สุดในการออกแบบระบบขนาดใหญ่
หลักการของ Association และ Junction Table
“>ความสัมพันธ์ระหว่างข้อมูลมีหลายประเภท เช่น One-to-One (1:1) หรือ One-to-Many (1:N) แต่เมื่อเราพบกับสถานการณ์ที่เอนทิตี้ A สามารถมีความสัมพันธ์กับเอนทิตี้ B ได้มากกว่าหนึ่งครั้ง และในทางกลับกัน เอนทิตี้ B ก็สามารถมีความสัมพันธ์กับเอนทิตี้ A ได้มากกว่าหนึ่งครั้ง นั่นคือความสัมพันธ์แบบ Many-to-Many (M:N) ซึ่งไม่สามารถเก็บความสัมพันธ์นี้ได้โดยตรงในตารางใดตารางหนึ่ง
“>ทางแก้ปัญหาในระดับสถาปัตยกรรมระบบคือการใช้ตารางตัวกลาง (Junction Table หรือ Linking Table) เพื่อทำหน้าที่เป็นตัวเชื่อมความสัมพันธ์นี้ ตารางนี้จะเก็บ Primary Key ของเอนทิตี้ทั้งสองฝ่าย และรวมกันเป็น Composite Primary Key เพื่อรับประกันความสมบูรณ์ของข้อมูล (Data Integrity) เสมอ
การสร้าง M:N Schema ด้วย PostgreSQL
“>สมมติว่าเรามีระบบที่ต้องการเชื่อมโยง ‘นักเรียน’ (Students) กับ ‘วิชาเรียน’ (Courses) ซึ่งนักเรียนหนึ่งคนสามารถลงทะเบียนได้หลายวิชา และวิชาเรียนหนึ่งวิชาก็มีนักเรียนลงทะเบียนได้หลายคน เราต้องใช้ Junction Table ชื่อว่า enrollments
SQL
-- 1. สร้างตารางเอนทิตี้หลัก (Entities) 1:N และ 1:N<br>CREATE TABLE students (<br> student_id SERIAL PRIMARY KEY,<br> student_name VARCHAR(100) NOT NULL<br>);<br><br>CREATE TABLE courses (<br> course_id SERIAL PRIMARY KEY,<br> course_name VARCHAR(100) NOT NULL<br>);<br><br>-- 2. สร้าง Junction Table (Enrollments) สำหรับ M:N<br>CREATE TABLE enrollments (<br> student_id INTEGER REFERENCES students(student_id) ON DELETE CASCADE,<br> course_id INTEGER REFERENCES courses(course_id) ON DELETE CASCADE,<br> enrollment_date DATE NOT NULL,<br> PRIMARY KEY (student_id, course_id)<br>);“>
ในโค้ดข้างต้น enrollments คือ Junction Table ที่ใช้ (student_id, course_id) เป็น Composite Primary Key เพื่อรับประกันว่านักเรียนคนหนึ่งจะไม่ลงทะเบียนในวิชาเดียวกันซ้ำสองครั้ง
การ Query ข้อมูลความสัมพันธ์ (JOIN)
“>การดึงข้อมูลที่เกี่ยวข้องทั้งหมดจำเป็นต้องใช้คำสั่ง JOIN เพื่อเชื่อมโยงข้อมูลจากตารางหลักผ่าน Junction Table เสมือนการเดินทางของข้อมูล:
SQL
SELECT<br> s.student_name, c.course_name,<br> e.enrollment_date<br>FROM students s<br>JOIN enrollments e ON s.student_id = e.student_id<br>JOIN courses c ON e.course_id = c.course_id<br>WHERE s.student_name = 'Alice' AND c.course_name = 'Database Design';“>
คำสั่งนี้จะดึงข้อมูลที่เชื่อมโยงกันอย่างถูกต้อง โดยใช้ Foreign Key เป็นสะพานเชื่อม ทำให้มั่นใจได้ว่าข้อมูลที่ได้มานั้นเป็นความสัมพันธ์ที่สมบูรณ์ตามหลักการออกแบบสถาปัตยกรรมระบบ
บทสรุป
“>การทำความเข้าใจและนำแนวคิด Association ไปใช้ในการออกแบบ Junction Table สำหรับความสัมพันธ์แบบ Many-to-Many ใน PostgreSQL ไม่ใช่แค่การเขียนโค้ด แต่เป็นการคิดเชิงสถาปัตยกรรมที่สำคัญที่สุดอย่างหนึ่ง การจัดการความสัมพันธ์ที่ถูกต้องนี้จะช่วยให้ฐานข้อมูลของเรามีความสมบูรณ์ (Integrity) มีความยืดหยุ่น และพร้อมรองรับการขยายตัวของระบบขนาดใหญ่ได้อย่างมีประสิทธิภาพ