Phỏng vấn thiết kế cơ sở dữ liệu: chuẩn hóa, quan hệ, khóa và giao dịch

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Ngoài viết truy vấn, nhiều nhà tuyển dụng muốn biết bạn có thiết kế được cấu trúc dữ liệu hợp lý hay không. Một bài toán thiết kế cơ sở dữ liệu nhỏ, ví dụ hệ thống bán hàng hoặc quản lý khóa học, rất thường xuất hiện. Bài này giúp bạn có quy trình rõ ràng để trả lời.

Quy trình thiết kế đơn giản

  1. Làm rõ yêu cầu: hệ thống có những đối tượng nào, ai làm gì với chúng.
  2. Xác định thực thể (bảng): ví dụ người dùng, khóa học, đơn hàng.
  3. Xác định thuộc tính và khóa chính cho mỗi bảng.
  4. Xác định quan hệ: một-một, một-nhiều, nhiều-nhiều.
  5. Chuẩn hóa và kiểm tra lại với các truy vấn chính mà ứng dụng cần.

Các loại quan hệ

  • Một-nhiều: một khách hàng có nhiều đơn hàng. Bảng đơn hàng có khóa ngoại customer_id.
  • Một-một: một người dùng có một hồ sơ chi tiết; thường tách để giảm cột ít dùng.
  • Nhiều-nhiều: một học viên đăng ký nhiều khóa học và một khóa học có nhiều học viên. Cần bảng trung gian.
CREATE TABLE students (  id INT PRIMARY KEY AUTO_INCREMENT,  name VARCHAR(100) NOT NULL);CREATE TABLE courses (  id INT PRIMARY KEY AUTO_INCREMENT,  title VARCHAR(200) NOT NULL);CREATE TABLE enrollments (  student_id INT NOT NULL,  course_id INT NOT NULL,  enrolled_at DATETIME NOT NULL,  PRIMARY KEY (student_id, course_id),  FOREIGN KEY (student_id) REFERENCES students(id),  FOREIGN KEY (course_id) REFERENCES courses(id));

Bảng enrollments vừa biểu diễn quan hệ nhiều-nhiều, vừa lưu thông tin riêng của quan hệ như thời điểm đăng ký. Khóa chính kép còn ngăn một học viên đăng ký trùng cùng một khóa học.

Chuẩn hóa là gì?

Chuẩn hóa là quá trình tổ chức dữ liệu để giảm trùng lặp và tránh lỗi cập nhật. Ba dạng chuẩn đầu tiên thường được hỏi:

  • 1NF: mỗi ô chỉ chứa một giá trị nguyên tử, không lưu danh sách phân tách bằng dấu phẩy.
  • 2NF: đã đạt 1NF và mọi thuộc tính không khóa phụ thuộc vào toàn bộ khóa chính, không chỉ một phần.
  • 3NF: đã đạt 2NF và các thuộc tính không khóa không phụ thuộc bắc cầu vào thuộc tính không khóa khác.

Ví dụ vi phạm: lưu cả city và zip_code và tên tỉnh trong bảng đơn hàng khiến cùng một thông tin lặp lại nhiều dòng. Tách thành bảng riêng sẽ gọn và nhất quán hơn.

Khi nào nên phi chuẩn hóa?

Chuẩn hóa tốt cho tính đúng đắn, nhưng truy vấn có thể phải nối nhiều bảng. Với báo cáo đọc nhiều hoặc dữ liệu cần phản hồi cực nhanh, đôi khi người ta chủ động lưu thêm bản sao như tổng tiền đơn hàng hay số lượng bình luận. Đây là sự đánh đổi có ý thức: nhanh hơn khi đọc nhưng bạn phải bảo đảm giữ dữ liệu đồng bộ khi ghi.

Chọn khóa chính

Khóa tự tăng đơn giản và hiệu quả. UUID tiện cho hệ thống phân tán và không lộ số lượng bản ghi, nhưng lớn hơn và có thể ảnh hưởng hiệu năng chỉ mục. Tránh dùng dữ liệu đời thực dễ đổi như email hay số điện thoại làm khóa chính; nên đặt ràng buộc UNIQUE cho chúng.

Xóa mềm và dữ liệu lịch sử

Thay vì xóa hẳn, nhiều hệ thống dùng cột deleted_at để đánh dấu xóa (soft delete), giúp khôi phục và giữ lịch sử. Hãy nhắc cả mặt trái: truy vấn phải luôn lọc dòng đã xóa, và ràng buộc duy nhất cần được thiết kế cẩn thận.

Câu hỏi mở rộng thường gặp

  • Lưu giá tiền bằng kiểu gì? Nên dùng kiểu số thập phân cố định hoặc lưu số nguyên theo đơn vị nhỏ nhất, tránh số thực dấu phẩy động.
  • Lưu mật khẩu thế nào? Chỉ lưu giá trị băm bằng thuật toán chuyên dụng, không bao giờ lưu mật khẩu gốc.
  • Khi nào dùng NoSQL? Khi cấu trúc linh hoạt, dữ liệu dạng tài liệu hoặc cần mở rộng ngang; còn quan hệ phức tạp và toàn vẹn chặt vẫn hợp với cơ sở dữ liệu quan hệ.

Ví dụ bài thiết kế: hệ thống bán hàng nhỏ

Giả sử người phỏng vấn yêu cầu thiết kế cơ sở dữ liệu cho cửa hàng trực tuyến. Một cách tiếp cận gọn gàng:

  • users: thông tin tài khoản.
  • products: tên, giá hiện tại, tồn kho.
  • orders: thuộc về một người dùng, có trạng thái và thời điểm tạo.
  • order_items: các dòng chi tiết của đơn, lưu product_id, số lượng và đơn giá tại thời điểm mua.

Điểm hay nên nhắc: đơn giá phải được sao chép vào order_items thay vì chỉ tham chiếu giá sản phẩm hiện tại, vì giá có thể đổi sau này nhưng đơn hàng cũ phải giữ nguyên số tiền đã tính. Đây là ví dụ đẹp cho một dạng phi chuẩn hóa có chủ đích. Hãy hỏi lại người phỏng vấn về các yêu cầu như mã giảm giá, nhiều địa chỉ giao hàng, hoàn trả để cho thấy bạn nghĩ sâu.

Kết luận

Trong bài thiết kế, hãy vẽ sơ đồ trước, nói rõ giả định và sẵn sàng thay đổi khi người phỏng vấn thêm yêu cầu. Đó là kỹ năng quan trọng không kém bản thân sơ đồ cuối cùng.

Muốn luyện thiết kế và truy vấn dữ liệu qua dự án thật, bạn có thể tìm các khóa phù hợp tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment