Cảm ơn cậu đã bày tỏ quan điểm nha ![:smile: :smile:](https://daynhauhoc.com/images/emoji/twitter/smile.png?v=9)
Tớ đồng ý với cậu rằng logical deletion không thể áp dụng trong TH của cậu (có requirement về unique key). Logical deletion không phải silver bullet, nó có nhiều nhược điểm, như mọi quyết định kỹ thuật khác.
Ngoài ra, trong thực tế tớ cũng từng thấy các hệ thống sử dụng kết hợp giữa cả 2 phương pháp: logical deletion khi cần xoá toàn bộ model, và physical deletion với TH xoá các bảng kết nối. Đó cũng là một lựa chọn ![:smile: :smile:](https://daynhauhoc.com/images/emoji/twitter/smile.png?v=9)
Uhm, foreign key đúng là 1 phần của database schema design, cơ mà tớ hi vọng cậu đồng ý là không nhất thiết phải sử dụng tính năng foreign key của database manager system để mô tả foreign key ![:smile: :smile:](https://daynhauhoc.com/images/emoji/twitter/smile.png?v=9)
Về lý do nó không flexible khi maintain (tớ nên đề cập là database maintain, không phải code maintain
), tớ cũng có đề cập một ví dụ ở comment trước. Vấn đề chủ yếu của tính năng foreign key là việc nó yêu cầu dữ liệu phải được thêm vào/xoá đi theo đúng tuần tự, và nó cũng kiểm tra ràng buộc bất cứ thời điểm thêm/sửa/xoá dữ liệu nào, để đảm bảo data integrity. Cá nhân tớ nghĩ, ràng buộc này không cần thiết phải để ở phía database, nó chỉ khiến cho nhiều thao tác maintain nào trên database khó khăn hơn thôi.
Ngoài ra, data integrity thực ra có thể đạt được một cách logic với transaction ở application rồi ![:smile: :smile:](https://daynhauhoc.com/images/emoji/twitter/smile.png?v=9)
Tớ đồng ý với cậu, các model đơn giản thường hay dùng soft-deletion. Do vậy, nó thường xuất hiện nhiều khi sử dụng microservice, khi các model của từng service thường đơn giản hơn.
Về link stackoverflow, cậu có thể thấy 2 luồng ý kiến về việc này. Câu hỏi đó được đóng lại vì các câu trả lời đều là opinion-based, và cậu có thể thấy nó đang được tiếp diễn ở đây ![:smile: :smile:](https://daynhauhoc.com/images/emoji/twitter/smile.png?v=9)
Bất cứ lựa chọn kỹ thuật nào cũng có trade-off, và quyết định đó tốt hay không phụ thuộc vào từng hoàn cảnh cụ thể. Trong model của cậu, tớ đồng ý việc sử dụng logical deletion không phải lựa chọn tốt.