
กำลังโหลด...

กำลังโหลด...

อย่าให้ทุก route ต้องคอยจำว่า email ห้ามซ้ำหรือหนังสือต้องมีเจ้าของ เราจะเขียนกติกาไว้ที่ Schema ให้ PostgreSQL ช่วยป้องกันข้อมูล
erDiagram
USERS ||--o{ BOOKS : owns
USERS {
int id PK
string email UK
string password_hash
}
BOOKS {
int id PK
string title
string author
int user_id FK
}
อ่านว่า: ผู้ใช้หนึ่งคนมีหนังสือได้หลายเล่ม แต่หนังสือหนึ่งเล่มชี้กลับไปหาเจ้าของหนึ่งคน
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL
);
| ส่วน | ความหมาย | ทำไมต้องมี |
|---|---|---|
SERIAL |
สร้างเลข id ต่อให้อัตโนมัติ | ไม่ต้องเดา id เอง |
PRIMARY KEY |
id ห้ามซ้ำ | อ้างถึง user ได้ชัด |
NOT NULL |
ช่องนี้เว้นว่างไม่ได้ | email/password hash จำเป็น |
UNIQUE |
email ซ้ำไม่ได้ | คนหนึ่งมีบัญชีเดียว |
CREATE TABLE books (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
author VARCHAR(255) NOT NULL,
year INTEGER,
user_id INTEGER REFERENCES users(id)
);
บรรทัดสำคัญคือ:
user_id INTEGER REFERENCES users(id)
user_id คือ column ที่เก็บ id ของเจ้าของINTEGER ต้องเป็นชนิดเดียวกับ users.idREFERENCES users(id) บอก PostgreSQL ว่าห้ามชี้ไปหา user ที่ไม่มีจริงyear เก็บปีที่พิมพ์ของหนังสือ เพื่อให้ตรงกับ field year ที่มีอยู่แล้วในโปรเจกต์ books-api
books_db แล้วเปิด Query Toolstarter/schema.sqlSELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public';
ผลลัพธ์ต้องมี users และ books
books ไปแล้วแต่ไม่มี yearไม่ต้องลบ table หรือข้อมูลเดิม ให้รันครั้งเดียวใน Query Tool:
ALTER TABLE books
ADD COLUMN IF NOT EXISTS year INTEGER;
จากนั้นตรวจด้วย:
SELECT id, title, author, year FROM books;
relation "users" does not exist → รัน users ก่อน booksrelation "books" already exists → ไม่ต้องรันซ้ำ หรือใช้ schema starter ที่มี DROP TABLE IF EXISTSbooks ก่อน users → Foreign Key ยังหา table ปลายทางไม่เจอSchema ไม่ใช่แค่สร้างตาราง แต่เป็นกติกาที่ Database จะคอยตรวจให้ทุกครั้งที่มีข้อมูลเข้า