Trong dự án mình từng làm, mình nhận một yêu cầu nghe rất đơn giản: “Cho phép người dùng tìm ảnh theo màu sắc.”
Nghĩ thì dễ: ảnh có màu → lấy màu → so sánh → trả kết quả. Nhưng khi bắt tay, từng lớp vấn đề hiện ra: dữ liệu “khủng”, RGB không giống cách mắt người cảm nhận, và tốc độ truy vấn khi scale. Bài này kể lại hành trình đó theo kiểu vừa đủ show, don’t tell, kèm code chạy được, schema, index, và flow.

Nếu lưu nguyên: DB phình to, query chậm. Mình quantize: gom các giá trị gần nhau thành mốc cố định (nhảy 32 mỗi kênh) ⇒ còn 512 màu. Nhẹ hẳn, đủ “độ phân giải” cho use case search theo màu.
🎨 Bảng màu gốc vs bảng 512 màu sau quantize
Test thực tế cho thấy RGB không “giống con người”:
erDiagram
PHOTOS {
int id PK
string filename
}
PHOTO_COLORS {
int id PK
int photo_id FK
int r
int g
int b
float lab_l
float lab_a
float lab_b
}
PHOTOS ||--o{ PHOTO_COLORS : contains