Chúng ta có nên xóa dữ liệu trong cơ sở dữ liệu không?


39

Tôi chưa quen với cơ sở dữ liệu và cố gắng hiểu các khái niệm cơ bản. Tôi đã học cách xóa dữ liệu trong cơ sở dữ liệu. Nhưng một trong những người bạn của tôi nói với tôi rằng bạn không bao giờ nên xóa dữ liệu trong cơ sở dữ liệu. Thay vào đó, khi không còn cần thiết, tốt hơn hết là chỉ cần đánh dấu hoặc gắn cờ là 'không sử dụng'.

Điều đó có đúng không? Nếu vậy, làm thế nào một công ty lớn như IBM xử lý dữ liệu của họ trong một trăm năm trở lên?


2
Vui lòng làm rõ - bạn đang hỏi liệu bạn có nên đưa ra các lệnh xóa trong SQL hay không, hoặc bạn đang hỏi liệu công cụ cơ sở dữ liệu cơ bản có thực sự xóa dữ liệu được đánh dấu là đã xóa không?
GrandmasterB

4
@StartupCrazy: nhận xét đó không làm rõ bất cứ điều gì cho tôi.
Doc Brown

6
Ai là "chúng ta"?
Năng động

3
Tôi rất thích giữ mọi thứ gần như ám ảnh. Nhưng tôi không biết bạn là doanh nghiệp gì nhưng một số dữ liệu bạn được yêu cầu về mặt pháp lý để giữ trong một khoảng thời gian nhất định và một số dữ liệu bạn bắt buộc phải xóa sau một khoảng thời gian.
Pieter B

6
Phụ thuộc vào loại dữ liệu đó là gì. Trong một số trường hợp, bạn phải xóa nó vì lý do pháp lý.
CodeInChaos

Câu trả lời:


63

Như với tất cả những điều này, câu trả lời là "nó phụ thuộc".

Nếu người dùng có thể muốn lấy lại dữ liệu thì bạn bè của bạn đã đúng - bạn không thực sự xóa chỉ đánh dấu bản ghi là "đã xóa". Bằng cách này khi người dùng thay đổi ý định, bạn có thể khôi phục dữ liệu.

Tuy nhiên, nếu dữ liệu bị xóa quá một khoảng thời gian nhất định (ví dụ một năm), bạn có thể quyết định thực sự xóa nó khỏi các bảng trực tiếp nhưng giữ nó trong bảng lưu trữ hoặc thậm chí chỉ cần sao lưu nếu người dùng muốn nó trở lại Bằng cách này, bạn có thể giữ lượng dữ liệu (trực tiếp và bị xóa gần đây) ở mức tối thiểu.

Tuy nhiên, nếu dữ liệu phù du hoặc dễ dàng được tạo lại, bạn cũng có thể quyết định thực sự xóa dữ liệu.

Có một loại dữ liệu mà bạn phải xóa - và đó là dữ liệu cá nhân mà người dùng không muốn bạn giữ nữa. Có thể có luật địa phương (ví dụ ở EU) khiến điều này trở thành một yêu cầu bắt buộc (cảm ơn Gavin )

Tương tự, có thể có các quy tắc yêu cầu bạn không xóa dữ liệu, vì vậy trước khi quyết định bất kỳ điều gì hãy kiểm tra với bất kỳ cơ quan quản lý nào về những gì bạn cần làm để tuân thủ luật pháp.


8
Một số lĩnh vực ứng dụng (kế toán, thiết bị y tế) có thể yêu cầu dữ liệu không bị xóa vì yêu cầu kiểm toán.
Paul

3
Trong một số trường hợp nhất định, bạn PHẢI xóa dữ liệu, một ví dụ là bất cứ điều gì liên quan đến thông tin cá nhân của người dùng. Luật EU (và có thể cả những người khác) quy định rằng người dùng nên có quyền yêu cầu xóa dữ liệu của họ. Trong trường hợp như vậy, dữ liệu này phải bị xóa và không được gắn cờ là không còn hoạt động. Thứ hai sẽ là một sự vi phạm luật riêng tư.
Gavin Coates

giải phóng một số không gian trong cơ sở dữ liệu làm tăng hiệu suất của nó?
viveksinghggits

17

Đây thực sự là một vấn đề đáng kể cho rất nhiều công ty. Không có cách nào để xác định rõ ràng dữ liệu nào đang được sử dụng, vì vậy nó chỉ nằm trong cơ sở dữ liệu. Xóa dữ liệu và lưu trữ cần phải là một phần của mọi thiết kế hệ thống lớn, nhưng hiếm khi như vậy. Hầu hết các công ty chỉ sống với nó, mua các đĩa lớn hơn và điều chỉnh các truy vấn và chỉ mục của họ để duy trì hiệu suất, cho đến khi họ thay đổi hệ thống và sau đó họ trải qua một nỗ lực đáng kể để xác định dữ liệu hiện tại và sau đó chỉ di chuyển các bản ghi đó sang hệ thống mới của họ.

Có, bạn nên xóa dữ liệu khỏi cơ sở dữ liệu của mình, nhưng thường không đơn giản để nói cái gì và khi nào.


1
"Không có cách nào để xác định rõ ràng dữ liệu nào đang được sử dụng" - tôi không đồng ý. Trường bit "IsDelatted" trên mỗi bảng là một cách khá rõ ràng để xác định một bản ghi là không còn phù hợp. Hầu hết các câu hỏi mà nó đặt ra, như làm thế nào để xóa tầng, cũng có mặt trong các sơ đồ xóa vật lý và câu trả lời phụ thuộc vào mô hình dữ liệu và liệu bạn có coi trọng kích thước lưu trữ hoặc hiệu suất hơn không.
KeithS

Đó là những gì tôi đã nói, các hệ thống cần được thiết kế với một số loại chỉ báo hết hạn. Trong trường hợp không có các chỉ số này (đó là trường hợp của rất nhiều công ty), không có cách nào để xác định hồ sơ nào có thể bị xóa một cách an toàn.
TMN

12

Đã có rất nhiều câu trả lời hay cho vấn đề này khá nhiều khi nói về "Tùy thuộc vào hoàn cảnh" và tôi không thể thêm bất cứ điều gì vào đó.

Tuy nhiên, một điều chưa được đề cập mà tôi nghĩ cần phải đề cập, đó là bạn không bao giờ nên sử dụng lại các khóa chính đã được tạo bởi một chuỗi hoặc hệ thống AUTO_INCREMENT.

Khi bạn xóa một mục đã được gán một khóa chính bởi một hệ thống như vậy, sẽ có những khoảng trống trong cột khóa chính, còn lại bởi dữ liệu bị xóa. Có một sự cám dỗ lớn để gán lại những khoảng trống đó cho các mục mới khi chúng được thêm vào, hoặc thậm chí tệ hơn, để xáo trộn dữ liệu hiện có để cung cấp ID mới để xóa các khoảng trống, nhưng làm như vậy sẽ làm phát sinh các vấn đề mà bạn không bao giờ phải đối phó nếu bạn chỉ để lại chìa khóa.

Giả sử bạn đang giữ một cơ sở dữ liệu của máy in để quản lý hàng tiêu dùng sắp xếp lại. Máy in 13, một máy in laser cũ, bị hỏng ngoài sửa chữa kinh tế nên bạn vứt nó đi. Trong khi đó, vì một lý do không liên quan, ai đó đã đặt mua một máy in nhiệt mới để thực hiện in mã vạch trong kho và máy in đó sẽ đến trước khi thay thế máy in 13. Quản trị viên đăng nhập máy in mới vào cơ sở dữ liệu và vì 13 hiện đang miễn phí và bạn đang tái chế ID, máy in nhiệt mới được phân bổ 13 làm ID của nó.

Bây giờ ai đó nói với bạn rằng máy in 13 sắp hết mực. Bạn nhớ rằng máy in 13 là máy in laser, vì vậy bạn không cần tìm kiếm nó trong cơ sở dữ liệu và bạn đặt hàng cho hộp mực. Chỉ có bạn thực sự cần thiết để đặt một gói mực nhiệt vì máy in 13 không còn là máy in laser nữa. Khi hộp mực đến, bạn không thể sử dụng nó vì đó là việc đổ mực sai cho máy in, bạn không thể in thêm bất kỳ mã vạch nào và bạn không thể gửi bất kỳ đơn đặt hàng nào đang chờ để được gửi đi.

Thậm chí tệ hơn, điều gì xảy ra nếu bạn xóa máy in 13 và xáo trộn tất cả các máy in đi sau nó để lấp đầy khoảng trống? Máy in 14 (một số ma trận điểm cũ cũ) trở thành máy in 13, máy in 15 trở thành máy in 14, v.v.

Tất cả các máy in đều có nhãn trên đó để chúng có thể được tham chiếu chéo với cơ sở dữ liệu, nhưng bây giờ tất cả các nhãn đã hết hạn. Bạn sẽ phải đi lòng vòng, định vị mọi máy in trong doanh nghiệp (có thể chạy vào hàng trăm!) Và đặt lại tên cho chúng. Đó hầu như không phải là cách sử dụng hiệu quả thời gian. Và đó cũng là một quá trình dễ bị lỗi, và điều gì xảy ra nếu nó không bao giờ được thực hiện? Ai đó gọi để nói rằng máy in 14 đã bị hỏng và cần sửa chữa khẩn cấp, vì vậy bạn tìm nó và thấy rằng máy in 14 là một máy in phun trong Lễ tân. Chỉ vì bạn đã xáo trộn các ID xung quanh, nó thực sự là máy in ma trận điểm cần sửa chữa khẩn cấp. Anh chàng gặp vấn đề bị treo cổ, trong khi nhân viên tiếp tân có một anh chàng hỗ trợ công nghệ, cô không bao giờ gọi đến để sửa máy in bị hỏng.

Bạn nên nghĩ rằng các ID được chỉ định bởi một hệ thống tăng tự động là vĩnh viễn, chúng không thay đổi và không thể được sử dụng lại, ngay cả khi điều mà ID đề cập đến không còn tồn tại. Một số người tuyên bố rằng họ không muốn phải lo lắng về việc hết ID, nhưng ngay cả với hệ thống 32 bit và ID đã ký, vẫn có sẵn 2 tỷ ID. Nếu bạn có thể làm cho cột ID không dấu thì con số này tăng gấp đôi lên 4 tỷ và trên các hệ thống 64 bit, số ID có sẵn theo nghĩa đen lớn hơn số lượng sao trên bầu trời. Bạn sẽ không hết ID.


3
Trong hầu hết các trường hợp, bạn hoàn toàn không nên nghĩ đến các số được tạo tự động, chúng vô nghĩa và không nên tiếp xúc với người dùng. Bạn không bao giờ nên nhận được thông báo rằng máy in 13 ít mực, có thể là "máy in trong bộ 13", nhưng không phải là số được tạo tự động.
jmoreno

Đúng, nhưng ví dụ trên chính xác là như vậy, một ví dụ để minh họa những gì có thể sai nếu bạn loay hoay với các khóa được tạo tự động. Trong thực tế, nó liên quan nhiều hơn đến tính toàn vẹn tham chiếu.
GordonM

Đây chỉ là sự cố RI nếu bạn không có ràng buộc khóa ngoại và thay vào đó có khóa ngoại psuedo. Trong trường hợp bạn có thể có vấn đề lớn hơn.
jmoreno

Bạn sẽ ngạc nhiên khi có bao nhiêu cơ sở dữ liệu mysql mà tôi vẫn chạy vào đó chính xác như thế. Rất nhiều nhà phát triển dường như có ác cảm với innodb và ngay cả những nhà phát triển không sử dụng tất cả các tiện ích của nó.
GordonM

4

Rất nhiều câu trả lời tốt ở đây rồi. Tôi chỉ muốn thêm một tình huống mà chưa ai đề cập đến:

Dữ liệu nhạy cảm . Nếu người dùng xóa nó, thì tốt hơn bạn nên xóa nó!

Một tình huống rất phổ biến xuất hiện trong tâm trí là thay đổi / đặt lại mật khẩu. Bạn sẽ không muốn lưu trữ mật khẩu cũ (mặc dù chúng được băm, muối, v.v.) trong cơ sở dữ liệu của bạn. Người dùng có thể đang sử dụng mật khẩu cũ (và xấu) của họ trên các trang web khác.

Ngoài ra, khi nói đến các luật liên quan đến thời gian bạn được phép lưu trữ một số loại dữ liệu nhất định thì tất nhiên việc xóa mềm sẽ không xảy ra. Bạn phải thực sự xóa nó.

Vì vậy, tôi sẽ tự hỏi: liệu người dùng (hoặc ai đó, chính phủ chẳng hạn) sẽ nổi điên nếu tôi khiến họ tin rằng dữ liệu đã bị xóa, nhưng thực tế tôi vẫn nhận được và có thể khôi phục lại bất cứ lúc nào?


Hấp dẫn. Các công ty lớn thực sự thực hiện điều này?
fuddin

2
Đây là một điểm tốt, nhưng như ví dụ về lịch sử mật khẩu của bạn - bạn thường muốn lưu trữ mật khẩu cũ để bạn có thể đảm bảo chúng không phải là bản sao của bất kỳ trong 12 ngày qua hoặc bất cứ điều gì. Đừng hiểu sai ý tôi - Tôi không thích chính sách này, nhưng tôi đã thực hiện nó và nó có vẻ khá phổ biến trong các ứng dụng dành cho doanh nghiệp.
Mike Partridge

2
Chỉ cần là phạm vi, bạn không bao giờ nên lưu trữ mật khẩu ở bất cứ đâu. Bạn lưu trữ kết quả được mã hóa (một chiều). Nếu ai đó quên mật khẩu của họ, bạn tạo một mật khẩu mới cho họ. Không nên có cách nào để "khôi phục" mật khẩu, bởi vì nếu bạn có thể làm điều đó, thì người khác cũng có thể.
TMN

1
Số thẻ tín dụng. Không bao giờ nên được lưu trữ. Trên thực tế PHẢI không bao giờ được lưu trữ. Nếu một khách hàng đủ ngu ngốc để gửi cho tôi số thẻ tín dụng của họ trong email, tôi có một vấn đề thực sự. Phải có cách để thoát khỏi nó.
gnasher729

GDPR EU gửi liên quan của họ.
hiển thị

3

Tôi thường không xóa dữ liệu người dùng trong cơ sở dữ liệu của tôi. Tôi gắn cờ chúng để được ẩn. Tất cả quá thường xuyên người dùng xóa một cái gì đó vô tình và cần nó dễ dàng thay thế. Nó cũng giúp giữ lại tính toàn vẹn tham chiếu cho dữ liệu liên quan. Điều này làm việc cho cơ sở dữ liệu kích thước nhỏ đến trung bình. Trong các hệ thống mà hiệu suất bị ảnh hưởng nặng nề bởi quyết định này, nó được xử lý theo những cách đặc biệt, ví dụ như bảng lưu trữ, sao lưu tự động, v.v.

Chúng tôi loại bỏ dữ liệu phụ trợ khi cần thiết, ví dụ: dữ liệu phiên của trang web đã hết hạn và thông tin nhật ký cũ. Không có điểm nào trong việc giữ chúng mãi mãi.

Tuy nhiên, như thường lệ, câu trả lời chính xác thực sự phụ thuộc vào tình huống cụ thể.


1

Tôi đã làm việc trên một ứng dụng ngoại hối trong một vài năm, nơi điều này xuất hiện. Dữ liệu mà ứng dụng thu thập được trong nhiều năm có ảnh hưởng đến hiệu suất (nói theo cấp số nhân).

Sau khi chúng tôi thực hiện những gì có thể về mã, chúng tôi đã đề xuất với ban quản lý để lưu trữ dữ liệu cũ hơn một năm. Họ đã xác minh khái niệm (vấn đề pháp lý) và may mắn là chúng tôi đã có thể làm điều đó. Vì vậy, chúng tôi đã xóa nhưng chúng tôi cũng lưu trữ dữ liệu để doanh nghiệp vẫn có thể chạy báo cáo của họ, v.v.


1

Trong phần lớn các trường hợp, bạn nên giữ dữ liệu trong trường hợp cần thiết trong tương lai. Doanh nghiệp bạn làm việc có thể muốn xem xét dữ liệu lịch sử để dựa trên quyết định của họ, điều này sẽ điều khiển công ty theo một hướng nhất định.

Bạn nên thêm các cột 'Date_Time_Remond' vào mỗi bảng và sau đó thay vì xóa vật lý các hàng bạn đặt ngày và giờ mà hàng đó hầu như đã bị xóa. Sau đó, trong các thủ tục được lưu trữ hoặc sql của bạn, bạn sẽ tính đến cột 'Date_Time_Remond', ví dụ: chọn blah từ bảng1 trong đó date_time_remond là null

Tất nhiên các hàng đã được vô tình thêm vào cơ sở dữ liệu nên được xóa vĩnh viễn, đặc biệt là dữ liệu thử nghiệm.

Bằng cách giữ tất cả dữ liệu hợp pháp, bạn cũng phải tùy chọn sử dụng cơ sở dữ liệu của mình để lưu kho trong tương lai.


0

Một tình huống khác so với các tình huống khác được trình bày là khi dữ liệu bị xóa, nhưng nhật ký các hoạt động được thực hiện trong cơ sở dữ liệu (bao gồm xóa) được lưu trữ trong kho lưu trữ trong một thời gian dài. Phạm vi chính của việc này là triển khai một hệ thống rollback cho đến những ngày trước, nhưng nó cũng có thể được sử dụng để lưu trữ theo cách nào đó dữ liệu đã bị xóa (được xóa khỏi cơ sở dữ liệu, nhưng được lưu trữ trong kho lưu trữ).

Lưu trữ tài liệu lưu trữ bị xóa sẽ không phải là một thỏa thuận lớn. Các công ty lớn cũng có thể lưu trữ các phiên bản mã và nhiều thông tin khác (không nói về những thứ không liên quan đến kỹ thuật), vì vậy cuối cùng, việc lưu trữ dữ liệu lớn là điều thường thấy đối với họ.

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.