Tôi thường cảnh giác với việc xóa tầng (và các hành động tự động khác có thể làm rơi / làm hỏng dữ liệu), thông qua các trình kích hoạt hoặc ON <something> CASCADE
. Các cơ sở như vậy rất mạnh mẽ, nhưng cũng có khả năng nguy hiểm.
- Vì vậy, tầng có xóa một lựa chọn chính xác ở đây?
Nó chắc chắn sẽ làm những gì bạn đang tìm kiếm để làm: xóa các bản ghi liên quan khi bản ghi cha bị xóa, mà bạn không cần phải thực hiện bất kỳ logic nào khác để đảm bảo rằng trẻ em bị xóa trước do đó làm cho mã của bạn ngắn gọn hơn. Tất cả các hành động sẽ được gói trong một giao dịch ngầm, vì vậy nếu một thứ gì đó chặn đứa trẻ xóa toàn bộ hoạt động sẽ bị chặn, duy trì tính toàn vẹn tham chiếu với ít hoặc không cần thêm nỗ lực mã hóa.
Hãy chắc chắn rằng việc bạn sử dụng xóa tầng và các hành động "đằng sau hậu trường" khác được ghi lại rõ ràng để những người bảo trì hệ thống trong tương lai nhận thức đầy đủ về nó.
- Khi nào thì không nên sử dụng Detele tầng?
Nó không nên được sử dụng nếu bạn bị hoang tưởng như tôi! Một điểm quan trọng cần xem xét là các nhà phát triển khác hiện đang hoặc có thể trong tương lai sẽ làm việc với mã / cơ sở dữ liệu của bạn (do đó nhận xét ở trên về việc ghi lại bất kỳ hành vi "ẩn" nào).
Kinh nghiệm của tôi là khá phổ biến đối với những người chưa có kinh nghiệm sử dụng DELETE
sau đó INSERT
để cập nhật các hàng, đặc biệt khi những gì họ thực sự muốn là MERGE
/ UPSERT
thao tác (cập nhật các hàng hiện có và tạo một hàng mới với một hàng có khóa cụ thể không tồn tại) và DBMS không hỗ trợ hợp nhất / upert (hoặc họ không biết về hỗ trợ của nó). Nếu không có các hành động xếp tầng thì điều này hoàn toàn an toàn (hoặc sẽ xảy ra lỗi khi nó đe dọa tính toàn vẹn dữ liệu) nhưng nếu ai đó thực hiện điều này cho các hàng trong bảng cha mẹ nơi các FK tham chiếu cóON DELETE CASCADE
thiết lập sau đó dữ liệu liên quan sẽ bị xóa do xóa ban đầu và không được thay thế - vì vậy dữ liệu bị mất (không phải ngay cả khi xóa và chèn tiếp theo được gói trong các giao dịch rõ ràng, tầng xảy ra với thao tác xóa - nó sẽ không chờ xem liệu giao dịch có thay thế các hàng trong bảng cha trong các báo cáo tiếp theo không) và tầng có thể tiếp tục thông qua các tàu quan hệ khác (ví dụ: xóa một giám sát viên cao cấp, nhóm của anh ta bị xóa bởi thác, các nhóm của nhóm của anh ta bị xóa bởi thác, tất cả các hồ sơ được theo dõi cho tất cả những người bị xóa theo tầng, ...). Nếu không kích hoạt xếp tầng, bạn sẽ chỉ gặp lỗi ở đây thay vì dữ liệu bị mất âm thầm.