Vấn đề về soft delete ảnh hưởng đến performance trong Laravel
Chào mọi người, dự án mình đang làm dùng Laravel và gặp vấn đề khá thốn như này, lúc mới bắt đầu thiết kế database thì mọi người thống nhất là dùng soft delete cho tất cả các tables, bởi vì nếu có table dùng, table không dùng thì khi delete hay restore thì sẽ gặp rũi ro. Nhưng hiện tại khi dự án lớn lên, vì dùng soft delete, bản chất nó là xóa mềm nên record đã xóa nó vẫn nằm tồn đọng trong DB nên dần dần nó làm ảnh hưởng đến hiệu năng, thêm nữa là nếu dùng soft delete thì các câu lệnh join mình phải check whereNull cho field deleted_at của table mình join tới nữa, khá mất công và ảnh hưởng đến hiệu năng. Nên mình muốn tham khảo ý kiến mọi người xem với tình hình hiện tại thì mình có nên giữ soft delete nữa không hay xóa hết trong tất cả các bảng luôn. Mong nhận được suggest từ mọi người, cảm ơn nhiều
2 CÂU TRẢ LỜI
Theo mình chỉ nên dùng soft delete trong một vài trường hợp
- Trường hợp đúng nghĩa là xoá tạm, sau đó record có khả năng hồi phục lại nguyên dạng
- Trường hợp dữ data lại để thực hiện thống kê gì đó, trường hợp này nếu là mình thì mình cũng sẽ migrate các data cần thống kê ra bảng riêng để không ảnh hưởng đến performance của các bảng chính được query nhiều
Nên theo ý kiến cả nhân mình thì việc dùng soft delete cho tất các các tables là một việc không nên làm Nếu bạn hỏi nên giữ hay không thì mình xin một vote không giữ =))
Nếu mình bỏ soft delete, khi người dùng xóa thì mình phải trigger event để move toàn bộ dữ liệu sẽ xóa đó sang một audit database để có thể dùng sau này, như rứa thì thao tác xóa xữ lý khá nhiều việc nên khá chậm, bạn có cao kiến gì không bạn
Tức là nhu cầu của bạn là vẫn giữ lại tất cả các data mặc dù người dùng đã xoá để dùng sau này (thống kê hay gì đó mình không rõ) đúng không?
Nếu là thế thì bạn có thể dùng delayed job chẳng hạn. Khi user ra lệnh xoá bạn soft delete như bây giờ đồng thời set một delayed job chạy ngầm, move data đó sang chỗ mới rồi mới hard delete record đó đi. User vẫn được phản ứng lại ngay, bạn vẫn có data để dùng sau này
Vì thiết kế ban đầu vậy rồi nên mình nghĩ bạn cứ giữa nguyên soft delete vậy, vì khi DB của bạn phình lên thì việc delete bằng cách xóa trực tiếp cũng là vấn đề vì xử lý delete chậm hơn, và bạn cũng phải xử lý lại những query liên quan , đồng thời phải test lại, và đánh giá hiệu năng. Cách mình suggest là:
- Luôn backup DB trước khi delete
- Tạo batch/cron job để chạy xóa data dưới server (một ngày chạy một lần, 2 lần, tùy vào lượng records cần delete có lớn không)
==> tham khảo thêm ý kiến của bạn @bs90 (Heasygame) ở trên nhé
Không biết vấn đề hiệu năng mà bạn gặp phải là như nào vậy nhỉ?
Bạn tham khảo bài viết này xem: http://abstraction.blog/2015/06/28/soft-vs-hard-delete
Hay topic này: https://stackoverflow.com/questions/2549839/are-soft-deletes-a-good-idea
@huukimit Mình điều tra trên DB thì có một số bảng hơn 20% là dữ liệu soft delete nên chắc chắn sẽ ảnh hưởng đến performance rồi bạn
@vinhnguyen Cảm ơn bạn, link đầu rất hay