5 main database genres and CAP theorem
“An individual song may share all of the same notes with other songs. but some are more appropriate for certain uses” — Seven weeks of seven databases book
แต่ละเพลงอาจใช้โน้ตเดียวกันทั้งหมดกับเพลงอื่น แต่บางเพลงก็เหมาะสมกับการใช้งานบางอย่างมากกว่า
เป็นเช่นกันเหมือน database การที่เราจะนำข้อมูลชุดเดียวกันมาใช้กับหลายๆ ประเภทของ database ย่อมมี database ที่เหมาะสมกับข้อมูลชุดที่เราให้แตกต่างกันไป
บทความนี้เราจะมาเล่าว่าโลกของ Database ในมุม overview ว่ามี database แบบไหนบ้าง และถูกแบ่งออกเป็นหน้าตายังไง
History between Relational and NoSQL databases
บนโลกใบนี้มี database ที่ใช้การมาอย่างยาวนานซึ่งก็คือ relational database หรืออีกชื่อคือ traditional database/ DBMS โดยมีวิธี interact กับข้อมูล structured data ด้วยภาษา SQL และถูกจัดการเป็น data warehouse ขนาดใหญ่เรื่อยมา
จนโลกหมุนไปในช่วงปี 2000s พวกเทคโนโลยีการเก็บ storage ก็เริ่มมีราคาถูกลง พอ storage ถูกลง ก็มีผลให้ demand การ query มีมากขึ้น โดย data พวกนี้เองก็ไม่ได้มีแค่เพียง structured data แล้ว แต่รวมถึง unstructured data และ semi-structured data ที่ตามมาด้วย ( data ตัวอย่างเช่น JSON, XML, Video, images, audio)
NoSQL database จึงเข้ามามีบทบาทในช่วงนี้ สร้างความ flexible ด้วยความสามารถที่จัดการกับ unstructured data ได้ รองรับพวก response หน้าบ้านของ website (ลองนึกภาพสาย website application อย่างพวก MongoDB, Redis) อีกทั้งยังมีความสามารถด้าน distributed data system ที่หมายความว่ากระจายการทำงานของ computer ให้รองรับการทำงานที่มากขึ้นได้
สาเหตุที่ชื่อว่า NoSQL database หรือ non-relational databases นั้น ถูกสร้างในยุคที่ยังมี SQL (relational database) เป็นหลัก เลยเป็นที่มาของความหมายว่าโลกนี้ไม่ได้มีแค่ SQL แล้วนะ (Not only SQL) หรือ ตรงข้ามกับ relational ที่ไม่ได้ใช้ SQL เป็นหลัก (No-SQL)
เรื่องที่คนมักเข้าใจผิดของการก้าวเข้ามาของ NoSQL นั้น เนื่องจาก NoSQL มีกระแสความนิยมมาก ว่ามันจะมาแทนที่ Relational database รึเปล่า
คำตอบคือไม่มีทาง เพียงแต่จะสร้างตัวเลือกที่กว้างขวางขึ้นแก่ user ที่ไม่ได้มีแค่โลกของ Relational เท่านั้น
คราวนี้เราจะมาเจาะลึกลงในแต่ละประเภทของ Databases
เราแบ่งออกเป็นประเภทหลักๆคือ Relational กับ Non-relational
Relational
Relational database management systems (RDBMSs) คือ table 2 dimension ที่มี row และ column
และมีวิธี interact กับ database ประเภทนี้ด้วยการเขียน query ในรูปแบบ Structured Query Language (SQL) อย่างที่กล่าวมาด้านบน
ภายใน relational นั้นก็เป็น structured data ที่ทุกคนมักจะเคยเห็นกัน รูปแบบ table ทั่วไปที่ต้องมีการ define schema ชัดเจน
databasesในประเภทนี้มี MySQL, H2, SQLITE, PostgreSQL ที่เราเคยสรุปไว้อย่างละเอียด
Non-relational Databases
1. Key-value
ประเภทนี้น่าจะเป็นการอธิบาย NoSQL ในรูปแบบที่ง่ายที่สุดแล้ว โดย data ชุดนี้จะมี key และ value ตามชื่อเลย โดยมักจะเอาไปใช้ทำพวกการเก็บ cache หรือเก็บ user session ที่เข้ามาใน website
databasesในประเภทนี้มี Redis และ Amazon DynamoDB
2. Columnar ( หรือ Wide-column)
Columnar หรือ column-oriented database ซึ่งดูเผินๆแบบเผินมากๆเขาจะมีลักษณะเป็น table เหมือน relational นั่นแหล่ะ (และ relational เป็น row-oriented) แต่ไส้ในไม่เหมือนกันเลย ไส้ใน cell ของ table จะเป็น dict ที่เป็น key และ value อีกที และยังมี concept เรื่อง column family
ตัวอย่างเช่น Apache HBase ที่เป็น database ที่ built on top ของ HDFS ที่อยู่ในโลกของ Hadoop ecosystem อีกที
ข้อดีของ database ประเภทนี้คือเกิดมาเพื่อรองรับข้อมูลขนาดใหญ่มากๆ
databasesในประเภทนี้มี HBase, Cassandra
หากใครสนใจอยากรู้รายละเอียดเกี่ยวกับ database ประเภทนี้มากขึ้น ลองอ่านสรุปของ HBase ดูได้
3. Document
ประเภทนี้เก็บ data ในรูปแบบของ JSON, XML หรือ BSON formats ซึ่งมีความคล้ายกับแบบ Key-Value มากๆ แต่ต่างกันตรงวิธีที่ data ถูก process
หน้าตัวอย่างข้อมูลจาก MongoDB เช่น
{
"_id": "ObjectId("d7caskf00010dsa")",
"firstName": "Burasakorn",
"lastName": "Sabyeying",
"nickName": "Mils",
"role": "Data Engineer"
}
databasesในประเภทนี้มี MongoDB, CouchDB
4. Graph
เป็นลักษณะที่เล่าถึง relationship โดยเก็บ data ในรูปแบบของ node และ edges เช่น นาย A กับนาย B เป็นเพื่อนกัน Nodes จะมี 2 ตัวคือนาย A และนาย B และมี Edge คืออธิบายถึงความสัมพันธ์ของ 2 nodes นี้ซึ่งก็คือ “เป็นเพื่อน”
use case ของ database ประเภทนี้มี social network, fraud detection
databasesในประเภทนี้มี Neo4J
ต่อไปเราจะเล่าถึง CAP Theorem คืออะไร
CAP Theorem
เป็นทฤษฎีที่มา prove เกี่ยวกับ design การสร้าง distributed database system ใน Non-relational database แบ่งออกเป็นการการันตี 3 เรื่อง
- Consistency — read แล้วได้ข้อมูลล่าสุดเสมอจากการ write ล่าสุด
- Availability — ทุกครั้งที่ขอข้อมูลจะได้ข้อมูลเสมอ
- Partition Tolerance — ระบบยังทำงานต่อได้แม้จะต่อ server ไม่ได้แล้ว
โดยที่แต่ละ database จะมีคุณสมบัติมากสุดเพียงแค่ 2 ใน 3 ของการการันตีนี้ เป็นเรื่องของการ trade-off ในบางครั้ง อาจจะต้องเลือกระหว่าง Consistency และ Availability ด้วย
(โน้ตว่า A กับ C ใน CAP ไม่ใช่ตัวเดียวใน ACID นะ)
ในเรื่อง CAP theorem ส่วนสำคัญที่สุดคือ Partition tolerant ดังนั้นทางต่อไปเราต้องเลือกแล้วว่า database เราจะเป็น Consistency หรือ Availability ดี
ตัวอย่างเช่น บาง database อาจะมีคุณสมบัติเป็น CP system (Consistency + Partition) ทำให้เป็น distributed database เช่น MongoDB และ HBase อย่าง HBase จะให้ consistency ที่สูงมาก โดยทุกครั้งที่ write data ใหม่ ทำให้ user ได้รับค่าใหม่เสมอ
บาง database ก็เป็น AP (Availability + Partition) เช่น CouchDB ที่สามารถ replicate data ข้าม servers ได้แต่ไม่ได้การันตีว่าจะได้ข้อมูลที่เท่ากันระหว่าง 2 servers นี้
ส่วน CA system (Consistency + Availability) ยังมีนะ แต่จะไม่เหมารวมว่าเป็นการทำเรื่อง distributed data แล้ว (เพราะเราต้องเลือกระหว่าง C หรือ A) ดังนั้นการทำ partition จะไม่สำคัญอะไรแล้ว ตัวอย่างเช่น Redis, PostgreSQL และ Neo4J
และโน้ตไว้ว่า หลายครั้งที่คุณสมบัติพวกนี้สามารถเปลี่ยนได้ ไม่ได้ตายตัวเสมอ เช่น Mongo ก็อาจจะเป็น CA ในบางครั้ง หรือ CouchDB ก็อาจจะเป็น CP ในบางที
CAP theorem จะเป็นส่วนสำคัญที่เราต้องคำนึงหากเราต้องจัดการกับ distributed databases
สรุป
เราได้เรียนรู้ว่าโลกของ database มีทั้ง Relational และ Non-relational และมีประวัติความเป็นมาอย่างไร โดยพอแบ่งประเภทกันแล้วมีทั้งหมดรวม 5 ตัวคือ Relational, Key-value, Columnar, Document, และ Graph stores ซึ่งมีตัวอย่าง databases ที่หลากหลายมีทั้ง open-source เช่น Redis, Apache HBase, MongoDB, Neo4J และที่เป็น cloud service อย่าง DynamoDB
โดยเสริมเรื่องของ CAP theorem ที่เป็น concept เกี่ยวกับ distributed database ที่ช่วยขยายความเรื่องคุณสมบัติบางอย่างใน database แต่ละตัวด้วย
Ref: