SQL vs NoSQL คืออะไร? เหมาะกับลักษณะงานแบบใด?

สวัสดีครับ ชาว IT วันนี้ผมจะมาแนะนำในเรื่องของ Database กันบ้างนะครับ ในตลาดปัจจุบันเราสามารถเลือกใช้งาน Database ในรูปแบบต่าง ๆ ได้ครับ ไม่ว่าจะเป็น RDBMS, NoSQL, Big Data หรือ อื่น ๆ ซึ่ง Developer มือใหม่ที่เลือกใช้งานคงจะเลือกกันไม่ถูก ถ้าจะมีให้เลือกมากมายขนาดนี้
โอเคครับ ก่อนที่จะไปเปรียบเทียบกัน จริง ๆ หัวข้อด้านบน ก็ไม่ถูกซะทีเดียว เพราะว่า SQL จริง ๆ แล้วคือ ภาษา ๆ หนึ่ง เดี๋ยวจะค่อย ๆ ไล่อธิบายไปนะครับ

SQL คืออะไร

สำหรับ SQL ย่อมาจาก Structured query Language เป็นภาษาโปรแกรมมิ่งชนิดหนึ่ง ที่ใช้ในการสื่อสารกับ Database ชนิด Relational ไม่ว่าจะเป็นการ Update ข้อมูลใน Database หรือ ดึงข้อมูลจาก Database ครับ

สรุปแบบง่าย ๆ คือ เป็นตัวกลางในการช่วยสั่งงาน Database แบบ RDBMS ครับ
จากที่ได้เกริ่นไปในตอนต้น วันนี้ผมจะมาเปรียบเทียบรูปแบบ Database ที่คนทั่วโลกนิยมกัน 2 ตัวคือ RDBMS และ NoSQL ครับ มาเริ่มกันเลยครับ

RDBMS (Relational Database Management System)

เป็นระบบจัดการฐานข้อมูลที่นิยมใช้กันมานานแล้วตั้งแต่ยุค 1970 มีความเสถียรมากเหมาะสำหรับการเก็บข้อมูลที่มีจุดประสงค์และแยกประเภทชัดเจน ใช้ภาษา SQL ในการ Query และ Maintain Database มีการเก็บข้อมูลในรูปแบบ Tables (ตาราง) มีองค์ประกอบเป็น Rows และ Columns (มองภาพคล้าย ๆ ตารางของ Microsoft Excel) 
สาเหตุที่เก็บข้อมูลเป็น Tables (ตาราง) เนื่องจากช่วยให้ง่ายต่อการเข้าถึงข้อมูลของกันและกัน หรือเรียกอีกชือว่า Relation ก็ได้ครับ เนื่องจากเป็นการนำข้อมูลมาเชื่อมต่อกัน มีความสัมพันธ์กัน

องค์ประกอบของ Tables จะประกอบไปด้วย
  1. Row (แถว หรือ แนวนอน) เรียกอีกชื่อว่า Tuple คือ ข้อมูล 
  2. Column (สดมภ์ หรือ แนวตั้ง) เรียกอีกชื่อว่า Attribute คือ การระบุชนิดของข้อมูลนั้น ๆ เช่น ที่อยู่, วัน เดือน ปีเกิด
  3. Table (ตาราง) เรียกอีกชื่อว่า Relation คือ ชุดของข้อมูล (Record) ที่แบ่งชนิด (Attribute) เรียบร้อยแล้ว (Rows & Columns)
  4. View เรียกอีกชื่อว่า Query คือ การรายงานข้อมูลจาก RDBMS โดยจะเรียกดูจาก Record จาก Row ใดก็ได้
โดยในการเก็บข้อมูล สังเกตได้ว่ามีการวางโครงสร้างเป็นลักษณะแบบตาราง ข้อมูลใหม่ที่เพิ่มเข้ามาก็จะไปสร้าง Row ขึ้นมาใหม่ต่อทางด้านล่าง ซึ่งการเพิ่มเข้ามาของข้อมูลจะมีลักษณะเป็นแบบการเพิ่มบรรทัดนั่นเอง
การเก็บข้อมูลของ RDBMS จึงมีความเป็นระเบียบมาก สามารถหาข้อมูลที่เกี่ยวข้องกันได้ง่ายเนื่องจากข้อมูลมีการผูกกันแบบชัดเจน แต่ตารางที่ว่าจะถูก Fix Column มาให้แล้ว ทำให้เพิ่มข้อมูลได้เฉพาะเท่าที่มี Fields อยู่
ทีนี้ผู้คิดค้นก็มีความกังวลว่าในการใช้งานหากมีคนใส่ข้อมูลที่ไม่ตรงกับความต้องการที่แท้จริงของ Field นั้น ๆ และเวลานำข้อมูลของแต่ละ Table มาเชื่อมต่อกัน (JOINS) จึงต้องมีการกำหนด Constraints ขึ้นมา

Constraints – แปลเป็นไทยก็คือ ข้อบังคับ ซึ่งข้อบังคับนี้จะต้องเกี่ยวข้องกับ Data Integrity (ความถูกต้องสมบูรณ์ของข้อมูล) ซึ่งมีอยู่ 2 ส่วน ได้แก่
  1. Entity Integrity -> ต้องสามารถระบุถึงแถวข้อมูลภายใน Table ได้
  2. Referential Integrity -> ข้อมูลที่ใส่เข้าไปจะต้องมีความสัมพันธ์กับอีกตารางนึง (ต้องนำค่ามาจากอีกตารางที่อ้างอิง)
Constraints ใน RDBMS จะมีอยู่หลายแบบ ไม่ว่าจะเป็น
Key -> มี 2 รูปแบบ
Primary Key -> หมายถึง จะไม่ให้ใน Column มีข้อมูลที่ซ้ำกันและข้อมูลที่ว่างอยู่ (NULL) 
Foreign Key -> หมายถึง ต้องมีการ Reference ข้อมูลจาก Table ที่มี Primary Key
Other -> รูปแบบอื่น ๆ เช่น
NOT NULL -> หมายถึง ใน Record ต้องมีข้อมูล ถ้าเราไม่ได้กรอก Record จะบันทึกเป็น NULL โดยอัตโนมัติ
UNIQUE -> หมายถึง ใน Table จะต้องไม่มีข้อมูลที่ซ้ำกัน
DEFAULT -> หมายถึง จะระบุข้อมูลลงใน Record ให้ ถ้าไม่ได้กรอกข้อมูลลงไป
CHECK -> หมายถึง จะตรวจสอบข้อมูลให้ว่าตรงตามเงื่อนไขหรือไม่

RDBMS ที่นิยมในตลาดที่เรารู้จักกัน ได้แก่ Oracle, Microsoft SQL Server, MySQL, PostgreSQL, IBM DB2, Microsoft Access, SQLite และ MariaDB โดยแต่ละเจ้ามีความสามารถในการกำหนด Constraints ได้แตกต่างกันไปครับ

แถมให้สำหรับ RDBMS ในกรณีที่เริ่มมีข้อมูลที่มากขึ้นแล้ว จะต้องใช้พื้นที่ในการเก็บข้อมูลมากขึ้น ในการที่จะหาดึงข้อมูล จะต้องมีการ Query ที่มากขึ้น ทำให้ Database Server ต้องใช้การประมวลผลมากขึ้น สิ่งที่สามารถแก้ไขได้คือ การเพิ่ม Load ของ Server ไม่ว่าจะเป็น CPU, Memory และ Hard disk เราเรียกการ Scale แบบนี้ว่า การ Scale แบบ Vertical

NoSQL คืออะไร

Non-SQL ย่อมาจาก Non-relational database บางท่านอาจจะเรียกว่า Not only SQL ก็ไม่ได้ผิดแต่อย่างใด

เป็น Database อื่น ๆ ที่ไม่ได้เป็นแบบ Relational หรือมีความสัมพันธ์กันชัดเจนแบบ Pattern เหมาะสำหรับการใช้งานจำพวก Big Data และ Real-time Web Application
ว่ากันง่าย ๆ ก็คือ เกิดมาเพื่อแก้ไขปัญหาของ RDBMS เลยล่ะครับ แต่ก็มีข้อเสียอยู่เช่นกัน ข้อดีข้อเสียเดี๋ยวเปรียบเทียบให้ตอนท้ายนะครับ สำหรับประเภทของ NoSQL จะแบ่งออกเป็น 4 แบบหลัก ๆ ได้แก่

  1. Document -> ข้อมูลและ Metadata จะเก็บเป็นลำดับชั้นในรูปแบบ Semi-structure data เช่น JSON หรือ XML ใน Database ตัวอย่าง Database Software ที่ใช้งานลักษณะนี้ ได้แก่ Cosmos DB, IBM Domino, MongoDB, Couchbase, ArangoDBRelational Databases vs. NoSQL Document Databases | Lenni's Technology Blog
    จากรูปแบบซ้ายคือ RDBMS แบบขวาคือแบบ Document
  2. Key-Value -> เป็นการเก็บ Record ที่ไม่มีอะไรซับซ้อน มีแค่ Key และ Value ทำให้สามารถเข้าถึงข้อมูลได้รวดเร็ว โดยการเข้าถึงข้อมูลก็ให้ใช้ Key ก็จะได้ Value ที่ต้องการ ตัวอย่าง Database Software ที่ใช้งานลักษณะนี้ ได้แก่ Redis, Memcached, Apache Ignite, Couchbase, Dynamo
  3. Graph -> ข้อมูลจะเก็บอยู่ในรูปแบบกราฟแผนภูมิ มี Node และ Edge ที่เชื่อมต่อกัน ทำให้ไม่ต้องนำข้อมูลมา JOINS กันเหมือนของ RDBMS ตัวอย่าง Database Software ที่ใช้งานลักษณะนี้ ได้แก่ ArangoDB, InfiniteGraph, Apache Giraph, MarkLogic, Neo4J, OrientDB, Virtuoso
  4. Wide-Column -> รูปแบบของ Wide-Column จะบันทึกข้อมูลในรูปแบบ Tables (Rows และ Columns) แต่จะต่างจาก RDBMS ตรงที่ แต่ละ Rows จะไม่ Fix Column (ถ้าเป็น RDBMS จะ Fix มาเป็น Pattern เดียวกัน) ตัวอย่าง Database Software ที่ใช้งานลักษณะนี้ ได้แก่ Amazon DynamoDB, Cassandra, Azure Tables, Accumulo, HBase

    แบบ RDBMS (สีฟ้า) จะเห็นได้ว่า Columns เป็นค่าเดิมตลอด


    แบบ NoSQL Wide-Column (สีเขียวและสีขาว) สังเกตได้ว่าในแต่ละ Row จะใส่ Column อะไรลงไปก็ได้ ไม่ต้องมี Constraints เหมือน RDBMS

จากแต่ละประเภทที่ได้อธิบาย จะเห็นได้ว่าลักษณะของ Database แบบ NoSQL จะไม่ได้เคร่งในเรื่องของความเป็นระเบียบของข้อมูล สามารถกระจายอยู่ที่ไหนก็ได้ ทำให้หาก Database มีขนาดที่ใหญ่มากขึ้น การ Scale Server จะเป็นการเพิ่มในแนวราบมากกว่า (Horizontal) ก็คือแทนที่จะเพิ่ม Spec Resource เหมือนกับแบบ RDBMS จะเป็น Scale โดยการเพิ่ม Server ไปเลยมากกว่า

ก่อนที่จะไปดู ข้อดีและข้อเสีย เรามาพูดถึง CAP Theorem กันก่อนละกันครับ

CAP Theorem เป็นหลักการที่คิดค้นเพื่อนำมาใช้สำหรับระบบการจัดเก็บฐานข้อมูลเพื่อเป็นการการันตีว่าระบบฐานข้อมูลจะมีคุณสมบัติได้เพียง 2 ใน 3 ส่วน ได้แก่ C, A และ P
C – Consistency หมายถึง ทุกครั้งที่อ่านข้อมูลจาก Database จะได้ Result หรือไม่ก็ Error
A – Availability หมายถึง ทุกครั้งที่มีการขอข้อมูลจาก Database จะได้ข้อมูลเสมอ แต่ไม่การันตีว่าจะเป็นข้อมูลที่เขียนลงไปล่าสุด
P – Partition tolerance หมายถึง ระบบจะทำงานยังต่อได้ แม้ว่าจะมีหนึ่งใน Database ขาดการเชื่อมต่อหรือเสียหายไป

ซึ่ง Database ที่เป็นแบบ RDBMS ส่วนใหญ่จะเป็นแบบ CA เพราะว่าการที่ไม่ยอมให้ข้อมูลเสียหายเลยจำเป็นต้องตัด P ออกเพื่อให้พร้อมใช้ตลอด

แต่สำหรับ NoSQL ไม่ได้ต้องการความแม่นยำของข้อมูลมากเท่าแต่ต้องการความเร็วในการเรียกใช้งานแทน ทำให้อาจจะเป็นชนิดแบบ 
AP -> สามารถดึงข้อมูลจาก Database ได้ตลอดแม้ว่า Database จะเสียหายไปบางส่วน
CP -> ต้องรอให้ข้อมูล Update ล่าสุดก่อนถึงจะอ่านข้อมูลได้ ฉะนั้นจะมีบางช่วงเวลาที่ไม่สามารถใช้งานได้ตามความต้องการ

สรุปความแตกต่างระหว่าง RDBMS กับ NoSQL ดังนี้นะครับ

 

ข้อดีและข้อเสียของ SQL และ NoSQL

สำหรับข้อดีและข้อเสีย ผมขอแนะนำเป็นลักษณะของการเลือกใช้งานให้เหมาะสมกับข้อมูลของท่านน่าจะดีกว่านะครับ มาดูกันเลยครับ


โอเคครับ ก็จบแล้วสำหรับ Blog ของเราในตอนนี้นะครับ เป็นอย่างไรกันบ้างครับ มีไอเดียในการ Design โครงสร้างของ Database กันมากขึ้นมั้ยครับ หากผู้เขียนใส่ข้อมูลได้ไม่ครบถ้วนหรือขาดตกบกพร่องในส่วนใด ท่านสามารถ Comment เข้ามาช่วยแก้ไข หรือติชมกันได้นะครับ
หวังว่า Blog นี้จะมีประโยชน์กับชาว IT ทุกท่านที่เข้ามาติดตามกันนะครับ

ขอบคุณมากครับ

หมายเหตุ: Blog นี้เป็นเพียงความคิดเห็นส่วนตัว  อาจมีข้อผิดพลาด หรือการเปลี่ยนแปลงได้ตามความเหมาะสมครับ

— Cloud HM