Tôi đang làm việc trong một dự án nơi các mục cơ sở dữ liệu không bị xóa, nhưng chỉ được đánh dấu là đã xóa. Một cái gì đó như thế này:Việc cần làm khi tôi muốn sử dụng các ràng buộc cơ sở dữ liệu nhưng chỉ đánh dấu là đã xóa thay vì xóa?
id name deleted
--- ------- --------
1 Thingy1 0
2 Thingy2 0
3 Thingy3 0
Tôi muốn có thể xác định thứ gì đó giống như một ràng buộc UNIQUE trên cột name
. Có vẻ dễ dàng, phải không?
Hãy tưởng tượng một kịch bản trong đó "Thingy3" bị xóa và một kịch bản mới được tạo (có thể là năm sau). Chúng tôi nhận được:
id name deleted
--- ------- --------
1 Thingy1 0
2 Thingy2 0
3 Thingy3 1
...
100 Thingy3 0
Từ quan điểm của người dùng, anh đã xóa một mục và tạo một mục mới. Cũng giống như xóa một tệp và tạo tệp mới. Vì vậy, nó rõ ràng với anh ta rằng các mục mới là không liên quan và unattached với bất kỳ dữ liệu kết nối với mục cũ.
Đã được xử lý, vì DB chỉ quan tâm đến số id
và vì mục mới có số id
trong số 100 thay vì 3, chúng hoàn toàn khác nhau.
Khó khăn của tôi phát sinh khi tôi muốn ngăn người dùng tạo một mục "Thingy3" khác. Nếu tôi có một ràng buộc UNIQUE chỉ xem xét các mục không được đánh dấu deleted
, thì tôi đã giải quyết được một vấn đề.
(Tất nhiên, sau đó tôi sẽ phải đối phó với những gì xảy ra khi một người nào đó làm một undo của delete ...)
Vì vậy, làm thế nào tôi có thể xác định rằng loại một hạn chế?
BTW này được gọi là xóa mềm http://databaserefactoring.com/IntroduceSoftDelete.html – cherouvim
Rất vui khi biết điều này có tên. Cảm ơn! – scraimer