Làm thế nào để thực hiện xóa mềm?


7

Phương pháp của bạn để thực hiện xóa mềm trong cơ sở dữ liệu là gì?

Lý tưởng nhất là giải pháp cho phép

  • hiệu suất tốt trên bàn lớn
  • tính đến các mối quan hệ
  • lấy các khóa duy nhất vào tài khoản
  • người dùng sẽ có thể tìm và khôi phục các mục đã xóa của mình.

Cảm ơn!

Câu trả lời:


6

Có một vài cách tôi có thể nghĩ ra để làm điều đó:

  • Bạn có thể có chỉ báo "Đã xóa", được đặt thành "Y" khi bản ghi bị xóa. Rất đơn giản, nhưng nó để lại dữ liệu bị xóa và hoạt động trong cùng một bảng, điều này có thể gây ra vấn đề về hiệu suất nếu có nhiều hoạt động. Khôi phục một bản ghi cũng đơn giản như thay đổi chỉ báo.

  • Bạn có thể có một bảng phản ánh cấu trúc của bảng bạn muốn xóa và khi bạn xóa một bản ghi khỏi bảng chính, hãy chèn bản ghi đó vào bảng "remove_data". Điều này cho phép bạn di chuyển dữ liệu đã xóa vào bảng riêng biệt để mang lại hiệu suất tiềm năng tốt hơn cho bảng chính, nhưng việc tìm kiếm dữ liệu trong một trong hai bảng có thể khiến mọi thứ phức tạp hơn và giữ cho cấu trúc dữ liệu được đồng bộ hóa (khi chúng thay đổi) cũng có một chút nhiều việc phải làm Trong trường hợp này, việc khôi phục dữ liệu sẽ liên quan đến việc xóa bản ghi khỏi bảng "đã xóa" và chèn lại vào bảng chính.

Trong cả hai trường hợp, bạn có thể muốn tìm bất kỳ hồ sơ con nào và đánh dấu chúng là đã xóa. Tôi cho rằng bạn có thể làm điều này với các kích hoạt hoặc bằng mã.


Khi sử dụng cách tiếp cận của cờ bị xóa, làm thế nào để bạn ngăn chặn sự truy cập ngẫu nhiên vào các hàng bị xóa mềm?
Mark Stosberg

@MarkStosberg: Một cách là ứng dụng đọc dữ liệu có thể đọc từ chế độ xem loại trừ tất cả các hàng bị xóa mềm.
Thất vọngWithFormsDesigner

3

Trong ví dụ này, hãy sử dụng một bảng trông như thế này "

CREATE TABLE parent_data
(
    id int not null auto_increment,
    ...
    PRIMARY KEY (id)
);

Nếu bạn muốn xóa mềm, hãy tạo bảng ẩn id của các hàng bạn muốn xóa. Có lẽ một cái gì đó như thế này:

CREATE TABLE deleted_parent_data SELECT id FROM parent_data WHERE 1=2;
ALTER TABLE deleted_parent_data ADD PRIMARY KEY (id);

Giả sử bạn muốn xóa các hàng 10,20,30,40,50. Chỉ cần chạy này:

INSERT IGNORE INTO deleted_parent_data VALUES (10),(20),(30),(40),(50);

Bạn sẽ luôn phải thực hiện INNER THAM GIA để xem dữ liệu hợp lệ

SELECT A.* FROM parent_data A
INNER JOIN deleted_parent_data B
USING (id) WHERE B.id IS NULL;

Nhìn thấy các hàng bị xóa sẽ rất nhanh

SELECT B.* FROM deleted_parent_data A
LEFT JOIN parent_data B
USING (id) WHERE B.id IS NOT NULL;

Để khôi phục hàng 20 trong Parent_data, chỉ cần chạy

DELETE FROM deleted_parent_data WHERE id = 20;

Để xóa vĩnh viễn các hàng 20 và 50, bạn chạy hai bước mà bạn không thể quay lại:

DELETE B.* FROM
(SELECT id FROM deleted_parent_data
WHERE id IN (20,50)) A
LEFT JOIN parent_data B
USING (id) WHERE B.id IS NOT NULL;
DELETE FROM deleted_parent_data WHERE id IN (20,50);

Nếu bạn có các bản ghi con trong bảng child_data, bạn sẽ phải có một bảng xóa_child_data riêng và quản lý nó theo cách tương tự. Có lẽ có bảng trông như thế này:

CREATE TABLE deleted_child_table SELECT parent_id,id WHERE 1=2;
ALTER TABLE deleted_child_table ADD PRIMARY KEY (id);
ALTER TABLE deleted_child_table ADD UNIQUE KEY (parent_id,id);

Bạn có thể có thể sử dụng các kích hoạt hoặc các ràng buộc FOREIGN KEY giữa remove_parent_table và remove_child_table với tất cả các ON DELETE CASCADEchuông và còi. Theo cách đó, việc xóa hàng vĩnh viễn trong remove_parent_table sẽ xếp tầng thành remove_child_table.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.