table และชนิดข้อมูล
ก่อนที่คุณจะ insert, read, update หรือ delete row ข้อมูลสัก row ได้ คุณต้องมีที่ให้ row นั้นอยู่อาศัยเสียก่อน ใน PostgreSQL บ้านหลังนั้นก็คือ table: table ที่มีชื่อซึ่งประกอบด้วย column หลายตัว โดยทุก column มี data type ที่ตายตัวและมี constraints ชุดหนึ่งซึ่งจะใส่หรือไม่ใส่ก็ได้
ชนิดข้อมูลเป็นตัวกำหนดว่า column หนึ่งสามารถเก็บค่าแบบใดได้บ้าง — จำนวนเต็ม ข้อความสักท่อน หรือช่วงเวลาขณะหนึ่ง — และ constraints เป็นตัวกำหนดว่าฐานข้อมูลจะยอมรับชุดค่าผสมแบบใดได้บ้างตั้งแต่แรก
การผสมผสานนี้เองที่ทำให้ relational database น่าเชื่อถือ column ที่กำหนดชนิดเป็น integer จะไม่มีวันแอบเก็บคำว่า “twelve” และ column ที่ทำเครื่องหมายไว้ว่า NOT NULL จะไม่มีวันลงเอยด้วยค่าว่าง รูปทรงที่คุณประกาศไว้ตั้งแต่ต้นจะกลายเป็น contract ที่ server บังคับใช้กับทุกการเขียนข้อมูล ตลอดไป
table คืออะไรกันแน่
หัวข้อที่มีชื่อว่า “table คืออะไรกันแน่”table คือคำนิยาม ไม่ใช่แค่ถังเก็บของ เมื่อคุณสร้าง table ขึ้นมา คุณกำลังบอก server สามอย่างพร้อมกัน คือ ชื่อ ของแต่ละ column, ชนิดข้อมูล และ กฎ ที่ค่าต้องเป็นไปตาม ทั้งสามอย่างนี้รวมกันนิยามรูปทรงที่ทุก row ต้องเข้าได้พอดี
| ส่วนประกอบของ table | สิ่งที่คุณประกาศ | ตัวอย่าง |
|---|---|---|
| Column name | ป้ายชื่อของฟิลด์ | email |
| Data type | ชนิดของค่าที่อนุญาต | text, integer, timestamptz |
| Constraint | กฎที่ค่าต้องเป็นไปตาม | NOT NULL, UNIQUE, CHECK |
เมื่อ table มีตัวตนแล้ว PostgreSQL จะคอยปกป้องรูปทรงนั้น ลองเก็บข้อความใน column ที่เป็น numeric หรือเก็บค่าซ้ำใน column ที่เป็น UNIQUE ดูสิ คำสั่งนั้นจะถูกปฏิเสธพร้อม error — ข้อมูลเสีย ๆ จะไม่มีวันเล็ดลอดเข้าไปได้
ชิ้นส่วนต่าง ๆ ประกอบกันอย่างไร
หัวข้อที่มีชื่อว่า “ชิ้นส่วนต่าง ๆ ประกอบกันอย่างไร”บทเรียนทั้งสี่ในโมดูลนี้ต่อยอดซึ่งกันและกัน คุณเริ่มต้นด้วยการสร้าง table เลือกชนิดที่เหมาะสมให้แต่ละ column ติดตั้ง constraints ที่คอยรักษาความถูกต้องของข้อมูล และสุดท้ายเรียนรู้ที่จะเปลี่ยนแปลงทั้งหมดนั้นอย่างปลอดภัยเมื่อแอปพลิเคชันของคุณเติบโตขึ้น
flowchart TD A[CREATE TABLE] --> B[Choose a data type per column] B --> C[Attach constraints] C --> D[A trustworthy table shape] D --> E[ALTER TABLE to evolve it] E --> D
มองครั้งแรก
หัวข้อที่มีชื่อว่า “มองครั้งแรก”นี่คือ table ขนาดเล็กที่ใช้ column อย่างละหนึ่งสำหรับแต่ละแนวคิดที่คุณจะได้พบในโมดูลนี้: identity primary key, column ที่มีชนิดกำกับ และ constraints อีกสองสามตัว ยังไม่ต้องกังวลกับทุกคีย์เวิร์ดในตอนนี้ — แต่ละอย่างจะมีบทเรียนของตัวเอง
CREATE TABLE members ( id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY, email text NOT NULL UNIQUE, full_name text NOT NULL, joined_on date NOT NULL DEFAULT current_date, is_active boolean NOT NULL DEFAULT true);อ่านจากบนลงล่าง: สมาชิกทุกคนจะได้รับ id ที่ถูกสร้างให้โดยอัตโนมัติ ต้องมี email ที่ไม่ซ้ำกันและ full_name เข้าร่วมในวันที่มีค่าเริ่มต้นเป็นวันนี้ และมีสถานะ active เว้นแต่จะระบุเป็นอย่างอื่น รูปทรงทั้งหมดอธิบายจบได้ในห้าบรรทัด และ server จะบังคับใช้ให้ครบทุกข้อ
ใน pgAdmin: ขยายฐานข้อมูลของคุณใน browser ทางด้านซ้าย เปิด Schemas แล้ว public แล้ว Tables จากนั้นคุณจะเห็นแต่ละ table ที่คุณสร้าง คลิกขวาที่ table แล้วเลือก Properties จะแสดง column, ชนิดข้อมูล และ constraints ในมุมมองแบบฟอร์ม
โมดูลนี้ครอบคลุมอะไรบ้าง
หัวข้อที่มีชื่อว่า “โมดูลนี้ครอบคลุมอะไรบ้าง”- Creating tables — คำสั่ง
CREATE TABLE, การประกาศ column และชนิด, primary key อัตโนมัติ และการ drop table ที่คุณไม่ต้องการแล้ว - Data types — ชิ้นส่วนพื้นฐานหลัก ๆ: ตัวเลข, text, boolean, วันที่และเวลา, UUID, JSON, array และชนิดแบบ enumerated ที่คุณนิยามเอง
- Constraints — กฎที่คอยรักษาความถูกต้องของข้อมูล: primary key และ foreign key, ความไม่ซ้ำกัน, not-null, check และ default
- Altering schema — การเปลี่ยนแปลง table ที่ใช้งานอยู่ด้วย
ALTER TABLEโดยไม่สูญเสียข้อมูล และเหตุใดการเปลี่ยนแปลงบางอย่างจึงต้องใช้ความระมัดระวังมากกว่าอย่างอื่น
เคล็ดลับและข้อควรระวัง
หัวข้อที่มีชื่อว่า “เคล็ดลับและข้อควรระวัง”- การออกแบบ table คือขั้นตอนที่สำคัญที่สุดที่คุณทำกับข้อมูลใน column เพราะชนิดที่ดีและ constraints ที่ถูกต้องช่วยป้องกันข้อมูลเสียทั้งหมวดหมู่ไม่ให้มีตัวตนได้ตั้งแต่แรก
- ชนิดข้อมูลไม่ใช่แค่คำใบ้สำหรับการจัดเก็บ PostgreSQL จะปฏิเสธค่าที่เข้าไม่ได้ ซึ่งเปลี่ยนบั๊กของแอปพลิเคชันที่อาจเกิดขึ้นจำนวนมากให้กลายเป็น error ที่เห็นได้ชัดทันที
- ฐานข้อมูลเป็นคนตรวจ constraints เอง กฎจึงมีผลเสมอไม่ว่าแอปพลิเคชัน, driver หรือบุคคลใดจะเป็นผู้เขียนข้อมูล
- คุณสามารถเปลี่ยน table ในภายหลังได้ แต่การเปลี่ยน table production ที่มีการใช้งานหนาแน่นนั้นต้องวางแผน บทเรียนสุดท้ายครอบคลุมวิธีทำอย่างปลอดภัย