0

Single-select và Multi-select: Chuyện chiếc Form tưởng dễ mà hành cả Frontend lẫn Backend

Chào anh em trên Viblo! Tiếp nối series giải ngố các khái niệm trong thế giới lập trình, hôm nay chúng ta sẽ bàn về một chủ đề tưởng chừng như là "bài học vỡ lòng" nhưng lại khiến không ít anh em Dev phải vò đầu bứt tai khi dự án phình to: Sự khác biệt giữa Single-select (Lựa chọn đơn) và Multi-select (Lựa chọn đa).

Khi làm form nhập liệu, việc chọn sai component không chỉ khiến người dùng (UX) bực mình mà còn tạo ra một đống "nợ kỹ thuật" (technical debt) cho mấy anh em Backend ngồi thiết kế Database. Hãy cùng mổ xẻ bản chất của hai khái niệm này nhé!

1. Single-select (Lựa chọn đơn) - "Một rừng không thể có hai hổ"

Đúng như tên gọi, Single-select ép người dùng vào thế độc tôn: Chỉ được phép chọn duy nhất MỘT giá trị từ một danh sách có sẵn. Khi chọn một option mới, option cũ sẽ tự động bị hủy.

Góc nhìn UI/UX (Frontend):

  • Radio Buttons: Phù hợp khi danh sách có ít lựa chọn (dưới 5 options). Ví dụ: Chọn giới tính (Nam/Nữ/Khác), Chọn phương thức thanh toán. Người dùng nhìn lướt qua là thấy hết các lựa chọn mà không cần click.
  • Dropdown / Select box (<select>): Phù hợp khi danh sách dài dằng dặc (như chọn Tỉnh/Thành phố, Năm sinh). Nó giúp tiết kiệm không gian màn hình.

Góc nhìn Database (Backend):

  • Xử lý nhàn hạ: Dữ liệu đẩy từ Client lên Server chỉ là một giá trị đơn thuần (String, Integer, hoặc Boolean).
  • Lưu trữ dễ dàng: Bạn chỉ cần tạo đúng một cột (column) trong bảng Database là xong. Ví dụ: cột role_id, cột status, cột gender. Indexing hay Query trên các cột này cũng cực kỳ nhanh và chuẩn xác.

2. Multi-select (Lựa chọn đa) - "Càng đông càng vui"

Multi-select mang lại sự tự do: Người dùng có thể chọn không, một, hoặc nhiều giá trị cùng lúc từ danh sách.

Góc nhìn UI/UX (Frontend):

  • Checkboxes: Phù hợp với danh sách ngắn. Người dùng tick vào những ô họ muốn (ví dụ: Chọn sở thích, Chọn các tính năng bổ sung).
  • Multiple Dropdown (<select multiple>) hoặc Tag Input: Khi danh sách quá dài, UI/UX hiện đại thường dùng các thư viện như Select2, React Select để làm ra một cái ô search, người dùng gõ đến đâu chọn đến đó, và các lựa chọn hiện ra dưới dạng các cục Tags (Chips).

Góc nhìn Database (Backend) - Nơi giông bão bắt đầu:

Dữ liệu gửi từ Frontend lên không còn là một giá trị đơn, mà là một Mảng (Array). Ví dụ: ['reading', 'traveling', 'coding']. Lúc này, anh em Backend sẽ đứng trước ngã ba đường để lưu trữ:

  • Tà đạo (Comma-separated string): Lưu thẳng thành một chuỗi "reading,traveling,coding" vào một cột hobbies. Cách này cực kỳ tệ hại. Nếu sếp yêu cầu: "Tìm tất cả user thích traveling", bạn sẽ phải dùng truy vấn LIKE %traveling%, làm chết toàn bộ Index của Database và dễ sinh lỗi truy vấn sai.
  • Tạm ổn (JSON Column): Các hệ quản trị CSDL hiện đại (MySQL 5.7+, PostgreSQL) đã hỗ trợ cột JSON. Lưu nguyên cái mảng vào cột JSON. Cách này tiện, query được, nhưng khó quản lý tính toàn vẹn dữ liệu (toàn vẹn tham chiếu).
  • Chuẩn mực (Pivot Table / Many-to-Many): Đây là cách tốt nhất trong SQL. Bạn tạo một bảng phụ (ví dụ: user_hobbies) nối giữa bảng users và bảng hobbies. Thêm bớt sở thích cực kỳ linh hoạt, query tối ưu, đúng chuẩn thiết kế cơ sở dữ liệu quan hệ.

3. Khi nào dùng cái nào? (Quy tắc "Vàng" cho UX và Hệ thống)

Đừng phó mặc cho cảm tính, hãy tuân theo các quy tắc sau khi thiết kế form:

  • Trạng thái của đối tượng (Status): Bắt buộc dùng Single-select. Một đơn hàng không thể vừa ở trạng thái "Đang giao" vừa "Đã hủy" được.
  • Phân quyền hệ thống (Roles/Permissions): Thường là Multi-select. Một User có thể vừa mang quyền Editor vừa có quyền Moderator.
  • Nguyên tắc không gian: Nếu có ít hơn 5 lựa chọn, hãy ưu tiên dùng Radio hoặc Checkbox để người dùng không phải tốn thêm 1 click chuột để mở Dropdown.
  • Validate dữ liệu (Backend): Với Multi-select, luôn nhớ phải validate cái Mảng được gửi lên. Phải check xem mảng có rỗng không, số lượng phần tử tối đa được chọn là bao nhiêu, và từng phần tử trong mảng có thực sự tồn tại trong Database hay không (tránh trường hợp user dùng Postman fake data gửi ID bậy bạ lên).

Lời kết

Việc phân biệt và sử dụng đúng Single-select hay Multi-select không chỉ làm cho giao diện của bạn trở nên trực quan, dễ dùng hơn mà còn quyết định trực tiếp đến kiến trúc Database và hiệu năng truy vấn sau này. Hy vọng qua bài viết này, anh em đã có cái nhìn tổng quan và thiết kế form chuẩn chỉ hơn cho các dự án sắp tới!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí