บทที่ 5 การจัดเก็บข้อมูลด้วยฐานข้อมูล PostgreSQL

(Database Management System)

วัตถุประสงค์การเรียนรู้

1) อธิบายความหมายของฐานข้อมูล (Database) ได้

2) อธิบายหน้าที่ของระบบจัดการฐานข้อมูล (DBMS) ได้

3) อธิบายความแตกต่างระหว่าง Database, DBMS และ RDBMS ได้

4) อธิบายความสำคัญของฐานข้อมูลในระบบ Client–Server และ Internet of Things (IoT) ได้

ในบทที่ 4 ได้เรียนรู้การพัฒนา HTTP Server ด้วยภาษา Python และ FastAPI ซึ่งสามารถรับข้อมูลจาก Client เช่น Python Client หรือ ESP32 ผ่านโปรโตคอล HTTP ได้ อย่างไรก็ตาม หาก Server เพียงรับข้อมูลและแสดงผลบนหน้าจอ ข้อมูลจะสูญหายเมื่อโปรแกรมหยุดทำงานหรือเครื่องคอมพิวเตอร์ถูกปิด ดังนั้นจึงจำเป็นต้องมีระบบสำหรับจัดเก็บข้อมูลอย่างถาวร ซึ่งเรียกว่า ฐานข้อมูล (Database)

ตัวอย่างเช่น ระบบตรวจวัดอุณหภูมิที่ ESP32 ส่งข้อมูลทุก 10 วินาที หากไม่มีฐานข้อมูล ผู้ใช้งานจะไม่สามารถดูข้อมูลย้อนหลัง หรือวิเคราะห์แนวโน้มของอุณหภูมิได้ ดังนั้น ฐานข้อมูลจึงเป็นองค์ประกอบสำคัญของระบบเครือข่ายและระบบ Internet of Things (IoT)

5.1 ความรู้พื้นฐานเกี่ยวกับฐานข้อมูล

Database (ฐานข้อมูล) คือ กลุ่มของข้อมูลที่มีความสัมพันธ์กัน ซึ่งถูกจัดเก็บอย่างเป็นระบบ เพื่อให้สามารถเพิ่ม ค้นหา แก้ไข และลบข้อมูลได้อย่างสะดวกและมีประสิทธิภาพ

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

ตัวอย่างข้อมูลที่อาจจัดเก็บในฐานข้อมูล ได้แก่

- ข้อมูลนักศึกษา

- ข้อมูลอาจารย์

- ข้อมูลลูกค้า

- ข้อมูลสินค้า

- ข้อมูลอุณหภูมิจากเซนเซอร์

- ข้อมูลการใช้พลังงานไฟฟ้า

- ข้อมูลจากอุปกรณ์ ESP32

ตัวอย่างการใช้งานในระบบ IoT

เมื่อ ESP32 ส่งข้อมูลอุณหภูมิ เช่น 30.5 °C Server จะนำข้อมูลไปจัดเก็บไว้ในฐานข้อมูลเพื่อให้สามารถเรียกดูย้อนหลังได้

ฐานข้อมูลมีบทบาทสำคัญต่อระบบสารสนเทศ เนื่องจากช่วยให้

- จัดเก็บข้อมูลจำนวนมากได้

- ค้นหาข้อมูลได้รวดเร็ว

- ลดความซ้ำซ้อนของข้อมูล

- เพิ่มความถูกต้องของข้อมูล

- สำรองข้อมูลได้

- รองรับผู้ใช้งานหลายคนพร้อมกัน

- นำข้อมูลไปวิเคราะห์และสร้างรายงานได้

ตัวอย่างเช่น หาก ESP32 ส่งข้อมูลทุก ๆ 5 วินาที ภายใน 1 วัน = 86,400วินาที่ต่อวัน ÷ 5 = 17,280 รายการ ซึงข้อมูลจำนวนมากเช่นนี้ไม่สามารถจัดเก็บในตัวแปรของโปรแกรมได้ จึงจำเป็นต้องใช้ฐานข้อมูล

ระบบจัดการฐานข้อมูล (DBMS)

ระบบจัดการฐานข้อมูล (Database Management System) คือ ซอฟต์แวร์ที่ทำหน้าที่บริหารจัดการฐานข้อมูล โดยทำหน้าที่เป็นตัวกลางระหว่างผู้ใช้งานหรือโปรแกรมประยุกต์กับฐานข้อมูล

DBMS ช่วยให้ผู้ใช้สามารถจัดการข้อมูลได้โดยไม่จำเป็นต้องทราบรายละเอียดของการจัดเก็บข้อมูลภายใน หน้าที่ของ DBMS ได้แก่

- สร้างฐานข้อมูล

- สร้างตาราง

- เพิ่มข้อมูล

- ค้นหาข้อมูล

- แก้ไขข้อมูล

- ลบข้อมูล

- สำรองข้อมูล

- จัดการสิทธิ์ผู้ใช้งาน

ในรายวิชานี้ FastAPI จะติดต่อกับ DBMS และ DBMS จะเป็นผู้จัดการข้อมูลภายในฐานข้อมูล

ระบบจัดการฐานข้อมูลที่นิยมใช้งานในปัจจุบัน ได้แก่

ในรายวิชานี้จะเลือกใช้ PostgreSQL เนื่องจากมีความเสถียร รองรับข้อมูลจำนวนมาก และสามารถใช้งานร่วมกับ Python และ FastAPI ได้อย่างมีประสิทธิภาพ

ระบบจัดการฐานข้อมูลเชิงสัมพันธ์ (RDBMS)

ระบบจัดการฐานข้อมูลเชิงสัมพันธ์ (Relational Database Management System) คือ ระบบจัดการฐานข้อมูลเชิงสัมพันธ์ ซึ่งจัดเก็บข้อมูลในรูปแบบ ตาราง (Table) แต่ละตารางประกอบด้วย

- แถว (Row หรือ Record)

- คอลัมน์ (Column หรือ Field)

- ชนิดข้อมูล (Data Type)


ตัวอย่างตารางข้อมูลเซนเซอร์

แต่ละแถวแทนข้อมูลของอุปกรณ์หนึ่งครั้ง แต่ละคอลัมน์แทนคุณลักษณะของข้อมูล เช่น อุณหภูมิ หรือความชื้น

ความสัมพันธ์ของข้อมูล (Relation)

ฐานข้อมูลเชิงสัมพันธ์ (Relational Database) จัดเก็บข้อมูลในรูปแบบของตาราง (Table) โดยในระบบหนึ่งอาจประกอบด้วยตารางหลายตารางที่จัดเก็บข้อมูลแตกต่างกัน เช่น ตารางข้อมูลอุปกรณ์ ตารางข้อมูลเซนเซอร์ และตารางข้อมูลที่ตรวจวัดได้ อย่างไรก็ตาม ข้อมูลในแต่ละตารางไม่ได้แยกออกจากกันโดยสิ้นเชิง แต่สามารถเชื่อมโยงกันผ่าน ความสัมพันธ์ของข้อมูล (Relationship)

การกำหนดความสัมพันธ์ระหว่างตารางช่วยลดความซ้ำซ้อนของข้อมูล ทำให้สามารถจัดเก็บและค้นหาข้อมูลได้อย่างเป็นระบบ และช่วยรักษาความถูกต้องของข้อมูลภายในฐานข้อมูล

ตัวอย่างเช่น ระบบตรวจวัดอุณหภูมิประกอบด้วยอุปกรณ์ ESP32 หลายตัว โดย ESP32 แต่ละตัวสามารถส่งข้อมูลอุณหภูมิเข้ามายัง Server ได้หลายครั้ง หากนำข้อมูลรายละเอียดของอุปกรณ์ เช่น ชื่ออุปกรณ์ ตำแหน่งติดตั้ง และ IP Address ไปบันทึกซ้ำในทุกแถวของข้อมูลอุณหภูมิ จะทำให้เกิดความซ้ำซ้อนของข้อมูล

ดังนั้น จึงสามารถแยกข้อมูลออกเป็นสองตาราง ได้แก่ DEVICE สำหรับจัดเก็บข้อมูลของอุปกรณ์ และ SENSOR_DATA สำหรับจัดเก็บข้อมูลที่ตรวจวัดได้ แล้วสร้างความสัมพันธ์ระหว่างตารางทั้งสอง

คำว่า Relational หมายถึง ความสัมพันธ์ระหว่างตาราง การเชื่อมโยงข้อมูลระหว่างตารางหนึ่งไปยังอีกตารางหนึ่ง" โดยใช้คีย์หลัก (Primary Key) และคีย์นอก (Foreign Key) เป็นตัวเชื่อม ซึ่งแบ่งออกเป็น 3 รูปแบบหลัก

ในตัวอย่างนี้ device_id ทำหน้าที่เป็น Primary Key ในตาราง DEVICE และถูกนำไปใช้เป็น Foreign Key ในตาราง SENSOR_DATA เพื่อระบุว่าข้อมูลการตรวจวัดแต่ละรายการมาจากอุปกรณ์ใด

โดยทั่วไป ความสัมพันธ์ระหว่างข้อมูลในฐานข้อมูลสามารถแบ่งออกเป็น 3 รูปแบบหลัก ได้แก่ One-to-One, One-to-Many และ Many-to-Many

1. ความสัมพันธ์แบบหนึ่งต่อหนึ่ง (One-to-One Relationship : 1:1)

เป็นความสัมพันธ์ที่ ข้อมูล 1 รายการในตาราง A สัมพันธ์กับข้อมูลได้เพียง 1 รายการในตาราง B เป็นความสัมพันธ์ที่ข้อมูลหนึ่งรายการในตารางหนึ่งสามารถสัมพันธ์กับข้อมูลได้เพียงหนึ่งรายการในอีกตารางหนึ่ง และในทางกลับกัน ข้อมูลในตารางที่สองก็สัมพันธ์กับข้อมูลในตารางแรกได้เพียงหนึ่งรายการเช่นกัน

เป็นการแสดงความสัมพันธ์ของข้อมูลในเอนทิตี้หนึ่งที่มีความสัมพันธ์กับข้อมูลในอีกเอนทิตี้หนึ่ง ในลักษณะหนึ่งต่อหนึ่ง ตัวอย่างเช่น เอนทิตี้สินค้าและเอนทิตี้ใบสั่งซื้อ มีความสัมพันธ์โดยแอททริบิวต์รหัสสินค้ามีความสัมพันธ์กับแอททริบิวต์ชื่อสินค้าเป็นความสัมพันธ์แบบหนึ่งต่อหนึ่ง หมายความว่ารหัสสินค้าหนึ่งเป็นชื่อสินค้าได้ชนิดเดียว

ตัวอย่างในงาน IoT

ESP32 หนึ่งตัว มีข้อมูลการตั้งค่าเพียงชุดเดียว

ความสัมพันธ์แบบ One-to-One มักใช้เมื่อต้องการแยกข้อมูลบางส่วนออกจากตารางหลัก

2. ความสัมพันธ์แบบหนึ่งต่อหลาย (One-to-Many Relationship : 1:N)

เป็นความสัมพันธ์ที่พบมากที่สุดในการออกแบบฐานข้อมูล โดยข้อมูลหนึ่งรายการในตารางหนึ่งสามารถสัมพันธ์กับข้อมูลหลายรายการในอีกตารางหนึ่ง แต่ข้อมูลแต่ละรายการในตารางที่สองจะสัมพันธ์กลับไปยังข้อมูลในตารางแรกเพียงหนึ่งรายการ ข้อมูล เช่น 1 รายการในตาราง A สามารถสัมพันธ์กับข้อมูลหลายรายการในตาราง B แต่ข้อมูลในตาราง B จะอ้างถึงข้อมูลในตาราง A ได้เพียงรายการเดียว

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

หรือ

สมมติว่า ESP32 หมายเลข ESP32-01 ส่งข้อมูลทุก 5 นาที อุปกรณ์ดังกล่าวจะมีข้อมูลในตาราง DEVICE เพียงหนึ่งรายการ แต่จะมีข้อมูลในตาราง SENSOR_DATA จำนวนมาก ตัวอย่างเช่น

จะเห็นได้ว่า device_id เดียวกันสามารถปรากฏในตาราง SENSOR_DATA ได้หลายครั้ง เนื่องจาก ESP32 หนึ่งตัวสามารถสร้างข้อมูลการตรวจวัดได้หลายรายการ

ความสัมพันธ์แบบ One-to-Many จึงเป็นรูปแบบที่สำคัญมากสำหรับระบบ IoT เนื่องจากอุปกรณ์หนึ่งตัวมักสร้างข้อมูลจำนวนมากอย่างต่อเนื่องตลอดระยะเวลาการทำงาน

3. ความสัมพันธ์แบบหลายต่อหลาย (Many-to-Many Relationship)N:N)

ความสัมพันธ์แบบหลายต่อหลาย หรือ Many-to-Many เป็นความสัมพันธ์ที่ข้อมูลหลายรายการในตารางหนึ่งสามารถสัมพันธ์กับข้อมูลหลายรายการในอีกตารางหนึ่งได้

ตัวอย่างเช่น ในระบบ IoT อุปกรณ์หนึ่งตัวอาจรองรับเซนเซอร์หลายประเภท และเซนเซอร์ประเภทเดียวกันสามารถติดตั้งอยู่ในอุปกรณ์หลายตัวได้

ความสัมพันธ์แบบ Many-to-Many ไม่ควรสร้างความสัมพันธ์ระหว่างสองตารางโดยตรงในฐานข้อมูลเชิงสัมพันธ์ แต่ควรสร้าง ตารางกลาง (Junction Table หรือ Associative Table) ขึ้นมาเพื่อเชื่อมโยงข้อมูล ตัวอย่าง

ตาราง DEVICE_SENSOR ทำหน้าที่เชื่อมโยงว่าอุปกรณ์แต่ละตัวติดตั้งเซนเซอร์ชนิดใดบ้าง

การออกแบบฐานข้อมูลสำหรับระบบ IoT

ระบบอินเทอร์เน็ตของสรรพสิ่ง (Internet of Things: IoT) เป็นระบบที่เชื่อมโยงอุปกรณ์ทางกายภาพ เช่น เซนเซอร์ ไมโครคอนโทรลเลอร์ เครื่องจักร และอุปกรณ์อัจฉริยะ เข้ากับเครือข่าย เพื่อให้อุปกรณ์สามารถส่งข้อมูล รับคำสั่ง หรือแลกเปลี่ยนข้อมูลกับระบบอื่นได้โดยอัตโนมัติ

ระบบ IoT ส่วนใหญ่มีการสร้างข้อมูลอย่างต่อเนื่อง ตัวอย่างเช่น อุปกรณ์ ESP32 ที่ติดตั้งเซนเซอร์วัดอุณหภูมิและความชื้น อาจส่งข้อมูลไปยัง Server ทุก ๆ 1 นาที หากระบบมีอุปกรณ์จำนวนมากและทำงานตลอด 24 ชั่วโมง ปริมาณข้อมูลที่เกิดขึ้นจะเพิ่มขึ้นอย่างรวดเร็ว

ดังนั้น การออกแบบฐานข้อมูลจึงเป็นส่วนสำคัญของการพัฒนาระบบ IoT เนื่องจากฐานข้อมูลต้องสามารถจัดเก็บข้อมูลจากอุปกรณ์หลายตัว รองรับข้อมูลที่เกิดขึ้นอย่างต่อเนื่อง และสามารถเรียกดูข้อมูลย้อนหลังเพื่อนำไปวิเคราะห์หรือแสดงผลได้อย่างมีประสิทธิภาพ

โครงสร้างพื้นฐานของระบบ IoT ที่ใช้ฐานข้อมูลสามารถแสดงได้ดังนี้

ระบบดังกล่าว ESP32 ทำหน้าที่อ่านค่าจากเซนเซอร์และส่งข้อมูลผ่านเครือข่ายไปยัง Server โปรแกรม Server จะรับข้อมูล ตรวจสอบความถูกต้อง แยกข้อมูลออกเป็นส่วนต่าง ๆ และบันทึกลงฐานข้อมูล จากนั้นข้อมูลในฐานข้อมูลสามารถนำไปใช้แสดงผลบน Dashboard วิเคราะห์แนวโน้ม หรือใช้เป็นเงื่อนไขในการแจ้งเตือนและควบคุมอุปกรณ์

การวิเคราะห์ความต้องการของระบบ

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

ตัวอย่างระบบตรวจวัดสภาพแวดล้อมภายในอาคาร ประกอบด้วย ESP32 จำนวนหลายตัว แต่ละตัวติดตั้งเซนเซอร์สำหรับตรวจวัดอุณหภูมิและความชื้น ระบบอาจต้องจัดเก็บข้อมูลดังต่อไปนี้

ข้อมูลเหล่านี้สามารถแบ่งออกเป็นกลุ่มตามลักษณะการใช้งาน เช่น ข้อมูลอุปกรณ์ (Device Information) และ ข้อมูลการตรวจวัด (Measurement Data) การแยกข้อมูลออกเป็นกลุ่มช่วยให้สามารถออกแบบตารางฐานข้อมูลได้อย่างเหมาะสม และลดการจัดเก็บข้อมูลที่ซ้ำซ้อน

การกำหนดเอนทิตี

หลังจากวิเคราะห์ความต้องการของระบบแล้ว ขั้นตอนต่อไปคือการกำหนด เอนทิตี (Entity) ซึ่งหมายถึงสิ่งที่ต้องการจัดเก็บข้อมูลภายในฐานข้อมูล สำหรับระบบ IoT ตัวอย่างนี้ สามารถกำหนดเอนทิตีหลักได้ 3 เอนทิตี ได้แก่

DEVICE ใช้สำหรับจัดเก็บข้อมูลเกี่ยวกับอุปกรณ์ IoT เช่น ESP32 ข้อมูลที่อาจจัดเก็บ ได้แก่

SENSOR ใช้สำหรับจัดเก็บข้อมูลเกี่ยวกับเซนเซอร์ที่ติดตั้งกับอุปกรณ์ ข้อมูลที่อาจจัดเก็บ ได้แก่

SENSOR_DATA ใช้สำหรับจัดเก็บค่าที่ตรวจวัดได้จากเซนเซอร์ ข้อมูลที่อาจจัดเก็บ ได้แก่

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

การออกแบบตาราง DEVICE

ตาราง DEVICE ใช้สำหรับจัดเก็บข้อมูลของอุปกรณ์ IoT ที่เชื่อมต่อกับระบบ ตัวอย่างโครงสร้างตาราง

ในตารางนี้ device_id สามารถกำหนดให้เป็น Primary Key เพื่อใช้ระบุอุปกรณ์แต่ละตัวไม่ให้ซ้ำกัน

การออกแบบตาราง SENSOR

อุปกรณ์ IoT หนึ่งตัวอาจเชื่อมต่อกับเซนเซอร์หลายตัว เช่น ESP32 หนึ่งตัวอาจมีทั้งเซนเซอร์วัดอุณหภูมิ ความชื้น แสง และคุณภาพอากาศ ดังนั้น จึงสามารถสร้างตาราง SENSOR เพื่อจัดเก็บข้อมูลของเซนเซอร์แต่ละตัว

ในตารางนี้ sensor_id เป็น Primary Key ส่วน device_id เป็น Foreign Key ที่เชื่อมโยงไปยังตาราง DEVICE ทำให้เกิดความสัมพันธ์แบบ One-to-Many กล่าวคือ อุปกรณ์หนึ่งตัวสามารถติดตั้งเซนเซอร์ได้หลายตัว แต่เซนเซอร์แต่ละตัวจะเชื่อมโยงกับอุปกรณ์หนึ่งตัว

การออกแบบตาราง SENSOR_DATA

ตาราง SENSOR_DATA เป็นตารางที่สำคัญที่สุดสำหรับระบบ IoT เนื่องจากใช้จัดเก็บข้อมูลที่เกิดขึ้นอย่างต่อเนื่องจากเซนเซอร์ ตัวอย่างโครงสร้างตาราง

ในตารางนี้ data_id เป็น Primary Key และ sensor_id เป็น Foreign Key ที่เชื่อมโยงกับตาราง SENSOR ทำให้เกิดความสัมพันธ์ 1:N กล่าวคือ เซนเซอร์หนึ่งตัวสามารถสร้างข้อมูลการตรวจวัดได้หลายรายการตามช่วงเวลา

ความสัมพันธ์ระหว่างตาราง

เมื่อนำตารางทั้งหมดมาเชื่อมโยงกัน จะได้โครงสร้างฐานข้อมูลดังนี้

ระบบ IoT มีลักษณะแตกต่างจากระบบฐานข้อมูลทั่วไป เนื่องจากข้อมูลมักถูกสร้างขึ้นอย่างต่อเนื่องและมีปริมาณเพิ่มขึ้นตามระยะเวลา การออกแบบฐานข้อมูลจึงควรพิจารณาประเด็นสำคัญ เช่น

ตัวอย่างเช่น หากมี ESP32 จำนวน 100 ตัว และแต่ละตัวส่งข้อมูลทุก 1 นาที จะเกิดข้อมูลอย่างน้อย 100 × 60 × 24 = 144,000 รายการต่อวัน หรือมากกว่า 52 ล้านรายการต่อปี ดังนั้น แม้ระบบเริ่มต้นจะมีขนาดเล็ก แต่การออกแบบฐานข้อมูลควรคำนึงถึงการขยายตัวของข้อมูลในอนาคตด้วย

การใช้งาน PostgreSQL และการเชื่อมต่อฐานข้อมูลด้วย Python

PostgreSQL เป็นระบบจัดการฐานข้อมูลเชิงสัมพันธ์แบบโอเพนซอร์ส (Open-Source Relational Database Management System: RDBMS) ที่ใช้ภาษา SQL (Structured Query Language) ในการสร้าง จัดเก็บ ค้นหา และจัดการข้อมูล PostgreSQL ได้รับการออกแบบให้รองรับระบบตั้งแต่ขนาดเล็กไปจนถึงระบบที่มีข้อมูลจำนวนมาก และสามารถทำงานบนระบบปฏิบัติการหลายประเภท เช่น Windows, Linux และ macOS

PostgreSQL มีคุณสมบัติสำคัญ ได้แก่ การรองรับความสัมพันธ์ระหว่างตาราง การกำหนด Primary Key และ Foreign Key การทำ Transaction การควบคุมความถูกต้องของข้อมูล และการรองรับผู้ใช้งานหลายรายพร้อมกัน จึงเหมาะสำหรับการนำมาใช้เป็นฐานข้อมูลของโปรแกรม Server และระบบ IoT

ในระบบ IoT ฐานข้อมูล PostgreSQL สามารถทำหน้าที่จัดเก็บข้อมูลที่ได้รับจากอุปกรณ์ต่าง ๆ เช่น ESP32 โดยโปรแกรม Server จะเป็นตัวกลางระหว่างอุปกรณ์กับฐานข้อมูล ดังแสดงในรูป

ESP32 ไม่จำเป็นต้องเชื่อมต่อกับ PostgreSQL โดยตรง แต่จะส่งข้อมูลผ่านเครือข่ายไปยัง Python Server จากนั้น Python Server จะตรวจสอบและประมวลผลข้อมูลก่อนบันทึกลงฐานข้อมูล

แนวทางนี้ช่วยแยกหน้าที่ของระบบออกจากกันอย่างชัดเจน โดย ESP32 ทำหน้าที่ตรวจวัดและส่งข้อมูล Python Server ทำหน้าที่รับและประมวลผลข้อมูล ส่วน PostgreSQL ทำหน้าที่จัดเก็บและบริหารจัดการข้อมูล

การติดตั้ง PostgreSQL

ดาวน์โหลดและติดตั้ง PostgreSQL Download โดยปกติตัวติดตั้งจะมี PostgreSQL Server และเครื่องมือที่เกี่ยวข้อง ระหว่างติดตั้งจะให้กำหนดรหัสผ่านสำหรับผู้ใช้ postgres ซึ่งควรจำไว้ เพราะ Python จะใช้ข้อมูลนี้ในการเชื่อมต่อฐานข้อมูล

ดำเนินการติดตั้งตามขั้นตอน Step by step ดังนี้



























เปิด pgAdmin 4



จากภาพด้านซ้ายมี Servers แต่ยังไม่ได้ขยายรายการ

คลิกเครื่องหมาย > หน้า Servers

ถ้าเห็นชื่อประมาณ PostgreSQL 18 ให้คลิกที่ชื่อนั้น ระบบอาจถาม Password ให้ใส่รหัสผ่านที่คุณตั้งไว้ตอนติดตั้ง PostgreSQL



เมื่อต่อสำเร็จ จะเห็นโครงสร้างประมาณนี้



หากต้องการ สร้างฐานข้อมูล iot_database ให้คลิกขวาที่ Databases → Create → Database...



ตั้งชื่อว่า iot_database และกด Save



หลังจากนั้นจะได้



ขั้นตอนต่อไปคือ สร้างตาราง device และ sensor_data ดังนี้

1. คลิกเลือก iot_database ที่ด้านซ้าย

2. ไปที่เมนูด้านบน Tools → Query Tool

3. จะมีหน้าต่างสำหรับพิมพ์ SQL เปิดขึ้นมา

4. พิมพ์คำสั่งนี้เพื่อสร้างตาราง device


CREATE TABLE device (
    device_id VARCHAR(20) PRIMARY KEY,
    device_name VARCHAR(100) NOT NULL,
    location VARCHAR(100),
    ip_address VARCHAR(45)
);

5. พิมพ์คำสั่งนี้เพื่อสร้างตาราง sensor_data


CREATE TABLE sensor_data (
    data_id BIGSERIAL PRIMARY KEY,
    device_id VARCHAR(20) NOT NULL,
    temperature NUMERIC(5,2),
    humidity NUMERIC(5,2),
    recorded_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT fk_device
        FOREIGN KEY (device_id)
        REFERENCES device(device_id)
);

สามารถวางคำสั่งทั้งสองชุดพร้อมกันแล้วกดปุ่ม Execute ▶ ได้เลย เมื่อทำสำเร็จ ให้ดูทางซ้ายที่



ถ้าไม่เห็นตาราง ให้คลิกขวาที่ Tables → Refresh

การเพิ่มข้อมูลลงในตาราง

ขั้นตอนต่อไปคือ ทดลองเพิ่มข้อมูล → ตรวจสอบความสัมพันธ์ของตาราง → เชื่อม Python กับ PostgreSQL ตามลำดับนี้

ขั้นตอนที่ 1 เพิ่มข้อมูล ESP32 ลงตาราง device

เปิด Query Tool ของ iot_database แล้วรัน


INSERT INTO device
(device_id, device_name, location, ip_address)
VALUES
('ESP32-01', 'Temperature Node 1', 'Room 101', '192.168.1.101');

ดังลักษณะในรูป



จากนั้นตรวจสอบข้อมูล ด้วยคำสั่ง


SELECT * FROM device;

จะเห็นข้อมูล Device_id ถูกจัดเก็บเพิ่มลงในตาราง device ดังรูป



ขั้นตอนที่ 2 ทดลองเพิ่มข้อมูลอุณหภูมิและความชื้น ลงในตาราง sensor_data โดยใน หน้าต่าง Query ให้รันคำสั่ง

จากนั้นเพิ่มข้อมูลลงในตาราง sensor_id ในหน้าต่าง Query แล้วรันโค้ดดังนี้


INSERT INTO sensor_data
(device_id, temperature, humidity)
VALUES
('ESP32-01', 30.50, 72.40);

และให้ลองเพิ่่มอีก 2 รายการ ดังนี้


INSERT INTO sensor_data
(device_id, temperature, humidity)
VALUES
('ESP32-01', 30.70, 71.80);

INSERT INTO sensor_data
(device_id, temperature, humidity)
VALUES
('ESP32-01', 31.20, 70.50);

ตรวจสอบข้อมูล โดยใช้คำสั่ง ในหน้าต่าง Query


SELECT * FROM sensor_data;

จะปรากฏข้อมูลในตารางดังรูป



จาก SQL จะเห็นความสัมพันธ์เป็นแบบ 1:N (One to Many) ดังลักษณะในรูป



ขั้นตอนที่ 3 ทดลอง JOIN ตาราง

ทดลองนำข้อมูลจากสองตารางมาแสดงร่วมกัน โดยรันโค้ดใน Query


SELECT
    device.device_id,
    device.device_name,
    device.location,
    sensor_data.temperature,
    sensor_data.humidity,
    sensor_data.recorded_at
FROM sensor_data
JOIN device
ON sensor_data.device_id = device.device_id;

จะได้ข้อมูลดังรูป



ขั้นตอนที่ 4 ติดตั้ง Python Library

เปิด Command Prompt (CMD) ของ Windows ไม่ใช่ Query Tool ของ pgAdmin แล้วพิมพ์


pip install "psycopg[binary]"

เมื่อติดตั้งเสร็จ เราจะสร้างไฟล์ Python เช่น postgres_test.py


import psycopg

conn = psycopg.connect(
    host="localhost",
    dbname="iot_database",
    user="postgres",
    password="รหัสผ่านที่ตั้งไว้ตอนติดตั้ง PostgreSQL",
    port=5432
)

print("เชื่อมต่อ PostgreSQL สำเร็จ")

conn.close()

หากรันโค้ดแล้ว ขึ้นข้อความว่า การเชือมต่อ PostgreSQL สำเร็จ แสดงว่าระบบพร้อมสำหรับขั้นตอนสำคัญถัดไป คือ



การทดลองใช้ Python เชื่อมต่อฐานข้อมูล และบันทึกลงฐานข้อมูล

สร้างโปรแกรม Python สำหรับ INSERT โดยสร้างไฟล์ใหม่ insert_sensor.py โดยใช้โค้ดดังนี้


import psycopg

conn = psycopg.connect(
    host="localhost",
    dbname="iot_database",
    user="postgres",
    password="รหัสผ่านของคุณ",
    port=5432
)

device_id = "ESP32-01"
temperature = 30.50
humidity = 72.40

cur = conn.cursor()

sql = """
INSERT INTO sensor_data
(device_id, temperature, humidity)
VALUES (%s, %s, %s)
"""

cur.execute(sql, (device_id, temperature, humidity))

conn.commit()

print("บันทึกข้อมูลสำเร็จ")

cur.close()
conn.close()

แล้วให้รันโปรแกรม หรืออาจจะสั่งรันจาก cmd ด้วยคำสั่ง python insert_sensor.py การการเชื่อมต่อและการ insert ข้อมูลได้ถูกต้อง จะขึ้นข้อความ บันทึกข้อมูลสำเร็จ

ให้กลับไปที่โปรแกรม pgAdmin → Query Tool แล้วรันโค้ด Query เพื่อตรวจดูว่ามีข้อมูลจาก python ใส่ในตารางแล้วหรือยัง


SELECT * FROM sensor_data;

จะปรากฏข้อมูลใหม่ที่ Insert จาก python ซึ่งนั่นหมายความว่า python สามารถทำการบันทึกข้อมูลลงในตาราง sensor_data ของฐานข้อมูลได้



การอ่านข้อมูลกลับจาก PostgreSQL ด้วย python

การอ่านข้อมูลจากตารางจะใช้ คำสั่ง SELECT เพื่อเลือกข้อมููลที่ต้องการนำมาแสดงผล โดยใช้เขียนโค้ดใน IDE ของ python ดังนี้ และตั้งชื่อไฟล์เป็น read_sensor.py


import psycopg

conn = psycopg.connect(
    host="localhost",
    dbname="iot_database",
    user="postgres",
    password="รหัสผ่านของคุณ",
    port=5432
)

cur = conn.cursor()

cur.execute("""
    SELECT device_id,
           temperature,
           humidity,
           recorded_at
    FROM sensor_data
    ORDER BY recorded_at DESC
""")

rows = cur.fetchall()

for row in rows:
    print(row)

cur.close()
conn.close()

หลังจากรันโค้ด python จะติดต่อฐานข้อมูลและนำข้อมูลจากตารางมาแสดงผลดังรูป



การสร้าง TCP Server บันทึกข้อมูลใน PostgreSQL

ให้สร้างไฟล์สำหรับ Server ชื่อ tcp_sever_db.py โดยมีโค้ดดังนี้


import socket
import psycopg

# -------------------------
# PostgreSQL
# -------------------------
conn = psycopg.connect(
    host="localhost",
    dbname="iot_database",
    user="postgres",
    password="รหัสผ่านของคุณ",
    port=5432
)

print("เชื่อมต่อ PostgreSQL สำเร็จ")

# -------------------------
# TCP Server
# -------------------------
HOST = "0.0.0.0"
PORT = 5000

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.bind((HOST, PORT))
server.listen()

print("TCP Server กำลังรอข้อมูลที่ Port", PORT)

while True:

    client, address = server.accept()

    print("Client connected:", address)

    data = client.recv(1024).decode()

    print("ข้อมูลที่ได้รับ:", data)

    try:
        # รูปแบบข้อมูล:
        # ESP32-01,30.5,72.4

        device_id, temp, hum = data.split(",")

        temperature = float(temp)
        humidity = float(hum)

        with conn.cursor() as cur:

            cur.execute(
                """
                INSERT INTO sensor_data
                (device_id, temperature, humidity)
                VALUES (%s, %s, %s)
                """,
                (device_id, temperature, humidity)
            )

        conn.commit()

        print("บันทึกข้อมูลลง PostgreSQL สำเร็จ")

        client.sendall(b"DATA_SAVED")

    except Exception as e:

        conn.rollback()

        print("เกิดข้อผิดพลาด:", e)

        client.sendall(b"ERROR")

    client.close()

เมื่อรันโปรแกรม ด้วยคำสั่ง python tcp_sever_db.py ใน cmd ปรากฏข้อความดังรูป



การสร้าง client จำลองการส่งข้อมูลแทน ESP32

ให้สร้างไฟล์ใหม่ชื่อ tcp_client.py โดยใช้โค้ดดังนี้ เพื่อจำลองการส่งข้อมูลผ่านเครือข่ายแทน ESP32


import socket

HOST = "127.0.0.1"
PORT = 5000

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client.connect((HOST, PORT))

data = "ESP32-01,31.25,70.80"

client.sendall(data.encode())

response = client.recv(1024)

print("Server ตอบกลับ:", response.decode())

client.close()

เมืีอรันโค้ดในฝั่ง Client แล้ว จะปรากฏการตอบรับการรับข้อมูลจากเซิฟเวอร์ดังรูป



และฝั่ง Client จะปรากฏการตอบรับจากเซิฟเวอร์ ดังรูป



ให้ตรวจสอบข้อมูลที่ส่งมาจาก Client ของตาราง sensor_data ด้วยคำสั่ง


SELECT * FROM sensor_data;

จะได้ข้อมูลที่แสดงในตารางดังรูป



Asignment

ให้ใช้ ESP32 อ่านเซนเซอร์ค่าอุณหภูมิแล้วความชื้นจาก DHT22 แล้วส่งข้อมูลให้แก่่เซิฟเวอร์ เพื่อบันทึกข้อมูลลงในตาราง ทุก ๆ 5 วินาที



หัวข้อ