[CS for Non-Tech] Database Zone [ไทย]
สวัสดีครับผู้อ่านทุกท่าน กลับมาพบกันอีกแล้ว โดยในบทความนี้จะไปในเรื่องของฐานข้อมูลนะครับ สมมุติว่าเราไปเจออะไรมา แล้วเราอยากจะจำเก็บไว้ เราก็เขียนลงสมุดใช่มั้ยล่ะครับ ทำนองเดียวกัน เวลาเรามี Application เราก็อยากใช้ข้อมูลที่เคยมีอยู่แล้ว หรือแม้กระทั่งต้องการที่จะเพิ่มข้อมูลใหม่เข้าไป เพื่อให้สามารถใช้งานกับ Application ของเราได้ บทนี้จะเป็นบทที่คอยสนับสนุนเนื้อหาในข้างต้นครับ
Database Zone
Database
ย้อนกลับไปสมัยก่อนนู้นนนนนนน เขาเก็บข้อมูลใส่แฟ้ม ใส่ชั้น ใส่ Locker แล้วคราวนี้เวลาเขาจะหาก็หัวหมุนไปหมด มันอยู่ตรงไหนว๊าาา ก็เลยมี computer scienstists เนี่ย เขาคิดค้นเรื่องฐานข้อมูลขึ้น เพื่อให้เราสามารถที่จะเข้าถึงข้อมูลที่เก็บไว้แล้วได้ง่ายขึ้น
ฐานข้อมูลคือคอลเลกชันที่มีโครงสร้างของข้อมูลที่จัดเก็บทางอิเล็กทรอนิกส์และได้รับการออกแบบให้เข้าถึงและจัดการได้อย่างรวดเร็วและง่ายดาย สามารถใช้เก็บข้อมูลได้หลากหลาย เช่น ข้อความ ตัวเลข รูปภาพ (ใส่ได้จริง ๆ นะ แต่อย่าใส่เยอะ) และสื่ออื่นๆ
มีการใช้ฐานข้อมูลในหลากหลายอุตสาหกรรม และ Applications รวมถึงระบบการเงิน ระบบ CRM และร้านค้าปลีก เป็นเครื่องมือสำคัญในการจัดเก็บและจัดการข้อมูลด้วยวิธีที่มีประสิทธิภาพ
RDBMS
A relational database management system (RDBMS) เป็นระบบจัดการฐานข้อมูลประเภทหนึ่งที่มีวิธีการจัดระเบียบข้อมูลแบบความสัมพันธ์ (Relations)
RDBMS จะจัดเก็บข้อมูลในรูปแบบที่เรียกว่า Table
- Row/Record: Single Entry ภายใน Table (แนวนอน)
- Column/Field/Attribute: เป็น value ในแนวตั้งของข้อมูลแต่ละ Entry
RDBMS เป็นระบบจัดการฐานข้อมูลประเภทที่พบมากที่สุด ตัวอย่างของ RDBMS ที่เป็นที่นิยม ได้แก่ MySQL, Oracle และ Microsoft SQL Server
Entity-Relation Diagram (ERD)
การแสดงแผนภาพของฐานข้อมูลที่แสดงความสัมพันธ์ระหว่าง Entity ต่างๆ ในฐานข้อมูล ERD สามารถใช้ในการออกแบบฐานข้อมูล เพื่อทำความเข้าใจความสัมพันธ์ระหว่าง Entity ต่างๆ ในฐานข้อมูล และและใชเพื่อสื่อสารการออกแบบฐานข้อมูลกับผู้อื่นเวลาทำงานร่วมกัน
เนื้อหาด้านล่างนี้คือ ดีมากเลยครับ สามารถอ่านได้จากตรงนี้ได้เลย
อันนี้เป็น Key terms ที่พบได้ทั่วไปสำหรับเรื่องการออกแบบฐานข้อมูล
Primary key (PK): คือ Superkey (Key ที่ refer ให้ row นั้น uniqe) ที่ได้รับคัดเลือกของตารางนั้น ๆ
ใช้ระบุว่าแต่ละแถวในตารางต้องไม่ซ้ำกัน Primay key อีกชื่อก็คือ Candidate key โดย Superkey ที่ไม่ได้รับการคัดเลือกเป็น Primay key ก็เรียกว่า Secondary key
Foreign key (FK): ใช้เพื่อเชื่อมโยงตารางกับอีกตารางหนึ่ง โดย FK จะต้องมีค่าเป็น PK ของอีกตารางนึง
Composite key (CK): เอา Group ของ key มารวมกัน เพื่อ Identify ความ unique ของข้อมูล
Relations (Cardinality)
ก็คือความสัมพันธ์ ซึ่งมักจะใช้คู่กับ PK, FK เพื่อ Reference ไปที่ Table อื่น ๆ
- One-to-one: ความสัมพันธ์แบบหนึ่งต่อหนึ่งเกิดขึ้นเมื่อแต่ละแถวในตารางหนึ่งเกี่ยวข้องกับแถวเดียวในอีกตารางหนึ่ง
- One-to-many: ความสัมพันธ์แบบหนึ่งต่อกลุ่มจะเกิดขึ้นเมื่อแต่ละแถวในตารางหนึ่งเกี่ยวข้องกับหลายแถวในอีกตารางหนึ่ง
- Many-to-many: ความสัมพันธ์แบบกลุ่มต่อกลุ่มมีอยู่เมื่อหลายแถวในตารางหนึ่งเกี่ยวข้องกับหลายแถวในอีกตารางหนึ่ง
Example with Table
ในตัวอย่างนี้ Column “Employee ID” เป็น PK และ Column “Department ID” เป็น FK ตารางนี้แสดงว่าพนักงานหลายคนสามารถอยู่ในแผนกเดียวกันได้
SQL
SQL (Structured Query Language) เป็นภาษาที่ใช้ในการจัดการและจัดการข้อมูลในฐานข้อมูล เป็นภาษามาตรฐานสำหรับระบบ RDBMS ใช้ในการสร้าง แก้ไข สืบค้นฐานข้อมูล และอื่น ๆ เยอะแยะไปหมด 🥺
Common Operations
- SELECT: ดึงข้อมูลจากฐานข้อมูล
- INSERT: เพิ่มข้อมูลเข้าไปใหม่
- UPDATE: อัพเดทข้อมูลที่มีอยู่แล้ว
- DELETE: ลบข้อมูล
- JOIN: ใช้เพื่อรวมแถวจากตารางตั้งแต่สองตารางขึ้นไปตาม Column ที่เกี่ยวข้องกัน
- UNION: ใช้เพื่อรวมผลลัพธ์ของคำสั่ง SELECT ตั้งแต่สองคำสั่งขึ้นไปให้เป็นชุดผลลัพธ์เดียว
แหล่งเรียนรู้เพิ่มเติม
ส่วนอันนี้ Example จากผู้เขียน
Marketplace Table
Category Table
ดึงข้อมูลที่ราคาน้อยกว่า 500
SELECT * FROM marketplace WHERE price < 500;
Add data เข้าไป
INSERT INTO marketplace (name, price, category_id)
VALUES ('iPad', 500, 2);
Update data ที่มีอยู่แล้ว
UPDATE marketplace
SET price = 700
WHERE id = 1;
ลบข้อมูลออก
DELETE FROM marketplace
WHERE id = 8;
Join table
SELECT m.*, c.name AS category_name
FROM marketplace m
JOIN categories c ON m.category_id = c.id
Union result
SELECT * FROM marketplace WHERE price < 500
UNION
SELECT * FROM marketplace WHERE name LIKE '%Mac%';
ดึงข้อมูลที่มีราคาต่ำกว่า 500 รวมเข้ากับ ข้อมูลที่ในชื่อ มีคำว่า Mac
Normalization/Denormalization
Normalization ใช้ในการจัดระเบียบตารางในฐานข้อมูลในลักษณะที่ขจัดความซ้ำซ้อนของข้อมูล การพึ่งพาข้อมูลจะลดลง และรักษาความสมบูรณ์ของข้อมูล เป้าหมายหลักคือเพื่อให้แน่ใจว่าแต่ละตารางมีข้อมูลประเภทเดียว สิ่งนี้มีความสำคัญเนื่องจากช่วยลดความซ้ำซ้อนของข้อมูลและความไม่สอดคล้องกันของข้อมูล
Denormalization เป็นการเหมือนจงใจเพิ่มความซ้ำซ้อนให้กับฐานข้อมูลโดยเจตนาเพื่อปรับปรุงประสิทธิภาพของการ Searching ได้ดีมากขึ้น เพราะไม่ต้องไม่ Join หลายตัว ใช้เมื่อจำเป็นเท่านั้น หรือถ้าเป็น NoSQL ที่จะพูดถึงต่อไปจะได้ใช้ Denormalization เยอะเลย
ACID
ACID เป็นตัวย่อที่ย่อมาจาก Atomicity, Consistency, Isolation และ Durability
- Atomicity: ถ้าผ่านก็ต้องผ่านทั้งหมด ถ้าแตกต้องไม่ทำอะไรกับข้อมูล เพื่อรักษาความสอดคล้องของข้อมูล
- Consistency: ต้องรักษาความสอดคล้อง เช่น constraints, cascades
- Isolation: 1 Transaction ไม่รบกวน Transaction อื่น Transaction A จะไม่สามารถอ่านข้อมูลของ Transaction B ในระหว่างที่ B ยังไม่เสร็จได้
- Durability: หลังจาก commit & persist แล้ว คงอยู่ถาวร ไม่สูญหาย (ยกเว้น Disk หายอันนี้ผมก็ไม่รู้ทำไงเหมือนกัน)
Transactions
A database transaction เป็น single unit of work ที่ performed ภายใน database management system. Transactions ใช้เพื่อให้แน่ใจว่าฐานข้อมูลยังคงอยู่ในสถานะที่สอดคล้องกัน แม้ว่าชุดของการดำเนินการจะถูกขัดจังหวะหรือล้มเหลว
ในฐานข้อมูล, transaction จะเริ่มต้นเมื่อผู้ใช้หรือแอปพลิเคชันออกคำสั่งไปยังฐานข้อมูลเพื่อทำงานบางอย่าง จากนั้นฐานข้อมูลจะเริ่มทำงาน และยอมรับการเปลี่ยนแปลงที่ทำโดยธุรกรรม หรือย้อนกลับหากมีข้อผิดพลาดเกิดขึ้น
Transactions มีความสำคัญเนื่องจากทำให้มั่นใจได้ว่าการทำงานของฐานข้อมูลมีความน่าเชื่อถือและสอดคล้องกัน อนุญาตให้ผู้ใช้หรือแอปพลิเคชันทำการเปลี่ยนแปลงฐานข้อมูลได้ปลอดภัยและคาดการณ์ได้ และช่วยป้องกันข้อผิดพลาดและความไม่สอดคล้องกันไม่ให้เกิดขึ้น
Example โอน 100 points ข้าม account อย่างง่าย
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE account_number = '01GNR5Z541WZA1ZMBHVGBDQCGA';
UPDATE accounts SET balance = balance + 100 WHERE account_number = '01GNR5Z8C7BEQC14W5P2HKTGJB';
COMMIT;
กรณีถ้า SQL แตกระหว่าง ก็ใช้ ROLLBACK แทน
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE account_number = '01GNR5Z541WZA1ZMBHVGBDQCGA';
UPDATE accounts SET balance = balance + 100 WHERE account_number = '01GNR5Z8C7BEQC14W5P2HKTGJB';
ROLLBACK;
Indexes
- โครงสร้างข้อมูลที่ช่วยให้สามารถค้นหาและดึงข้อมูลจากตารางฐานข้อมูลได้อย่างมีประสิทธิภาพ
- ช่วยเพิ่มความเร็วในการสืบค้นโดยให้วิธีที่รวดเร็วยิ่งขึ้นในการค้นหาข้อมูลที่ต้องการ
ลองมองเหมือนเราวางที่คั่นหนังสือเอาไว้ ถ้าเราเห็นที่คั่นหนังสือ เราก็เปิดไปหน้าที่เราอ่านค้างไว้ได้ทันที Index ก็ทำแบบนี้เหมือนกันในฐานข้อมูล ฐานข้อมูลรู้อยู่แล้วว่า ไอ Query นี้เรียกข้อมูลเรียงแบบนี้ใช่มั้ย อ่ะ เอาไปเลย
Pros:
- เพิ่มประสิทธิภาพการสืบค้นได้อย่างมาก
- ลด Disk I/O needed ตอนที่ดึงข้อมูล
Cons:
- ใช้พื้นที่ Disk เพิ่มเติม ซึ่งอาจเป็นปัญหาสำหรับ Table ขนาดใหญ่
- Increased insertion and update time เพราะเนื่องจากระบบจัดการฐานข้อมูลต้องอัปเดต Index ด้วยเพื่อให้สอดคล้องกับการเปลี่ยนแปลงที่เราเพิ่งทำไป
- อาจไม่ใช่วิธีที่มีประสิทธิภาพสูงสุดในการดึงข้อมูล ถ้า Table มีขนาดเล็ก
NoSQL
NoSQL databases เป็นฐานข้อมูลประเภทหนึ่งที่ไม่ได้ใช้ traditional SQL/ relational database model. แต่จะใช้โมเดลข้อมูลที่หลากหลายแทน โดยได้รับการออกแบบให้มีความ scalable, flexible, และง่ายต่อการใช้งาน มักจะใช้ใน big data และ real-time web applications ที่ปริมาณและความเร็วของข้อมูลสูง เช่น MongoDB, Cassandra และ Redis
ข้อดีหลักของฐานข้อมูล NoSQL คือสามารถจัดการข้อมูลที่ไม่มีโครงสร้างในปริมาณมากได้ และให้ประสิทธิภาพการอ่านและเขียนที่รวดเร็ว ในทางกลับกัน ฐานข้อมูล NoSQL ก็อาจไม่ Support Function ที่ใกล้เคียงกับของฝั่ง RDBMS เช่น transactions, triggers, and foreign keys
Type of NoSQL
- Key-value stores — Matching key to value เช่น Redis
{
"key1": "value1",
"key2": "value2"
}
- Document stores — เก็บข้อมูลเป็น document เช่น MongoDB ที่เก็บเป็น JSON-like format (BSON)
{
"id": 1,
"name": "John",
"age": 30,
"location": "New York"
}
- Column-family stores — เก็บข้อมูลในโครงสร้างแบบตารางที่แต่ละแถวแสดงรายการข้อมูลเดียวและแต่ละคอลัมน์แสดงชิ้นส่วนของข้อมูลภายในรายการนั้น
- Graph stores — เก็บข้อมูลเป็น Graph เป็น Nodes ต่อ Edges แสดงถึงความสัมพันธ์ ตัวอย่างคือ Neo4j
CREATE (:Person {name: "Alice"})-[:FRIEND_OF]->(:Person {name: "Bob"})
CREATE (:Person {name: "Bob"})-[:FRIEND_OF]->(:Person {name: "Eve"})
CREATE (:Person {name: "Alice"})-[:FRIEND_OF]->(:Person {name: "Eve"})
CREATE (:Person {name: "Eve"})-[:FRIEND_OF]->(:Person {name: "Alice"})
CREATE (:Person {name: "Eve"})-[:FRIEND_OF]->(:Person {name: "Bob"})
How To Choose The Right Database?
อาจจะเลยเนื้อหาของ non-tech ไปหน่อยสำหรับเรื่องนี้ และก็ต้องบอกว่าไม่มีถูกที่สุด หรือแย่ที่สุด ใช้ให้เหมาะสมกับงาน หรือบางทีก็ตามองค์กรไปน่ะแหละ เขาจ่ายตังนี่นา 👀
เป็นไงกันบ้างครับบทความนี้ พอมองภาพออกรึยังนะครับว่าเราจะสามารถเปลี่ยนสิ่งรอบ ๆ ตัวของเราให้เป็นชุดข้อมูลที่สามารถใช้งานได้ ออกมาเป็นยังไงได้บ้าง อาจจะลองฝึกจากของที่อยู่รอบ ๆ ตัว หรือร้านที่อยู่ใกล้ ๆ บ้านแล้วลองมองว่าถ้าเราทำร้านแบบนั้น หรือระบบแบบนั้น เราจะออกแบบข้อมูลออกมายังไงได้บ้างนะ 🤔
สำหรับบทความนี้น่าจะเท่านี้ก่อน ไว้เจอกันใหม่บทความต่อไปของซีรีย์ครับ สวัสดีครับ ขอให้ทุกคนมีความสุขครับ ✌️
FB ไว้ตอบปัญหา: Thanaphoom Babparn
FB Page ไว้ตอบปัญหา & แชร์ไปเรื่อย: TP Coder
LinkedIn: Thanaphoom Babparn
Linktree: https://linktr.ee/tpbabparn