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.

meme-expectation-reality


1) Giảm dữ liệu: Quantize xuống 512 màu

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

palette-quantized-512


2) Máy tính ≠ mắt người

Test thực tế cho thấy RGB không “giống con người”:


3) Schema & indexing: để hệ thống chạy nhanh khi lớn

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

4) System flow