PlusMagi's Blog By Pitt Phunsanit Backend,Database การสร้าง ER Diagram ด้วย Mermaid.js: การกำหนด Cardinality (1:1, 1:N, N:M) บน Diagram as Code

การสร้าง ER Diagram ด้วย Mermaid.js: การกำหนด Cardinality (1:1, 1:N, N:M) บน Diagram as Code

ในโลกของการพัฒนาระบบฐานข้อมูลที่ซับซ้อน การทำความเข้าใจความสัมพันธ์ระหว่างเอนทิตี้ (Entities) คือหัวใจสำคัญของการออกแบบสถาปัตยกรรม (Architecture) ที่แข็งแกร่ง ไม่ว่าจะเป็นการใช้ PostgreSQL หรือระบบฐานข้อมูลใด ๆ การกำหนดความสัมพันธ์ (Relationships) และข้อจำกัดเชิงปริมาณ (Cardinality) อย่างแม่นยำจึงเป็นสิ่งที่ไม่สามารถประนีประนอมได้

ในอดีต การสร้างแผนภาพ ER Diagram มักต้องพึ่งพาเครื่องมือ GUI ที่เน้นการลากวาง ซึ่งแม้จะใช้งานง่าย แต่ก็มีข้อจำกัดร้ายแรงเมื่อต้องนำไปใช้ในสภาพแวดล้อมที่ต้องควบคุมเวอร์ชัน (Version Control) หรือกระบวนการ CI/CD การเปลี่ยนผ่านสู่แนวคิด Diagram as Code จึงเป็นทางออกที่สมบูรณ์แบบ

Mermaid.js: การนิยาม ER Diagram ในรูปแบบโค้ด

Mermaid.js คือเครื่องมือที่ช่วยให้เราสามารถใช้ภาษาโค้ดในการสร้างแผนภาพทั้งหมดได้ โดยเฉพาะอย่างยิ่งสำหรับการสร้าง ER Diagram ที่มีความแม่นยำสูง เราสามารถกำหนดเอนทิตี้ (Entities) และความสัมพันธ์ (Relationships) พร้อมทั้งระบุ Cardinality (1:1, 1:N, N:M) ได้อย่างเป็นระบบและสามารถตรวจสอบได้ (Auditable) ซึ่งสอดคล้องกับหลักการทำงานของ PostgreSQL ที่ต้องการความแม่นยำของ Schema

การใช้ Mermaid.js ไม่เพียงแต่ทำให้แผนภาพของเราเป็นเอกสารประกอบ (Documentation) ที่สามารถถูกควบคุมเวอร์ชันได้ แต่ยังช่วยให้การสื่อสารระหว่างนักออกแบบฐานข้อมูล (DB Designer) และนักพัฒนา (Developer) เป็นไปอย่างราบรื่น เพราะโค้ดคือแหล่งความจริง (Single Source of Truth) เสมอ

การกำหนด Cardinality ในบริบท PostgreSQL

หัวใจสำคัญของการใช้ Mermaid คือการใช้ Syntax ที่ระบุความสัมพันธ์เชิงปริมาณอย่างชัดเจน เช่น:

  • 1:1 (One-to-One): เอนทิตี้ A หนึ่งตัวสัมพันธ์กับเอนทิตี้ B หนึ่งตัวเท่านั้น
  • 1:N (One-to-Many): เอนทิตี้ A หนึ่งตัวสามารถสัมพันธ์กับเอนทิตี้ B ได้หลายตัว (เช่น ลูกค้า 1 คน มีคำสั่งซื้อได้หลายรายการ)
  • N:M (Many-to-Many): เอนทิตี้ A หลายตัวสัมพันธ์กับเอนทิตี้ B หลายตัว (ต้องใช้ตารางเชื่อม (Junction Table) ในการ Implement ใน PostgreSQL)

ตัวอย่างการสร้าง ER Diagram สำหรับระบบจัดการคำสั่งซื้อ (Order Management System) โดยใช้ PostgreSQL เป็นฐานข้อมูล:

CSS

erDiagram
    CUSTOMER ||--o{ ORDER : places
    CUSTOMER { 
        int customer_id PK
        varchar name
        varchar email
    }
    ORDER ||--o{ ORDER_ITEM : contains
    ORDER_ITEM { 
        int order_item_id PK
        int order_id FK
        varchar product_name
        int quantity
    }

ในตัวอย่างข้างต้น เรากำหนดความสัมพันธ์ 1:N ระหว่าง `CUSTOMER` กับ `ORDER` ด้วยสัญลักษณ์ `||–o{` ซึ่งหมายถึงลูกค้าหนึ่งคน (One) สามารถมีคำสั่งซื้อได้หลายรายการ (Many) การใช้โค้ดนี้ทำให้มั่นใจว่าการออกแบบฐานข้อมูลของเราสอดคล้องกับหลักการทางทฤษฎีและพร้อมสำหรับการสร้าง Schema ใน PostgreSQL จริง

บทสรุป: ประโยชน์ในมุมมองของ Senior Architect

การใช้ Mermaid.js ในการสร้าง ER Diagram ไม่ได้เป็นเพียงแค่ทางเลือกด้านเครื่องมือ แต่เป็นการยกระดับกระบวนการออกแบบฐานข้อมูลให้เป็นมาตรฐานระดับสถาปัตยกรรมที่สูงขึ้น ด้วยการเปลี่ยนแผนภาพให้เป็นโค้ด (Code) เราได้รับข้อได้เปรียบด้านความแม่นยำ ความสามารถในการควบคุมเวอร์ชัน และการทำงานร่วมกับเครื่องมือ DevOps ได้อย่างสมบูรณ์ ทำให้การออกแบบ PostgreSQL ของเรามีความยืดหยุ่น ทันสมัย และพร้อมสำหรับการขยายตัวในอนาคต