Full Stack AIoT Developer : Part 1 EP 2 : Databases Fundamental
สวัสดีครับ กลับมาอีกแล้วกับ Series Full Stack AIoT Developer ในครั้งนี้เป็นเรื่องของ Databases Fundamental โดยจะเป็นเรื่องเกี่ยวกับการใช้งานฐานข้อมูลทั้งรูปแบบ Structured Data และ Unstructured Data, การ Query, การ Optimize Database รวมถึงการประยุกต์ใช้งานใน IoT Applications ต่างๆ ก็มาเริ่มกันเลยครับ
Database คืออะไร ?
Database คือกลุ่มของข้อมูลที่ถูกเก็บไว้รวมกัน ซึ่งเราสามารถสร้างและจัดการ Database ได้ด้วย DataBases Management System (DBMS) เป็น Software ในการจัดการฐานข้อมูล เช่น Oracle, SQL Sever, MySQL ฯลฯ
ซึ่งใน Database System ที่ใช้ในงาน IoT จะมีอยู่ 2 ลักษณะหลักๆด้วยกันก็คือ
- Relational Databases (RDBMS) หรือ SQL Databases
เป็นลักษณะที่มีการใช้งานอย่างแพร่หลายมาอย่างยาวนาน และ มีระบบที่เป็นพื้นฐานของระบบ Database แบบอื่นๆ
2. NoSQL Databases
เป็นระบบที่พัฒนาขึ้นมาจาก SQL Databases เพื่อแก้ปัญหาในสิ่งที่ SQL Databases ทำได้ไม่ดี
Relational Databases
เป็นระบบฐานข้อมูลที่มีรูปแบบของข้อมูลที่สัมพันธ์กัน โดยจะเก็บข้อมูลอยู่ในลักษณะของตารางที่ประกอบด้วย Row และ Column ทำให้ในแต่ละตาราง การอ้างถึงข้อมูลแต่ละตัวสามารถทำได้โดยการใช้ Index ของ Row และ Column
Unique Values
Unique Values คือการที่แต่ละ Value ใน Column นั้นๆจะต้องมีค่าที่ Unique หรือไม่ซ้ำกันนั้นเอง ซึ่งถ้าเกิดว่าเกิดการซ้ำกันขึ้นจะต้องแจ้งเตือนหรือไม่ก็ห้ามเพิ่มข้อมูลนั้น
Primary Keys
Primary Keys คือ Column ของ Table ที่มีถูกใช้เป็นค่าในการอ้างถึง Table นั้นๆ ซึ่งควรจะเป็น Column ที่มี Unique Values
ถ้าดูจากตารางนี้จะเห็นว่า ทุก Column นั้นสามารถมีการซ้ำได้ดังนั้นเราจึงไม่ควรใช้ Column ไหนเลยเป็น Primary ซึ่งถ้าต้องการใช้ควรที่จะสร้าง ID ขึ้นเพื่อเป็นตัวแทนของแต่ละ Row
จะเห็นว่า Column EmployeeID นั้นน่าจะมีความ Unique ซึ่งเราสามารถสร้าง Column ที่มีเลขแทนแต่ละ Row ได้โดยการใช้วิธีที่เรียกว่า Auto Increment คือการเพิ่มเลขลำดับของ Row อัตโนมัติ
Foreign Keys
จากการที่เรามี Primary Keys ที่เป็นตัวให้ Table อื่นอ้างถึงได้ ส่วนในกรณีที่ Table ของเราต้องการจะอ้างถึง Table อื่นจะใช้สิ่งที่เรียกว่า Foreign Keys
จากตารางจะเห็นว่าเรามี Primary Keys ของ Customer Table อยู่ ซึ่งใน Order Table นั้นต้องการที่จะอ้างถึง Customer Table จึงมี Column ที่ชี้ไปหา Primary Keys เรียกว่า Foreign Keys
Composite Keys
Composite Keys คือ Key ที่เกิดจาก Primary Keys หลาย Column รวมกัน
ซึ่งใช้ในกรณีที่ เมื่อมีหลาย Column ที่รวมกันแล้วมีความหมายเป็น ID ได้ โดยเมื่อ หลาย Column นั้นรวมกันแล้วจะต้อง Unique
Relationship
หลังจากที่เรารู้แล้วว่าในแต่ละตารางนั้นสามารถเชื่อมโยงถึงกันได้ จึงเกิดเป็นสิ่งที่เรียกว่า Relationship ขึ้นมาซึ่งเป็นสิ่งที่บอกว่า แต่ละตารางนั้นเชื่อมโยงกันอยู่ในรูปแบบไหน
โดยประกอบไปด้วย 3 รูปแบบก็คือ
- One to One
- One to Many
- Many to Many
One to One
เป็นตารางที่เชื่อมโยงกันแบบ 1-1แปลว่า 1 ค่าใน Employee Table สามารถ เชื่อมโยงได้แค่ 1 ค่าใน DriverLicense Table
ใช้เพื่อแยกในบางกรณีที่อาจจะมีข้อมูลในตารางหนึ่งมากเกินไปและมีหลายประเภท การที่เราแยกออกมาอาจจะทำให้สามารถดูและ Query ได้ง่ายกว่า
One to Many
ในกรณีนี้ 1 to Many คือการที่ ลูกค้า 1 คน สามารถสั่ง Order ได้หลาย Order ดังนั้นใน Order Table จะมี Foreign Keys ที่โยงไปที่ Customer คนเดียวกัน ได้หลายอัน
Many to Many
ในกรณีนี้คือ การที่นักเรียน 1 คนนั้น สามารถเข้าเรียนได้หลาย Class ส่วน Class 1 Class สามารถมีนักเรียนได้หลายคน จึงเกิดเป็น Many to Many ขึ้นมา
ซึ่งโดยปกติแล้ว Many to Many นั้นจะไม่นิยมเขียน Primary Keys กับ Foreign Keys โยงหากันโดยตรง
มันจะใช้สิ่งที่เรียกว่า Linking Table เป็นตัวกลางในการเชื่อมโยง
ACID
ACID เป็นคุณสมบัติที่ควรมีใน RDBMS ซึ่งยกตัวอย่างจาก Database Banking Transaction
ในกระบวนการโอนเงินของธนาคาร
- ลบเงินออกจาก Account A2354542 $2000
- เพิ่มเงินเข้ากับ Account C9876567 $2000
ซึ่งถ้าเกิดใน 2 กระบวนการนี้มีกระบวนการใดกระบวนการหนึ่งล่ม
จะต้องทำการ ยกเลิกทั้ง Path ที่ทำกระบวนการทั้งหมดให้ได้
ซึ่งเราสามารถทดสอบประสิธิภาพนี้ได้ด้วย The ACID Test
- Atomic คือ การที่ถ้า Transaction ไหนจะเกิดก็ต้องเกิดทั้ง Path ถ้าล่ม ก็ต้องล่มทั้ง Path
- Consistent คือ การทำงานของ Database นั้นจะต้องได้ผลลัพท์ตาม Schema ที่เราสร้างขึ้นมา
- Isolated คือ การที่ไม่ว่าจะมี Transaction ไหนที่ล่ม การทำงานของมันจะต้อง Isolated คือไม่ส่งผลต่อ Transaction อื่น
- Durable คือ ความคงทนที่ไม่ว่า จะเกิด Accident อะไรขึ้นก็ตาม ข้อมูลภายใน Database จะต้องคงที่ไม่เปลี่ยนแปลง
Referential Integrity
คือความถูกต้องในการอ้างอิง หมายความว่า เมื่อมีการอ้างอิงระหว่างตารางนั้นๆ เมื่อมีการแก้ไขตาราง เราจะต้องสร้างรูปแบบในการปรับเปลี่ยนข้อมูลของตารางที่มีการอ้างถึงทั้งหมด ซึ่งรูปแบบจะปรับเปลี่ยนไปตามงานที่ต้องการ โดยจะมี 3 ชนิด
- Cascading Delete
คือ รูปแบบที่เมื่อเกิดการลบตารางที่เป็น Primary Keys ออกไปแล้ว ตารางอื่นๆที่อ้างถึง Primary Keys นั้นจะถูกลบออกไปทั้ง Row ทุก Row
2. Cascading Nullify
คือ รูปแบบที่เมื่อมีการลบ Primary Keys นั้นออกไป จะทำการ เปลี่ยนค่า Primary Keys ที่ Foreign Keys นั้นอ้างถึง เป็นค่า Null แทน
3. No Action
คือ รูปแบบที่ เมื่อมีตัวที่เป็น Primary Keys ถึงสั่งลบ มันจะไปเช็คก่อนว่ายังมี Foreign Keys อยู่ไหม ถ้ายังมีจะไม่ No Action คือไม่ทำ ต้องลบ Foreign Keys ออกก่อนถึงจะลบได้
Database Modeling Optimization
ในการ Design Databases นั้นหลังจากที่เราออกแบบ โครงสร้างเสร็จแล้วเราควรที่จะมา Optimize ดูว่ามีตรงส่วนไหนที่เว่นเว้อหรือไม่เหมาะสมบ้าง โดยจะมีขั้นตอนดังนี้
- First Normal Form
No repeating values and no repeating group
ในการที่มีข้อมูลที่เป็น List ใส่อยู่ใน ช่อง Data ช่องเดียวนั้นไม่ควรทำ
เช่นเดียวกับการที่มี Column ที่เป็น ข้อมูลชนิดเดียวกันอยู่ใน Table เดียวกัน
Right Way
วิธีการที่ดีคือการที่สร้างตารางแยกออกมาโดยนำ Column ที่มีการซ้ำออกมาเขียนแยก
2. Second Normal Form
Any non-key field should be dependent on the entire primary key
คือการที่ ข้อมูลใน Non-Key Field นั้นไม่ควรที่จะมีค่า Dependent กับ Primary Key (Non-Key Field คือ Column อื่นๆนอกจาก Primary Keys)
จากภาพเราจะเห็นว่า Course Title นั้นคือชื่อเต็มของ Course ที่เป็น Primary Key ดังนั้น Table นี้ Violate 2NF
Right Way
วิธีการคือเราต้องแยก ตารางออกมาเป็นรายละเอียดของ Course แทน
3. Third Normal Form
No non-key field is dependent on any other non-key field
คล้ายกับ 2NF แต่จะเป็นว่า Non-Key Field ห้ามขึ้นกับ Non-Key Field
เช่นดังตัวอย่าง Room กับ Capacity นั้นมีความขึ้นต่อกันอยู่
Right Way
ดังนั้นเราจึงควรที่จะแยก Table ออกมาเป็น Table คุณสมบัติของ Room แทน
Database Modeling Query
ในการ Query SQL Database นั้นเราสามารถใช้สิ่งที่เรียกว่า SQL Language ได้
Basic SQL Keywords
SELECT คำสั่งที่ใช้ในการค้นหาข้อมูลที่ต้องการ
FROM คำสั่งเลือก Table ที่จะใช้ข้อมูล
WHERE คำสั่งเงื่อนไข ต้องใส่ก่อนการแปลงรูปแบบ Table
ORDER BY คำสั่งเรียงข้อมูล
GROUP BY คำสั่งจัดกลุ่มข้อมูล
JOIN คำสั่งรวม Table
INSERT INTO คำสั่งเพิ่มข้อมูลเข้าไปใน Table
UPDATE คำสั่งแก้ไขข้อมูล
DELETE คำสั่งลบข้อมูล
HAVING คำสั่งเงื่อนไข สามารถใช้หลังการเปลี่ยนแปลงข้อมูลได้
IN เงื่อนไขที่ใช้บอกว่า อยู่ใน List ที่เรากำหนด ได้ เช่น IN (“A”,”B”) คือ “A” หรือ “B” ก็ได้
LIKE เงื่อนไขความคล้ายคลึงกับข้อความ เช่น LIKE “GREEN%” แปลว่า คำอะไรก็ได้ที่มี นำหน้าด้วย GREEN , % คือเป็นตัวอักษรอะไรก็ได้ความยาวเท่าไรก็ได้, _ คือเป็นตัวอักษร 1 ตัวอะไรก็ได้
IS เงื่อนไขว่า ข้อมูลนั้นเป็น … เช่น IS Null
<,>,≤,≥,<> เงื่อนไขทางคณิตศาสตร์ปกติ
Aggregation Function
คือ Function ที่ใช้ในการคำนวน Row หรือ Column
COUNT(…) นับจำนวน Row ทั้งหมด
MAX(…) ค่าสูงสุดของ Column
SUM(…) ผลรวมของ Column
AVG, MEAN, MIN, …. ฯลฯ
JOIN
ในการรวมหลายตารางเข้าด้วยกัน เราสามารถรวมได้ด้วยคำสั่ง JOIN ซึ่งการรวมจะรวม โดยใช้ Column ที่กำหนดเป็นตัวเชื่อม
เช่นจาก Table ข้างต้นจะะเห็นว่า ใช้การเชื่อมด้วย Column state ของ people และ state_abbrev ของ states
JOIN (INNER JOIN)
เป็นการรวมตารางแบบ Intercept ซึ่ง ถ้ามี Row ไหนที่ Joint Column ไม่ Match กันก็จะลบ Row นั้นออกไปเลย
จากตัวอย่างในตารางจะเห็นได้ว่า state MA และ abbr DE ไม่มีคู่ Match ดังนั้นจะไม่เอาไปใส่ใน Result
ซึ่งตัว INNER JOIN จะเป็นค่า Default ของการ JOIN
LEFT JOIN (LEFT OUTER JOIN)
เป็นการรวม Table แบบซ้ายก่อน ซึ่งถ้ามีค่าที่ ไม่Match ใน Table ซ้าย ก็จะเอาไปใส่ใน Result ด้วย แต่ใน Table ขวาถ้ามีที่ ไม่Match จะไม่เอาไปใส่ใน Result
จะเห็นได้ว่า state MA คือ Table ด้านซ้ายจะใส่ค่าเข้าไปใน Table Result ด้วย แต่เนื่องจากไม่มี Match กับ abbr ไหนเลย เลยใส่ค่าเป็น Null ไว้
RIGHT JOIN (RIGHT OUTER JOIN)
คือการรวม Table แบบขวาก่อน ถ้ามีค่าใน Table ขวาที่ ไม่Match จะให้ใส่ลงไปใน Table Result ด้วย
จะเห็นได้ว่า abbr DE คือ Table ด้านขวาจะใส่ค่าเข้าไปใน Table Result ด้วย แต่เนื่องจากไม่มี Match กับ stateไหนเลย เลยใส่ค่าเป็น Null ไว้
FULL OUTER JOIN
คือการ JOIN แบบที่ไม่ว่าจะ Table ซ้ายหรือขวา ถ้ามีค่าที่ ไม่Match ก็ให้ใส่ลงไปใน Result ด้วย
จะเห็นได้ว่าทั้ง state MA จาก Table ซ้าย และ abbr จาก Table ขวา ก็ถูกใส่ลงไปใน Result
NoSQL
NoSQL คือ เทคโนโลยี Database ที่พัฒนามาเพื่อแก้ปัญหาในสิ่งที่ SQL Database ทำได้ไม่ดี
SQL Vs NoSQL
SQL
+ +
- มี ACID ซึ่งเหมาะกับงานบางประเภท
- ทำงานได้ดีกับ Structured Data ที่มีความสัมพันธ์กัน
— —
- การ Scaling นั้นทำได้ยาก เนื่องจากถ้าเราเพิ่มขนาด ของ SQL Database ขึ้นเรื่อยๆจะต้องใช้ Server ที่มีขนาดใหญ่ขึ้นแล้วทำงานได้ช้าลงมาก
NoSQL
++
- Flexible สามารถใช้งานได้ทั้ง Structured และ Unstructured Data รวมถึงสามารถสร้าง Schema ได้หลายรูปแบบ
- Fast เนื่องจากไม่มีเรื่องของ ACID ทำให้การทำงานนั้นเร็วขึ้น
- ใช้งานง่าย เนื่องจากทุกอย่างถูกจัดเก็บในรูปแบบของ Object ทำให้เข้าใจได้ง่าย
— —
- Lack of Performance Testing Tools
- Lack of Standardization
When to Choose NoSQL Database
ในการเลือกใช้งาน เมื่อไรที่เราควรจะเลือกใช่ NoSQL
- ต้องการ Database ที่สามารถเปลี่ยนแปลงได้และทำงานได้หลากหลาย
- ต้องการ Database ที่สามารถ Scaling ได้
- ต้องการเพิ่มประสิทธิภาพของ Infrastructure ให้ใช้ประโยชน์จาก Storage Resource ให้มากที่สุด
- มีข้อมูลที่เข้าสู่ระดับ Big Data
- สามารถใช้งานกับ Application ต่างๆใน Business ได้
NoSQL’s Possibilities
- สร้าง Web Applications ที่มีความยืดหยุ่นสูง
- ใช้เป็น Caching Layer (Database ที่เก็บ Cache การทำงานเพื่อให้ในการเรียกใช้ครั้งต่อไปใช้งานได้ไวขึ้น)
- เก็บ Binary File
- ใช้ในการ Control Web Applications Permissions
CAP Theorem
เป็นทฤษฏีในการวัดคุณสมบัติของ Databases
Consistency คือ ผลลัพท์จาก Database ที่ User ได้รับจะต้องมีโครงสร้างที่คงที่
Availability คือ สามารถเข้าถึง Database ได้ตลอด
Partition Tolerance คือ สามารถกระจายการใช้งาน Database ได้
เช่น CouchDB เป็น AP
NoSQL Database Types
Document Store
เป็นการเก็บข้อมูลในรูปแบบที่มี Structure คล้ายกลับ Tree ซึ่ึงสามารถ Nested ไปเรื่อยๆได้ เช่น JSON,XML
Key-Value Store
ข้อมูลจะมี Key และ Value ในการ Query เราสามารถใช้ Key ในการ Query เพื่อหา Value ได้
BigTable/Tabular
แต่ละ Row ของ Table จะมี Column ต่างกันใช้สำหรับกรณีที่ข้อมูลมี Column เยอะมาก
Graph
เป็นข้อมูลในรูปแบบที่มีความสัมพันธ์เชื่อมต่อกัน เช่นในรูปแบบ Social Network Relationship
CouchDB
หลังจากที่เรียนรู้ทฤษฏีกันมาแล้ว ก็ลองทำภาคปฏิบัติกันดูครับ โดยจะใช้ CouchDB ที่เป็นตัว NoSQL
Download
สามารถ Download ได้ที่ https://couchdb.apache.org/
Login
หลังจากที่ Download และตั้งค่าเสร็จแล้วก็ให้เปิด http://127.0.0.1:5984/_utils
เพื่อใช้ในการเข้าจัดการ Database
Create Database
สร้าง Database ที่ตัวเองต้องการ
Create Document
สร้างข้อมูลรูปแบบ Document
ลอง Upload ข้อมูลรูปภาพ
สร้าง View เพื่อใช้ในการ Query ข้อมูลที่ต้องการด้วย JavaScript
จากนั้นก็ Execute Code HTML เพื่อใช้ในการสร้างหน้าเว็ปที่ดึงข้อมูลจาก CouchDB