Xóa mềm vs xóa vĩnh viễn: chọn vòng đời dữ liệu phù hợp
Xóa mềm vs xóa vĩnh viễn: tìm hiểu cách giữ lịch sử, tránh tham chiếu hỏng và vẫn đáp ứng yêu cầu xóa quyền riêng tư với quy tắc rõ ràng.

Ý nghĩa thực sự của xóa mềm và xóa vĩnh viễn
“Xóa” có thể mang hai ý nghĩa rất khác nhau. Nhầm lẫn giữa chúng là lý do các nhóm mất lịch sử hoặc không thực hiện được yêu cầu quyền riêng tư.
Một hard delete là điều hầu hết mọi người tưởng tượng: hàng bị loại bỏ khỏi cơ sở dữ liệu. Truy vấn sau đó và nó biến mất. Đó là xóa thật sự, nhưng cũng có thể phá vỡ tham chiếu (như một đơn hàng trỏ tới khách hàng đã bị xóa) trừ khi bạn thiết kế để tránh điều đó.
Một soft delete giữ nguyên hàng, nhưng đánh dấu nó đã bị xóa, thường bằng một trường như deleted_at hoặc is_deleted. Ứng dụng của bạn coi nó như đã biến mất, nhưng dữ liệu vẫn ở đó cho báo cáo, hỗ trợ và kiểm toán.
Quyết định giữa soft delete vs hard delete rất đơn giản: lịch sử hay xóa thực sự. Xóa mềm bảo vệ lịch sử và cho phép “hoàn tác”. Xóa cứng giảm lượng dữ liệu bạn lưu, điều này quan trọng cho quyền riêng tư, bảo mật và các quy định pháp lý.
Các thao tác xóa ảnh hưởng nhiều hơn là chỉ lưu trữ. Chúng thay đổi những câu hỏi nhóm bạn có thể trả lời sau này: một nhân viên hỗ trợ cố gắng hiểu một khiếu nại trước đây, bộ phận tài chính đối chiếu hóa đơn, hoặc compliance kiểm tra ai đã thay đổi gì và khi nào. Nếu dữ liệu biến mất quá sớm, báo cáo thay đổi, tổng số không khớp, và các điều tra trở thành phỏng đoán.
Mô hình tinh thần hữu ích:
- Xóa mềm ẩn một bản ghi khỏi các hiển thị thường ngày nhưng giữ lại để truy vết.
- Xóa cứng loại bỏ bản ghi vĩnh viễn và tối thiểu hóa dữ liệu cá nhân được lưu.
- Nhiều ứng dụng thực tế dùng cả hai: giữ hồ sơ nghiệp vụ, xóa hoặc ẩn danh các chỉ số cá nhân khi cần.
Trong thực tế, bạn có thể xóa mềm một tài khoản người dùng để ngăn đăng nhập và giữ lịch sử đơn hàng, rồi xóa cứng (hoặc ẩn danh) các trường cá nhân sau một khoảng lưu giữ hoặc khi có yêu cầu GDPR right to erasure hợp lệ.
Không có công cụ nào quyết định thay bạn. Ngay cả khi bạn xây dựng bằng nền tảng no-code như AppMaster, công việc thực sự là quyết định, với từng bảng, “bị xóa” có nghĩa là gì và đảm bảo mọi màn hình, báo cáo và API tuân theo cùng một quy tắc.
Những vấn đề thực tế do xóa gây ra trong ứng dụng hàng ngày
Hầu hết các nhóm chỉ nhận ra vấn đề khi có sự cố. Một thao tác xóa “đơn giản” có thể xóa mất bối cảnh, lịch sử và khả năng giải thích điều đã xảy ra.
Hard delete rủi ro vì rất khó hoàn tác. Ai đó nhấn nhầm nút, một job tự động có lỗi, hoặc nhân viên hỗ trợ làm theo quy trình sai. Nếu không có backup sạch và quy trình khôi phục rõ ràng, mất mát đó trở thành vĩnh viễn và tác động lên doanh nghiệp thấy ngay.
Tham chiếu bị vỡ là bất ngờ tiếp theo. Bạn xóa một khách hàng, nhưng đơn hàng của họ vẫn tồn tại. Giờ bạn có đơn hàng trỏ tới chỗ không tồn tại, hóa đơn không thể hiện tên người thanh toán, và cổng thông tin lỗi khi cố tải dữ liệu liên quan. Ngay cả với ràng buộc khóa ngoại, “cách sửa” cũng có thể tệ hơn: cascade delete có thể xóa nhiều hơn bạn định.
Phân tích và báo cáo cũng bị rối. Khi bản ghi cũ biến mất, số liệu thay đổi hồi tố. Tỷ lệ chuyển đổi tháng trước dịch chuyển, giá trị vòng đời giảm, và đường xu hướng xuất hiện lỗ hổng mà không ai giải thích được. Nhóm bắt đầu tranh cãi về số liệu thay vì đưa ra quyết định.
Hỗ trợ và tuân thủ là nơi bị ảnh hưởng nặng nhất. Khách hàng hỏi “Tại sao tôi bị tính phí?” hoặc “Ai đã thay đổi gói của tôi?” Nếu bản ghi đã mất, bạn không thể tái tạo dòng thời gian. Bạn mất dấu kiểm toán trả lời các câu hỏi cơ bản như ai thay đổi, khi nào và vì sao.
Các lỗi phổ biến đằng sau tranh luận soft delete vs hard delete:
- Mất vĩnh viễn do xóa nhầm hoặc tự động hóa lỗi
- Thiếu bản ghi cha khiến con bị mồ côi (đơn hàng, vé)
- Báo cáo thay đổi vì các hàng lịch sử biến mất
- Trường hợp hỗ trợ không thể trả lời vì thiếu lịch sử
Khi nào xóa mềm là lựa chọn tốt hơn
Xóa mềm thường là lựa chọn an toàn khi một bản ghi có giá trị dài hạn hoặc liên kết tới dữ liệu khác. Thay vì loại bỏ hàng, bạn đánh dấu nó là đã xóa (ví dụ deleted_at hoặc is_deleted) và ẩn khỏi giao diện bình thường. Trong quyết định soft delete vs hard delete, mặc định này giảm bất ngờ sau này.
Nó hữu ích ở bất cứ đâu bạn cần bản ghi kiểm toán trong cơ sở dữ liệu. Đội vận hành thường cần trả lời các câu hỏi như “Ai đã thay đổi đơn hàng này?” hoặc “Tại sao hóa đơn này bị hủy?” Nếu bạn xóa cứng quá sớm, bạn mất bằng chứng cần cho tài chính, hỗ trợ và báo cáo tuân thủ.
Xóa mềm cũng cho phép “hoàn tác”. Admin có thể khôi phục một vé đóng nhầm, đem lại một sản phẩm đã lưu kho, hoặc phục hồi nội dung do người dùng tạo sau báo cáo spam sai. Dòng khôi phục kiểu này khó cung cấp nếu dữ liệu đã bị loại bỏ vật lý.
Quan hệ là lý do lớn khác. Xóa cứng một bản ghi cha có thể phá rối ràng buộc khóa ngoại hoặc để lại khoảng trống khó hiểu trong báo cáo. Với xóa mềm, phép join vẫn ổn định và tổng lịch sử giữ nguyên (doanh thu theo ngày, đơn hàng đã hoàn, thống kê thời gian phản hồi).
Xóa mềm là mặc định tốt cho các bản ghi nghiệp vụ như vé hỗ trợ, tin nhắn, đơn hàng, hóa đơn, log kiểm toán, lịch sử hoạt động và hồ sơ người dùng (ít nhất cho đến khi xác nhận xóa vĩnh viễn).
Ví dụ: một nhân viên hỗ trợ “xóa” ghi chú đơn hàng chứa sai sót. Với xóa mềm, ghi chú biến mất khỏi UI bình thường, nhưng cấp trên vẫn xem được khi khiếu nại, và báo cáo tài chính vẫn giải thích được.
Khi nào bắt buộc phải xóa cứng
Xóa mềm là mặc định tốt, nhưng có lúc giữ dữ liệu (kể cả ẩn) là sai lầm. Hard delete loại bỏ hoàn toàn và đôi khi là lựa chọn duy nhất phù hợp với luật pháp, an ninh hoặc chi phí.
Trường hợp rõ ràng nhất là nghĩa vụ về quyền riêng tư và hợp đồng. Nếu người dùng yêu cầu GDPR right to erasure, hoặc hợp đồng cam kết xóa sau một khoảng, “đánh dấu là đã xóa” thường không đủ. Bạn có thể phải xóa hàng, các bản sao liên quan và mọi định danh có thể truy ngược tới cá nhân.
Bảo mật là lý do khác. Một số dữ liệu quá nhạy cảm để giữ lại: token truy cập thô, mã đặt lại mật khẩu, khóa riêng tư, mã xác thực một lần, hoặc bí mật chưa mã hóa. Giữ chúng cho lịch sử hiếm khi đáng giá so với rủi ro.
Xóa cứng cũng phù hợp khi cần mở rộng. Nếu bạn có bảng khổng lồ chứa sự kiện, log hoặc telemetry cũ, xóa mềm làm cơ sở dữ liệu tăng dần và làm chậm truy vấn. Chính sách dọn dẹp theo kế hoạch giúp hệ thống nhanh và chi phí ổn định.
Xóa cứng thường hợp lý cho dữ liệu tạm thời (cache, session, import nháp), thông tin bảo mật ngắn hạn (token đặt lại, OTP, mã mời), tài khoản thử nghiệm/demo, và bộ dữ liệu lịch sử lớn chỉ cần tổng hợp.
Một cách tiếp cận thiết thực là tách “lịch sử nghiệp vụ” khỏi “dữ liệu cá nhân”. Ví dụ giữ hóa đơn cho kế toán, nhưng xóa cứng (hoặc ẩn danh) các trường hồ sơ người dùng nhận dạng cá nhân.
Nếu nhóm bạn tranh luận soft delete vs hard delete, dùng bài kiểm tra đơn giản: nếu giữ dữ liệu tạo rủi ro pháp lý hoặc bảo mật, thì xóa cứng (hoặc ẩn danh không thể phục hồi) nên thắng.
Cách mô hình xóa mềm mà không bị bất ngờ
Xóa mềm tốt nhất khi nó nhàm chán và dễ đoán. Mục tiêu đơn giản: bản ghi ở lại trong DB, nhưng các phần bình thường của ứng dụng hành xử như thể nó đã biến mất.
Chọn một tín hiệu xóa và làm rõ nghĩa của nó
Bạn sẽ thấy ba mẫu phổ biến: deleted_at timestamp, cờ is_deleted, hoặc enum trạng thái. Nhiều đội thích deleted_at vì nó trả lời hai câu hỏi cùng lúc: đã xóa hay chưa, và khi nào xảy ra.
Nếu bạn đã có nhiều trạng thái vòng đời (active, pending, suspended), enum trạng thái vẫn có thể dùng, nhưng giữ “deleted” tách biệt khỏi “archived” và “deactivated.” Chúng khác nhau:
- Deleted: không nên xuất hiện trong danh sách bình thường hoặc có thể dùng.
- Archived: giữ cho lịch sử, nhưng vẫn hiển thị trong chế độ “quá khứ”.
- Deactivated: tạm vô hiệu, thường người dùng có thể phục hồi.
Xử lý các trường duy nhất trước khi gây phiền toái
Tranh luận soft delete vs hard delete thường vỡ ở các trường duy nhất như email, username hoặc mã đơn hàng. Nếu người dùng “bị xóa” nhưng email vẫn lưu và vẫn là duy nhất, người đó không thể đăng ký lại.
Hai cách sửa phổ biến: áp dụng tính duy nhất chỉ cho các hàng chưa xóa, hoặc viết lại giá trị khi xóa (ví dụ thêm hậu tố ngẫu nhiên). Chọn phụ thuộc vào yêu cầu quyền riêng tư và kiểm toán.
Làm rõ quy tắc lọc (và nhất quán)
Quyết định ai thấy gì. Quy tắc phổ biến: người dùng bình thường không thấy bản ghi đã xóa, người hỗ trợ/admin thấy với nhãn rõ ràng, và xuất khẩu/báo cáo chỉ bao gồm khi được yêu cầu.
Đừng trông chờ “ai cũng nhớ thêm bộ lọc.” Đặt quy tắc ở một nơi: views, truy vấn mặc định, hoặc tầng truy cập dữ liệu. Nếu bạn dùng AppMaster, điều này thường có nghĩa là gắn bộ lọc vào cách endpoint và Business Process lấy dữ liệu, để hàng đã xóa không vô tình xuất hiện lại ở màn mới.
Ghi lại ý nghĩa trong một ghi chú nội bộ ngắn (hoặc comment schema). Bạn sẽ cảm ơn bản thân tương lai khi “deleted”, “archived” và “deactivated” xuất hiện cùng một cuộc họp.
Giữ tham chiếu nguyên vẹn: cha, con và phép join
Xóa phá ứng dụng thường nhất thông qua quan hệ. Một bản ghi hiếm khi đứng một mình: người dùng có đơn hàng, vé có comment, dự án có file. Khó khăn trong soft delete vs hard delete là giữ tham chiếu nhất quán trong khi vẫn cho sản phẩm hành xử như mục “biến mất”.
Khóa ngoại: chọn chế độ lỗi một cách có chủ đích
Khóa ngoại bảo vệ bạn khỏi tham chiếu hỏng, nhưng mỗi tùy chọn có ý nghĩa khác nhau:
- RESTRICT chặn xóa nếu còn bản ghi con.
- SET NULL cho phép xóa nhưng tách đứa con khỏi cha.
- CASCADE xóa tự động bản ghi con.
- NO ACTION tương tự RESTRICT trong nhiều DB, nhưng thời điểm thực hiện khác nhau.
Nếu dùng xóa mềm, RESTRICT thường là mặc định an toàn. Bạn giữ hàng, khóa vẫn hợp lệ, và tránh con trỏ tới chỗ không tồn tại.
Xóa mềm trong quan hệ: ẩn mà không làm mồ côi
Xóa mềm thường không thay đổi khóa ngoại. Thay vào đó, bạn lọc các cha đã xóa trong app và báo cáo. Nếu một khách hàng bị soft-deleted, hóa đơn của họ vẫn join đúng, nhưng màn hình không hiển thị khách hàng đó trong dropdown.
Với attachments, comment và log hoạt động, quyết định “xóa” nghĩa là gì với người dùng. Một số đội giữ cấu trúc nhưng loại bỏ phần rủi ro: thay nội dung file bằng placeholder nếu quyền riêng tư yêu cầu, đánh dấu comment là của người dùng đã xóa (hoặc ẩn danh tác giả), và giữ log bất biến.
Join và báo cáo cần quy tắc rõ: có bao gồm hàng đã xóa không? Nhiều đội giữ hai truy vấn chuẩn: “chỉ active” và “bao gồm đã xóa,” để hỗ trợ và báo cáo không vô tình ẩn lịch sử quan trọng.
Bước từng bước: thiết kế vòng đời dữ liệu dùng cả hai cách
Chính sách thực tế thường dùng xóa mềm cho sai lầm hàng ngày và xóa cứng cho nhu cầu pháp lý hoặc quyền riêng tư. Nếu bạn coi đây là một quyết định đơn lẻ (soft delete vs hard delete) bạn sẽ bỏ qua phần trung gian: giữ lịch sử một thời gian, rồi loại bỏ những gì phải đi.
Kế hoạch 5 bước đơn giản
Bắt đầu bằng cách phân loại dữ liệu thành vài nhóm. “Hồ sơ người dùng” là dữ liệu cá nhân, “giao dịch” là hồ sơ tài chính, và “log” là lịch sử hệ thống. Mỗi nhóm cần quy tắc khác nhau.
Kế hoạch ngắn gọn hiệu quả cho hầu hết nhóm:
- Xác định nhóm dữ liệu và chủ sở hữu, đồng thời ghi rõ ai phê duyệt xóa.
- Đặt quy tắc lưu giữ và khôi phục.
- Quyết định dữ liệu nào được ẩn danh thay vì xóa.
- Thêm bước dọn dẹp theo thời gian (xóa mềm trước, xóa cứng sau).
- Ghi một sự kiện audit cho mỗi thao tác xóa, khôi phục và dọn dẹp (ai, khi nào, gì, vì sao).
Minh họa bằng một kịch bản
Giả sử khách hàng yêu cầu đóng tài khoản. Xóa mềm bản ghi người dùng ngay để họ không thể đăng nhập và bạn không phá vỡ tham chiếu. Sau đó ẩn danh các trường cá nhân không nên giữ (tên, email, điện thoại), trong khi giữ các dữ kiện giao dịch không cá nhân cần cho kế toán. Cuối cùng, job dọn dẹp theo lịch sẽ xóa những gì còn là dữ liệu cá nhân sau thời gian chờ.
Các sai lầm và bẫy thường gặp
Nhóm gặp rắc rối không phải vì chọn sai phương án, mà vì triển khai không đồng đều. Mẫu phổ biến: trên giấy là soft delete vs hard delete, nhưng thực tế là “ẩn ở một màn hình và quên hết phần còn lại.”
Một lỗi dễ mắc: bạn ẩn bản ghi đã xóa trong UI, nhưng chúng vẫn xuất hiện qua API, xuất CSV, công cụ admin, hoặc job đồng bộ dữ liệu. Người dùng nhanh chóng nhận ra khi một “khách hàng đã xóa” xuất hiện trong danh sách email hoặc tìm kiếm trên di động.
Báo cáo và tìm kiếm là bẫy khác. Nếu truy vấn báo cáo không lọc nhất quán các hàng đã xóa, tổng số lệch và dashboard mất độ tin cậy. Trường hợp tệ nhất là job nền re-index hoặc gửi lại các mục đã xóa vì chúng không áp dụng cùng quy tắc.
Hard delete cũng có thể đi quá xa. Một cascade delete duy nhất có thể xóa đơn hàng, hóa đơn, tin nhắn và log mà bạn thực sự cần cho kiểm toán. Nếu phải xóa cứng, hãy rõ ràng về những gì được phép biến mất và những gì phải giữ hoặc ẩn danh.
Ràng buộc duy nhất gây đau đầu với xóa mềm. Nếu người dùng xóa tài khoản rồi muốn đăng ký lại bằng cùng email, đăng ký có thể thất bại nếu hàng cũ vẫn giữ email. Lập kế hoạch cho điều này sớm.
Đội compliance sẽ hỏi: bạn chứng minh được việc xóa đã diễn ra và khi nào? “Chúng tôi nghĩ là đã xóa” sẽ không qua nhiều kiểm tra chính sách lưu giữ. Giữ timestamp xóa, ai/khi nào khởi tạo, và một mục log bất biến.
Trước khi triển khai, kiểm tra toàn bộ bề mặt: API, xuất khẩu, tìm kiếm, báo cáo và job nền. Đồng thời xem xét cascade bảng từng bảng, và xác nhận người dùng có thể tái tạo dữ liệu “duy nhất” như email hoặc username nếu đó là cam kết sản phẩm.
Checklist nhanh trước khi phát hành
Trước khi chọn soft delete vs hard delete, kiểm tra hành vi thực tế của ứng dụng, không chỉ schema.
- Khôi phục an toàn và dự đoán được. Nếu admin “undelete” thứ gì đó, nó có trở lại đúng trạng thái mà không hồi sinh dữ liệu cần giữ mất (như token đã thu hồi)?
- Truy vấn ẩn dữ liệu đã xóa theo mặc định. Màn hình mới, xuất khẩu và API không nên vô tình bao gồm hàng đã xóa. Quyết một quy tắc và áp dụng khắp nơi.
- Tham chiếu không bị vỡ. Đảm bảo khóa ngoại và join không tạo bản ghi mồ côi hoặc màn hình thiếu dữ liệu.
- Dọn dẹp có lịch và chủ sở hữu. Xóa mềm chỉ là nửa kế hoạch. Xác định khi nào dữ liệu bị xóa vĩnh viễn, ai chạy, và gì được ngoại lệ (ví dụ tranh chấp đang mở).
- Ghi lại xóa giống như mọi hành động nhạy cảm khác. Lưu ai khởi xóa, khi nào và lý do.
Sau đó test đường quyền riêng tư end-to-end. Bạn có thể thực hiện yêu cầu quyền được xóa theo GDPR trên mọi bản sao, xuất khẩu, chỉ mục tìm kiếm, bảng phân tích và tích hợp, không chỉ cơ sở dữ liệu chính?
Cách thực tế để xác minh là chạy một lần “xóa người dùng” thử trong môi trường staging và theo dấu luồng dữ liệu.
Ví dụ: xóa một người dùng trong khi giữ lịch sử thanh toán
Một khách hàng yêu cầu: “Xóa tài khoản tôi.” Bạn cũng có hóa đơn phải giữ cho kế toán và kiểm tra chargeback. Đây là nơi soft delete vs hard delete trở nên thực tế: bạn có thể loại quyền truy cập và thông tin cá nhân trong khi giữ hồ sơ tài chính mà doanh nghiệp phải lưu.
Tách “tài khoản” khỏi “hồ sơ thanh toán.” Tài khoản liên quan đăng nhập và nhận dạng. Hồ sơ thanh toán liên quan giao dịch đã diễn ra.
Cách làm sạch:
- Xóa mềm tài khoản để họ không thể đăng nhập và hồ sơ biến mất khỏi các chế độ hiển thị bình thường.
- Giữ hóa đơn và thanh toán là bản ghi vẫn tồn, nhưng ngừng liên kết chúng với các trường cá nhân.
- Ẩn danh dữ liệu cá nhân (tên, email, điện thoại, địa chỉ) bằng cách thay bằng giá trị trung tính như “Deleted User” kèm tham chiếu nội bộ không nhận diện.
- Xóa cứng các mục truy cập nhạy cảm như API token, password hash, session, refresh token và thiết bị nhớ.
- Giữ lại chỉ những gì thực sự cần cho tuân thủ và hỗ trợ, và ghi rõ lý do.
Vé hỗ trợ và tin nhắn thường ở giữa. Nếu nội dung tin nhắn chứa dữ liệu cá nhân, bạn có thể cần gỡ một phần nội dung, xóa file đính kèm, và giữ lại “vỏ” vé (timestamp, danh mục, kết quả) để theo dõi chất lượng. Nếu sản phẩm gửi tin (email/SMS, Telegram), loại bỏ định danh đầu ra để không tiếp tục liên hệ người đó.
Hỗ trợ thường vẫn thấy: số hóa đơn, ngày, số tiền, trạng thái và ghi chú rằng người dùng đã bị xóa cùng thời điểm. Những gì không được thấy là bất kỳ thứ gì định danh: email đăng nhập, tên đầy đủ, địa chỉ, phương thức thanh toán lưu, hoặc phiên đang hoạt động.
Bước tiếp theo: đặt quy tắc, rồi hiện thực nhất quán
Quyết định xóa chỉ bền khi được viết ra và triển khai giống nhau khắp sản phẩm. Hãy coi soft delete vs hard delete là câu hỏi chính sách trước, không phải mẹo lập trình.
Bắt đầu bằng một chính sách lưu giữ dữ liệu đơn giản ai cũng đọc được. Nó nên nói rõ bạn giữ gì, giữ bao lâu và vì sao. “Vì sao” quan trọng vì nó cho biết mục tiêu nào thắng khi hai mục tiêu mâu thuẫn (ví dụ lịch sử hỗ trợ vs yêu cầu quyền riêng tư).
Mặc định tốt thường là: xóa mềm cho bản ghi nghiệp vụ hàng ngày (đơn hàng, vé, dự án), xóa cứng cho dữ liệu thực sự nhạy cảm (token, bí mật) và mọi thứ bạn không nên lưu.
Khi chính sách rõ ràng, xây dựng các luồng thi hành: chế độ “thùng rác” để khôi phục, “hàng đợi purge” để xóa không thể phục hồi sau kiểm tra, và view audit cho thấy ai làm gì và khi nào. Làm cho “purge” khó hơn “delete” để tránh dùng nhầm.
Nếu bạn triển khai trong AppMaster (appmaster.io), nên mô hình trường xóa mềm trong Data Designer và tập trung logic delete, restore, purge vào một Business Process, để cùng quy tắc được áp dụng khắp màn hình và endpoint.
Câu hỏi thường gặp
Một hard delete xóa vật lý hàng (row) khỏi cơ sở dữ liệu, nên các truy vấn sau đó sẽ không tìm thấy nữa. Một soft delete giữ hàng đó nhưng đánh dấu là đã xóa (thường với deleted_at), nên ứng dụng ẩn nó trong giao diện bình thường trong khi vẫn bảo lưu lịch sử cho hỗ trợ, kiểm toán và báo cáo.
Ưu tiên dùng soft delete cho các bản ghi nghiệp vụ bạn có thể cần giải thích sau này, như đơn hàng, hóa đơn, vé hỗ trợ, tin nhắn và lịch sử hoạt động tài khoản. Nó giảm nguy cơ mất dữ liệu do vô tình, giữ nguyên quan hệ và cho phép “hoàn tác” an toàn mà không cần khôi phục từ backup.
Hard delete phù hợp khi việc giữ dữ liệu tạo ra rủi ro về bảo mật hoặc quyền riêng tư, hoặc khi quy định yêu cầu xóa thực sự. Ví dụ thường gặp: token đặt lại mật khẩu, mã OTP, phiên đăng nhập, API token, và dữ liệu cá nhân phải bị xóa sau khi có yêu cầu hợp lệ hoặc hết hạn lưu giữ.
Một deleted_at kiểu timestamp là lựa chọn phổ biến vì nó cho biết cả việc đã bị xóa và khi nào xảy ra. Nó hỗ trợ quy trình thực tế như cửa sổ lưu giữ (ví dụ dọn dẹp sau 30 ngày) và trả lời câu hỏi kiểm toán (“khi nào mục này bị xóa?”) mà không cần log riêng cho thời điểm.
Các trường duy nhất như email hoặc tên người dùng thường chặn việc đăng ký lại nếu hàng “đã xóa” vẫn giữ giá trị đó. Cách xử lý phổ biến: chỉ áp dụng ràng buộc duy nhất cho các hàng chưa xóa, hoặc ghi đè/viết lại giá trị khi xóa (ví dụ thêm hậu tố ngẫu nhiên). Chọn phương án tùy vào yêu cầu quyền riêng tư và kiểm toán của bạn.
Hard xóa cha có thể làm mồ côi bản ghi con (như đơn hàng) hoặc kích hoạt cascade xóa nhiều thứ bạn không mong muốn. Soft delete thường tránh tham chiếu hỏng vì khóa vẫn hợp lệ, nhưng bạn vẫn cần bộ lọc nhất quán để phụ huynh đã xóa không xuất hiện trong dropdown hay giao diện người dùng.
Nếu bạn hard delete các hàng lịch sử, các tổng số trước đây có thể thay đổi, xu hướng tạo khoảng trống và con số tài chính có thể không khớp với những gì đã thấy trước đó. Soft delete giúp bảo toàn lịch sử, nhưng chỉ khi báo cáo và truy vấn phân tích định nghĩa rõ có bao gồm hàng đã xóa hay không và áp dụng nhất quán.
“Đã xóa mềm” thường không đủ cho quyền được xóa theo GDPR vì dữ liệu cá nhân có thể vẫn tồn trong cơ sở dữ liệu hoặc bản sao lưu. Mẫu thực tế là: vô hiệu hóa truy cập ngay, sau đó xóa hoặc làm ẩn danh vĩnh viễn các chỉ số nhận dạng cá nhân trong khi vẫn giữ các thông tin giao dịch không cá nhân cần cho kế toán hoặc tranh chấp.
Khôi phục phải đưa bản ghi về trạng thái an toàn và hợp lệ mà không làm hồi sinh những mục nhạy cảm nên vẫn mất, như phiên hoặc token đặt lại. Cần có quy tắc rõ ràng cho dữ liệu liên quan để không khôi phục tài khoản mà thiếu mối quan hệ hoặc quyền cần thiết.
Tập trung hóa hành vi xóa, khôi phục và dọn dẹp để mọi API, màn hình, xuất khẩu và job nền đều áp dụng cùng bộ lọc. Trong AppMaster, việc này thường làm bằng cách thêm trường xóa mềm trong Data Designer và triển khai logic một lần trong một Business Process để endpoint mới không vô tình lộ dữ liệu đã xóa.


