Cơ sở dữ liệu: Để xóa hoặc không xóa bản ghi


117

Tôi không nghĩ mình là người duy nhất băn khoăn về điều này. Bạn thường thực hành những gì về hành vi cơ sở dữ liệu? Bạn có muốn xóa bản ghi khỏi cơ sở dữ liệu một cách vật lý không? Hay tốt hơn là chỉ gắn cờ bản ghi bằng cờ "đã xóa" hoặc cột boolean để biểu thị bản ghi đang hoạt động hoặc không hoạt động?


67
... cho dù người quản lý trong cơ sở dữ liệu phải chịu sự cồng kềnh và dư thừa của các cờ, hoặc để đưa DELETE vào một bảng các bản ghi, Và bằng cách xóa, hãy kết thúc chúng. Để xóa, để ngủ;
nickf

7
Chào! Làm cách nào để bỏ phiếu bình luận ??
Nifle

Câu trả lời:


48

Nó chắc chắn phụ thuộc vào nội dung thực tế của cơ sở dữ liệu của bạn. Nếu bạn đang sử dụng nó để lưu trữ thông tin về phiên, thì hãy xóa nó ngay lập tức khi phiên đó hết hạn (hoặc bị đóng), bạn không muốn rác nằm xung quanh. Vì nó thực sự không thể được sử dụng lại cho bất kỳ mục đích thực tế nào.

Về cơ bản, những gì bạn cần tự hỏi, tôi có thể cần khôi phục thông tin này không? Giống như các câu hỏi đã xóa trên SO, chúng chắc chắn chỉ nên được đánh dấu là 'đã xóa', vì chúng tôi đang tích cực cho phép khôi phục. Chúng tôi cũng có tùy chọn hiển thị nó để chọn người dùng mà không cần phải làm gì thêm.

Nếu bạn không chủ động tìm cách khôi phục hoàn toàn dữ liệu, nhưng bạn vẫn muốn giữ nó cho mục đích theo dõi (hoặc tương tự). Tôi khuyên bạn nên tìm ra (tất nhiên là trong phạm vi có thể) một sơ đồ tổng hợp, và chuyển nó sang một bảng khác. Điều này sẽ giữ cho bảng chính của bạn sạch sẽ về dữ liệu 'đã xóa', cũng như giữ cho bảng phụ của bạn được tối ưu hóa cho các mục đích giám sát (hoặc bất cứ điều gì bạn đã nghĩ đến).

Để biết dữ liệu thời gian, hãy xem: http://talentedmonkeys.wordpress.com/2010/05/15/temporal-data-in-a-relational-database/


30

Ưu điểm của việc sử dụng cờ xóa:

  1. Bạn có thể lấy lại dữ liệu sau nếu cần,
  2. Thao tác xóa (cập nhật cờ) có lẽ nhanh hơn thực sự xóa nó

Nhược điểm của việc sử dụng cờ xóa:

  1. Rất dễ bỏ sót AND DeletedFlag = 'N'một chỗ nào đó trong SQL của bạn
  2. Làm chậm hơn để cơ sở dữ liệu tìm thấy các hàng mà bạn quan tâm trong số tất cả những thứ tào lao
  3. Cuối cùng, bạn có thể muốn thực sự xóa nó (giả sử hệ thống của bạn thành công. Còn khi bản ghi đó 10 năm tuổi và nó bị "xóa" 4 phút sau khi tạo ban đầu)
  4. Nó có thể khiến bạn không thể sử dụng khóa tự nhiên. Bạn có thể có một hoặc nhiều hàng bị xóa với khóa tự nhiên và một hàng thực muốn sử dụng cùng khóa tự nhiên đó.
  5. Có thể có lý do pháp lý / tuân thủ tại sao bạn muốn thực sự xóa dữ liệu.

23

Như một bổ sung cho tất cả các bài viết ...

Tuy nhiên, nếu bạn có kế hoạch đánh dấu bản ghi, tốt hơn hết là bạn nên cân nhắc tạo một lượt xem, cho các bản ghi đang hoạt động. Điều này sẽ giúp bạn không viết hoặc quên cờ trong truy vấn SQL của bạn. Bạn cũng có thể xem xét một chế độ xem cho các bản ghi không hoạt động, nếu bạn cho rằng điều đó cũng phục vụ một mục đích.


11

Tôi rất vui vì đã tìm thấy chủ đề này. Tôi cũng tự hỏi mọi người nghĩ gì về vấn đề này. Tôi đã thực hiện 'được đánh dấu là đã xóa' trong khoảng 15 năm trên nhiều hệ thống. Bất cứ khi nào người dùng gọi đến để nói điều gì đó vô tình bị xóa, chắc chắn việc đánh dấu là chưa xóa sẽ dễ dàng hơn rất nhiều so với việc tạo lại hoặc khôi phục từ bản sao lưu.

Chúng tôi đang sử dụng postgresql và Ruby on rails, có vẻ như chúng tôi có thể thực hiện việc này bằng một trong hai cách, sửa đổi đường ray hoặc thêm trình kích hoạt ondelete và thay vào đó là hàm pl / pgsql để đánh dấu là đã xóa. Tôi đang nghiêng về cái sau.

Đối với số lần truy cập hiệu suất, sẽ rất thú vị khi xem kết quả GIẢI THÍCH-PHÂN TÍCH trên các bảng lớn cho một vài mục đã xóa cũng như nhiều mục đã xóa.

Trong các hệ thống được sử dụng theo thời gian mà tôi nhận thấy, người dùng mới có xu hướng làm những việc ngớ ngẩn như vô tình xóa mọi thứ. Vì vậy, khi mọi người mới ở một vị trí, họ có tất cả các quyền truy cập của người trước đó ở vị trí đó ngoại trừ kinh nghiệm bằng không. Việc vô tình xóa nội dung nào đó và có thể nhanh chóng khôi phục giúp mọi người nhanh chóng trở lại làm việc.

Nhưng như ai đó đã nói, đôi khi bạn có thể cần lại khóa cụ thể đó vì lý do nào đó, tại thời điểm đó, bạn cần thực sự xóa nó, sau đó tạo lại bản ghi (khi khôi phục và sửa đổi bản ghi).


1
+1 vì sự thân thiện với người dùng bao gồm việc hạn chế khả năng tôi mắc phải những sai lầm nghiêm trọng.
Jesse

6

Ngoài ra còn có các vấn đề pháp lý nếu có liên quan đến dữ liệu cá nhân. Tôi nghĩ nó phụ thuộc rất nhiều vào vị trí của bạn (hoặc cơ sở dữ liệu ở đâu) và các điều khoản sử dụng là gì.

Trong một số trường hợp, mọi người có thể yêu cầu xóa khỏi hệ thống của bạn, trong trường hợp đó, cần xóa cứng (hoặc ít nhất là xóa tất cả thông tin cá nhân).

Tôi sẽ kiểm tra với bộ phận pháp lý của bạn trước khi bạn áp dụng chiến lược theo cách nào đó nếu thông tin cá nhân có liên quan.


5

Tôi đánh dấu chúng là đã xóa, và không thực sự xóa. Tuy nhiên, thỉnh thoảng tôi quét tất cả rác và lưu trữ nó, vì vậy nó không giết chết hiệu suất.


2

Nếu bạn lo lắng về việc các bản ghi "không hoạt động" làm chậm quá trình truy cập cơ sở dữ liệu của mình, bạn có thể muốn chuyển các hàng đó sang một bảng khác hoạt động như một bảng "lưu trữ".


1

Đối với dữ liệu do người dùng nhập / quản lý, tôi đã sử dụng phương pháp gắn cờ mà bạn mô tả và cung cấp cho người dùng giao diện "dọn sạch thùng rác" để thực sự xóa các mục nếu họ muốn.

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.