Association

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) มีความยืดหยุ่น และพร้อมรองรับการขยายตัวของระบบขนาดใหญ่ได้อย่างมีประสิทธิภาพ