Full Stack AIoT Developer : Part 1 EP 2 : Databases Fundamental

Natchapol Patamawisut
7 min readApr 7, 2020

--

สวัสดีครับ กลับมาอีกแล้วกับ 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 ฯลฯ

DataBases Management System (DBMS)

ซึ่งใน Database System ที่ใช้ในงาน IoT จะมีอยู่ 2 ลักษณะหลักๆด้วยกันก็คือ

  1. Relational Databases (RDBMS) หรือ SQL Databases
SQL Databases

เป็นลักษณะที่มีการใช้งานอย่างแพร่หลายมาอย่างยาวนาน และ มีระบบที่เป็นพื้นฐานของระบบ Database แบบอื่นๆ

2. NoSQL Databases

NoSQL Databases

เป็นระบบที่พัฒนาขึ้นมาจาก SQL Databases เพื่อแก้ปัญหาในสิ่งที่ SQL Databases ทำได้ไม่ดี

Relational Databases

เป็นระบบฐานข้อมูลที่มีรูปแบบของข้อมูลที่สัมพันธ์กัน โดยจะเก็บข้อมูลอยู่ในลักษณะของตารางที่ประกอบด้วย Row และ Column ทำให้ในแต่ละตาราง การอ้างถึงข้อมูลแต่ละตัวสามารถทำได้โดยการใช้ Index ของ Row และ Column

Relational Databases

Unique Values

Unique Values

Unique Values คือการที่แต่ละ Value ใน Column นั้นๆจะต้องมีค่าที่ Unique หรือไม่ซ้ำกันนั้นเอง ซึ่งถ้าเกิดว่าเกิดการซ้ำกันขึ้นจะต้องแจ้งเตือนหรือไม่ก็ห้ามเพิ่มข้อมูลนั้น

Primary Keys

Primary Keys คือ Column ของ Table ที่มีถูกใช้เป็นค่าในการอ้างถึง Table นั้นๆ ซึ่งควรจะเป็น Column ที่มี Unique Values

Relational Databases

ถ้าดูจากตารางนี้จะเห็นว่า ทุก Column นั้นสามารถมีการซ้ำได้ดังนั้นเราจึงไม่ควรใช้ Column ไหนเลยเป็น Primary ซึ่งถ้าต้องการใช้ควรที่จะสร้าง ID ขึ้นเพื่อเป็นตัวแทนของแต่ละ Row

จะเห็นว่า Column EmployeeID นั้นน่าจะมีความ Unique ซึ่งเราสามารถสร้าง Column ที่มีเลขแทนแต่ละ Row ได้โดยการใช้วิธีที่เรียกว่า Auto Increment คือการเพิ่มเลขลำดับของ Row อัตโนมัติ

Foreign Keys

จากการที่เรามี Primary Keys ที่เป็นตัวให้ Table อื่นอ้างถึงได้ ส่วนในกรณีที่ Table ของเราต้องการจะอ้างถึง Table อื่นจะใช้สิ่งที่เรียกว่า Foreign Keys

Foreign Keys

จากตารางจะเห็นว่าเรามี Primary Keys ของ Customer Table อยู่ ซึ่งใน Order Table นั้นต้องการที่จะอ้างถึง Customer Table จึงมี Column ที่ชี้ไปหา Primary Keys เรียกว่า Foreign Keys

Composite Keys

Composite Keys คือ Key ที่เกิดจาก Primary Keys หลาย Column รวมกัน

Composite Keys

ซึ่งใช้ในกรณีที่ เมื่อมีหลาย Column ที่รวมกันแล้วมีความหมายเป็น ID ได้ โดยเมื่อ หลาย Column นั้นรวมกันแล้วจะต้อง Unique

Relationship

หลังจากที่เรารู้แล้วว่าในแต่ละตารางนั้นสามารถเชื่อมโยงถึงกันได้ จึงเกิดเป็นสิ่งที่เรียกว่า Relationship ขึ้นมาซึ่งเป็นสิ่งที่บอกว่า แต่ละตารางนั้นเชื่อมโยงกันอยู่ในรูปแบบไหน

โดยประกอบไปด้วย 3 รูปแบบก็คือ

  1. One to One
  2. One to Many
  3. Many to Many

One to One

One to One Relationship

เป็นตารางที่เชื่อมโยงกันแบบ 1-1แปลว่า 1 ค่าใน Employee Table สามารถ เชื่อมโยงได้แค่ 1 ค่าใน DriverLicense Table

ใช้เพื่อแยกในบางกรณีที่อาจจะมีข้อมูลในตารางหนึ่งมากเกินไปและมีหลายประเภท การที่เราแยกออกมาอาจจะทำให้สามารถดูและ Query ได้ง่ายกว่า

One to Many

One to Many Relationship

ในกรณีนี้ 1 to Many คือการที่ ลูกค้า 1 คน สามารถสั่ง Order ได้หลาย Order ดังนั้นใน Order Table จะมี Foreign Keys ที่โยงไปที่ Customer คนเดียวกัน ได้หลายอัน

Many to Many

Many to Many Relationship

ในกรณีนี้คือ การที่นักเรียน 1 คนนั้น สามารถเข้าเรียนได้หลาย Class ส่วน Class 1 Class สามารถมีนักเรียนได้หลายคน จึงเกิดเป็น Many to Many ขึ้นมา

ซึ่งโดยปกติแล้ว Many to Many นั้นจะไม่นิยมเขียน Primary Keys กับ Foreign Keys โยงหากันโดยตรง

มันจะใช้สิ่งที่เรียกว่า Linking Table เป็นตัวกลางในการเชื่อมโยง

Many to Many with Linking Table

ACID

ACID เป็นคุณสมบัติที่ควรมีใน RDBMS ซึ่งยกตัวอย่างจาก Database Banking Transaction

Banking Transaction

ในกระบวนการโอนเงินของธนาคาร

  1. ลบเงินออกจาก Account A2354542 $2000
  2. เพิ่มเงินเข้ากับ Account C9876567 $2000

ซึ่งถ้าเกิดใน 2 กระบวนการนี้มีกระบวนการใดกระบวนการหนึ่งล่ม

จะต้องทำการ ยกเลิกทั้ง Path ที่ทำกระบวนการทั้งหมดให้ได้

ซึ่งเราสามารถทดสอบประสิธิภาพนี้ได้ด้วย The ACID Test

  1. Atomic คือ การที่ถ้า Transaction ไหนจะเกิดก็ต้องเกิดทั้ง Path ถ้าล่ม ก็ต้องล่มทั้ง Path
  2. Consistent คือ การทำงานของ Database นั้นจะต้องได้ผลลัพท์ตาม Schema ที่เราสร้างขึ้นมา
  3. Isolated คือ การที่ไม่ว่าจะมี Transaction ไหนที่ล่ม การทำงานของมันจะต้อง Isolated คือไม่ส่งผลต่อ Transaction อื่น
  4. Durable คือ ความคงทนที่ไม่ว่า จะเกิด Accident อะไรขึ้นก็ตาม ข้อมูลภายใน Database จะต้องคงที่ไม่เปลี่ยนแปลง

Referential Integrity

คือความถูกต้องในการอ้างอิง หมายความว่า เมื่อมีการอ้างอิงระหว่างตารางนั้นๆ เมื่อมีการแก้ไขตาราง เราจะต้องสร้างรูปแบบในการปรับเปลี่ยนข้อมูลของตารางที่มีการอ้างถึงทั้งหมด ซึ่งรูปแบบจะปรับเปลี่ยนไปตามงานที่ต้องการ โดยจะมี 3 ชนิด

  1. 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 ดูว่ามีตรงส่วนไหนที่เว่นเว้อหรือไม่เหมาะสมบ้าง โดยจะมีขั้นตอนดังนี้

  1. 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

--

--

Natchapol Patamawisut
Natchapol Patamawisut

Written by Natchapol Patamawisut

Studying Computer Engineering at King Mongkut's University of Technology Thonburi

No responses yet