วัน: 25 ตุลาคม 2007

การสร้าง Class Diagram ด้วย Mermaid.js: การแสดงความสัมพันธ์ Inheritance, Association และ Aggregationการสร้าง Class Diagram ด้วย Mermaid.js: การแสดงความสัมพันธ์ Inheritance, Association และ Aggregation

ในฐานะสถาปนิกซอฟต์แวร์ การสื่อสารทางโครงสร้างระบบ (System Architecture) คือหัวใจสำคัญที่กำหนดความสำเร็จของโปรเจกต์ ไม่ว่าจะเป็นการออกแบบโมเดลข้อมูล หรือการทำเอกสารประกอบ (Documentation) ที่ต้องส่งต่อให้ทีมงาน ความสามารถในการแปลงแนวคิดนามธรรมให้กลายเป็นแผนภาพที่ชัดเจนจึงเป็นทักษะที่ขาดไม่ได้

บทความนี้จะพาคุณเจาะลึกถึงเครื่องมือปฏิวัติวงการอย่าง Mermaid.js ซึ่งช่วยให้นักพัฒนาสามารถสร้าง Class Diagram ตามหลัก UML ได้ด้วยโค้ดข้อความ (Text-based Syntax) และยังแสดงให้เห็นว่าโครงสร้างเหล่านี้มีความสัมพันธ์และสอดคล้องกับระบบฐานข้อมูล PostgreSQL ที่แข็งแกร่งได้อย่างไร

Mermaid.js: การเปลี่ยน UML ให้เป็นโค้ด

การวาดแผนภาพคลาสแบบดั้งเดิมนั้นใช้เวลานานและยากต่อการบำรุงรักษา แต่ Mermaid.js ได้เข้ามาแก้ปัญหานี้โดยอนุญาตให้เรากำหนดโครงสร้างของ Class และความสัมพันธ์ต่าง ๆ ด้วยไวยากรณ์ที่อ่านง่าย ทำให้เอกสารของเรากลายเป็น “Living Documentation” ที่สามารถอัปเดตได้ทันทีเมื่อโค้ดมีการเปลี่ยนแปลง

แก่นของการออกแบบ: ความสัมพันธ์ 3 รูปแบบ

หัวใจสำคัญของ Class Diagram คือการระบุความสัมพันธ์ระหว่างคลาสอย่างแม่นยำ ซึ่งประกอบด้วย:

  • Inheritance (Is-a): ความสัมพันธ์แบบสืบทอด เช่น `Dog` เป็นประเภทหนึ่งของ `Animal` ในทางฐานข้อมูล มักถูกจำลองโดยใช้ Primary Key ร่วมกับ Foreign Key หรือการออกแบบ Table Inheritance
  • Association (Has a general relationship): ความเกี่ยวข้องทั่วไประหว่างคลาสที่ไม่ได้มีลำดับชั้นชัดเจน เช่น `User` มีความสัมพันธ์กับ `Order`
  • Aggregation (Weak Has-a): ความสัมพันธ์แบบส่วนประกอบย่อยที่สามารถดำรงอยู่ได้ด้วยตัวเอง แม้ว่าวัตถุหลักจะถูกลบไปแล้ว เช่น ห้องสมุด (`Library`) ประกอบด้วยหนังสือ (`Book`) แต่ถ้าห้องสมุดปิด หนังสือยังคงมีอยู่

การจำลองโครงสร้างคลาสสู่ PostgreSQL

แม้ว่า Mermaid.js จะเป็นเครื่องมือสำหรับแผนภาพ แต่ในทางปฏิบัติ โครงสร้างเหล่านี้ต้องถูกบังคับใช้ด้วยฐานข้อมูลจริงอย่าง PostgreSQL เราสามารถใช้คำสั่ง SQL เพื่อกำหนดตาราง (Tables) และ Foreign Key Constraints ซึ่งทำหน้าที่เป็นตัวแทนของความสัมพันธ์ UML เหล่านั้นได้อย่างสมบูรณ์

SQL

-- 1. การสร้างคลาสหลัก (Abstract Class: Animal) --
CREATE TABLE animal (
    animal_id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    species TEXT
);

-- 2. Inheritance (Dog extends Animal): ใช้ FK เพื่อเชื่อมโยง
CREATE TABLE dog (
    dog_id SERIAL PRIMARY KEY,
    owner_id INT REFERENCES animal(animal_id),
    bark_sound VARCHAR(50)
); -- owner_id คือการสืบทอดจาก Animal

-- 3. Association (Library has Book): ความสัมพันธ์ทั่วไป
CREATE TABLE book (
    book_isbn VARCHAR(20) PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    author VARCHAR(100)
);

-- 4. Aggregation (Library contains Books): ใช้ FK และการกำหนดขอบเขต
CREATE TABLE library (
    library_id SERIAL PRIMARY KEY,
    name VARCHAR(255)
);

ALTER TABLE book ADD COLUMN library_fk INT REFERENCES library(library_id); -- Book ต้องระบุว่าอยู่ใน Library ใด

โค้ด PostgreSQL ข้างต้นแสดงให้เห็นถึงการกำหนดโครงสร้างที่สอดคล้องกับ UML โดยใช้ Foreign Keys เพื่อบังคับความสัมพันธ์ (Association) และการออกแบบตารางลูกที่อ้างอิงคลาสแม่เพื่อจำลอง Inheritance การทำเช่นนี้ทำให้มั่นใจได้ว่าโมเดลข้อมูลของเรามีความถูกต้องทางวิศวกรรมสูง

สรุป: พลังของการคิดเชิงสถาปัตยกรรม

การใช้ Mermaid.js ร่วมกับการทำความเข้าใจโครงสร้างฐานข้อมูลอย่าง PostgreSQL ไม่ได้เป็นเพียงแค่การวาดรูปภาพ แต่เป็นการพัฒนาวิธีคิดเชิงสถาปัตยกรรม (Architectural Thinking) ให้กับทีมงาน เมื่อเราสามารถกำหนดขอบเขตของระบบด้วยโค้ดที่อ่านง่ายและตรวจสอบได้ เราก็จะสามารถออกแบบระบบที่มีความยืดหยุ่นสูง บำรุงรักษาได้ง่าย และพร้อมสำหรับการขยายตัวในอนาคตได้อย่างแท้จริง