Tới nội dung chính
hstation
Dịch vụDự ánVề tôiBlogThư viện nhạc

Kỹ thuật · 3 phút đọc · 2026-08-31

Vì sao tôi đặt ràng buộc pháp lý vào cơ sở dữ liệu

Một quy trình viết trong tài liệu sẽ bị bỏ qua vào tuần bận nhất. Một ràng buộc CHECK thì không.

Trong dự án gần nhất, tôi có một quy tắc đơn giản: không được công bố tên khách hàng trên trang dự án nếu chưa có văn bản đồng ý.

Quy tắc đó nằm trong tài liệu quy trình, có một ô tích trong danh sách kiểm tra trước khi xuất bản, và mọi người trong đội đều biết.

Nó vẫn bị bỏ qua.

Vì sao danh sách kiểm tra thất bại

Danh sách kiểm tra hoạt động tốt khi người dùng nó có thời gian và không chịu áp lực. Đúng những lúc đó thì rủi ro cũng thấp nhất.

Vấn đề nằm ở tuần cuối trước hạn phát hành, khi một người phải xuất bản mười hai trang trong hai ngày. Đó là lúc danh sách kiểm tra biến thành thao tác tích cho xong, và cũng đúng là lúc một sai sót gây hậu quả lớn nhất.

Tôi không nghĩ giải pháp là kỷ luật tốt hơn. Kỷ luật là thứ cạn kiệt được, còn hệ thống thì không.

Đưa quy tắc xuống tầng thấp nhất có thể

Quy tắc đó bây giờ là một ràng buộc trong cơ sở dữ liệu:

  • Trạng thái xuất bản chỉ được đặt khi có đủ ba trường: thời điểm duyệt công bố, người duyệt, và đường dẫn tới bằng chứng.
  • Người duyệt không được trùng người viết bài. Một người không tự duyệt việc công bố tên khách hàng của chính bài mình viết.

Không có đường vòng. Không có cờ để tạm tắt. Một câu lệnh cập nhật thiếu điều kiện sẽ bị chính cơ sở dữ liệu từ chối, dù nó đến từ giao diện quản trị, từ một script di trú dữ liệu, hay từ một người gõ SQL trực tiếp lúc hai giờ sáng.

Ranh giới của cách làm này

Không phải quy tắc nào cũng nên nằm ở đây. Tôi áp dụng khi cả ba điều sau đúng:

  • Vi phạm gây hậu quả pháp lý hoặc tài chính, không chỉ là bất tiện.
  • Quy tắc phát biểu được bằng một biểu thức trên dữ liệu của chính hàng đó.
  • Quy tắc ổn định, không đổi theo từng chiến dịch hay từng khách hàng.

Quy tắc về giọng văn, về kích thước ảnh, về thứ tự các mục trong menu thì không thuộc nhóm này. Chúng thay đổi thường xuyên, và đưa vào lược đồ chỉ tạo ra ma sát.

Cái giá phải trả

Cách này có chi phí thật. Ràng buộc nằm trong cơ sở dữ liệu nghĩa là mỗi lần đổi quy tắc là một lần di trú lược đồ. Thông báo lỗi mà cơ sở dữ liệu trả về cũng khó đọc hơn nhiều so với một thông báo do ứng dụng tự viết, nên phần giao diện phải dịch chúng sang tiếng người.

Tôi chấp nhận cả hai. Đổi quy tắc pháp lý vốn là việc hiếm và đáng được cân nhắc kỹ, còn việc dịch thông báo lỗi thì làm một lần dùng mãi.