2009-02-03 10 views
11

SQL luôn có một tính năng tuyệt vời: xóa tầng. Bạn lên kế hoạch trước và khi đến lúc xóa một cái gì đó, BAM! Không cần phải lo lắng về tất cả những hồ sơ phụ thuộc.Cascading Soft Xóa

Tuy nhiên, hiện nay gần như điều cấm kỵ để thực sự XÓA bất kỳ thứ gì. Bạn gắn cờ nó là đã xóa và ngừng hiển thị nó. Thật không may, tôi đã không thể tìm thấy một giải pháp vững chắc để làm điều này khi có hồ sơ phụ thuộc. Tôi đã luôn tự mã hóa các trang web phức tạp của xóa mềm.

Có giải pháp nào tốt hơn mà tôi đã bỏ lỡ hoàn toàn không?

Trả lời

13

Tôi ghét phải nói điều đó nhưng trình kích hoạt được thiết kế đặc biệt cho loại điều này.

(Phần ghét là vì trigger tốt là rất khó để viết và, tất nhiên, không thể được sửa lỗi)

0

Không chắc những gì phụ trợ bạn đang nói đến, nhưng bạn có thể đón về "xóa cờ" của bạn thay đổi và xếp tầng thay đổi xuống bằng cách sử dụng trình kích hoạt.

6

Ràng buộc khóa ngoài có thể thực hiện cập nhật xếp tầng. Nếu bạn liên kết các bảng của bạn trên cả khóa và cờ xóa, thì khi cờ xóa trong bảng chính thay đổi, thay đổi đó sẽ lan truyền xuống bảng chi tiết. Tôi đã không thử điều đó, nhưng nó sẽ hoạt động.

+0

Đây là IMO thanh lịch điên rồ. Vấn đề duy nhất với việc đó là bạn không thể sử dụng một NULL Delete_Date nhưng thay vào đó phải sử dụng một số ngày tùy ý như '9999-12-31'. – HaxElit

+1

Sau khi suy nghĩ nhiều hơn một chút, nó không hoạt động vì nếu bạn xóa một bản ghi phụ thuộc, bạn sẽ gặp phải một lỗi ràng buộc khóa vì ngày xóa của phụ huynh là khác nhau. Để tốt được đúng tôi đoán;) – HaxElit

2

Tôi nghĩ rằng lợi ích của việc xóa mềm thường là không phải mọi bảng đều có cờ xóa mềm, vì vậy số lượng thứ cần thiết để xếp tầng là rất ít. Các hàng đơn giản là không được sử dụng trong cơ sở dữ liệu, nhưng không phải là mồ côi - chúng chỉ đơn giản là chỉ được đề cập đến bởi các hàng đã xóa.

Giống như mọi thứ, điều đó tùy thuộc vào kiểu máy của bạn.

+0

Hmm, nhưng sau đó bạn có một cơ sở dữ liệu đầy đủ các hàng mà không nhìn thấy ngay lập tức được sử dụng - phải không? Bạn có thể tham gia vào bảng chính, nhưng nếu thác đi nhiều cấp độ sâu, điều này có thể bị lộn xộn. Hay tôi đang thiếu một cái gì đó? – Piskvor

+1

Nó phụ thuộc vào mô hình. Trong một thiết kế quan hệ, nếu một lá cờ bị xóa không thuộc về quan hệ/tuple/table - nghĩa là nó không phải là một thuộc tính của khóa, tôi sẽ không đặt nó. Trong lược đồ sao - bạn sẽ đặt chúng chỉ trên các bảng lõi. –

+0

Nếu bạn đưa ra một ví dụ về một lược đồ của một hệ thống phụ, tôi sẽ cho bạn thấy những cái mà tôi sẽ đặt một lá cờ đã bị xóa. Tôi sẽ không, ví dụ bao giờ đặt chúng trên một bảng nhiều-to-nhiều, trừ khi bạn đang giữ lịch sử thay đổi liên kết, trong trường hợp đó, bạn sẽ cần phải thêm ngày hiệu quả là tốt. –