Veritabanı: Kayıtları silmek veya silmemek


117

Bunu merak eden tek kişinin ben olduğumu sanmıyorum. Veritabanı davranışı hakkında genellikle ne pratik yaparsınız? Veritabanından fiziksel olarak bir kaydı silmeyi tercih ediyor musunuz? Veya kaydın etkin veya devre dışı olduğunu belirtmek için kaydı "silinmiş" bir bayrakla veya bir boole sütunu ile işaretlemek daha mı iyidir?


67
... veritabanında bayrakların şişkinliği ve fazlalığına katlanmak ya da DELETE'i bir kayıt tablosuna götürmek ve kaldırarak onları sonlandırmak. Silmek, uyumak için;
nickf

7
Hey! Bir yoruma nasıl olumlu oy verebilirim?
Nifle

Yanıtlar:


48

Kesinlikle veritabanınızın gerçek içeriğine bağlıdır. Eğer onu oturum bilgilerini saklamak için kullanıyorsanız, o zaman elbette oturum sona erdiğinde (veya kapatıldığında) hemen silin, o çöpün ortalıkta olmasını istemezsiniz. Herhangi bir pratik amaç için tekrar kullanılamayacağı için.

Temel olarak, kendinize sormanız gerekenler, bu bilgileri geri yüklemem gerekebilir mi? SO'daki silinmiş sorular gibi, aktif olarak bir geri alma işlemine izin verdiğimiz için, bunlar kesinlikle sadece 'silinmiş' olarak işaretlenmelidir. Ayrıca, fazladan iş yapmadan, belirli kullanıcılara gösterme seçeneğimiz de var.

Verileri aktif olarak tamamen geri yüklemeye çalışmıyorsanız, ancak yine de izleme (veya benzer) amaçlar için etrafta tutmak istiyorsanız. Bir toplama şeması bulmanızı (elbette mümkün olduğu ölçüde) ve bunu başka bir masaya kaydırmanızı öneririm. Bu, birincil tablonuzu 'silinmiş' verilerden temiz tutacak ve ikincil tablonuzu izleme amaçları için (veya aklınızda ne varsa) optimize edecektir.

Geçici veriler için bkz: http://talentedmonkeys.wordpress.com/2010/05/15/temporal-data-in-a-relational-database/


30

Silme bayrağı kullanmanın avantajları:

  1. İhtiyacınız olursa verileri daha sonra geri alabilirsiniz,
  2. Silme işlemi (bayrağı güncelleme) muhtemelen onu gerçekten silmekten daha hızlıdır

Silme bayrağı kullanmanın eksileri:

  1. Bu bayan çok kolaydır AND DeletedFlag = 'N'sizin SQL yerde
  2. Veritabanının tüm saçmalıklar arasında ilgilendiğiniz satırları bulması daha yavaş
  3. Sonunda, muhtemelen yine de gerçekten silmek isteyeceksiniz (sisteminizin başarılı olduğunu varsayarak. Bu kayıt 10 yaşında olduğunda ve ilk oluşturulduktan 4 dakika sonra "silindiğinde" ne olacak)
  4. Doğal anahtar kullanmayı imkansız hale getirebilir. Doğal anahtarla bir veya daha fazla silinmiş satırınız ve aynı doğal anahtarı kullanmak isteyen gerçek bir satırınız olabilir.
  5. Verileri gerçekten silmeniz için yasal / uygunluk nedenleri olabilir.

23

Tüm gönderilerin tamamlayıcısı olarak ...

Ancak, kaydı işaretlemeyi planlıyorsanız, aktif kayıtlar için bir görünüm oluşturmayı düşünmek iyidir. Bu sizi SQL sorgunuzdaki bayrağı yazmaktan veya unutmaktan kurtarır. Bunun da bir amaca hizmet ettiğini düşünüyorsanız, aktif olmayan kayıtlar için de bir görünüm düşünebilirsiniz.


11

Bu konuyu bulduğuma sevindim. Ben de insanların bu konu hakkında ne düşündüğünü merak ediyordum. 'Silindi olarak işaretli'yi yaklaşık 15 yıldır birçok sistemde uyguladım. Bir kullanıcı bir şeyin yanlışlıkla silindiğini söylemek için aradığında, onu yeniden oluşturmak veya bir yedekten geri yüklemek yerine silinmemiş olarak işaretlemek kesinlikle çok daha kolaydı.

Postgresql ve Ruby'yi raylarda kullanıyoruz, öyle görünüyor ki bunu iki yoldan biriyle yapabiliriz, rayları değiştirebiliriz veya bir ondelete tetikleyicisi ekleyebiliriz ve bunun yerine silinmiş olarak işaretlemek için bir pl / pgsql işlevi yapar. İkincisine doğru eğiliyorum.

Performans isabetlerine gelince, EXPLAIN-ANALYZE sonuçlarını büyük tablolarda birkaç silinmiş öğeye ve birçok silinmiş öğeye kadar görmek ilginç olacaktır.

Zamanla kullanılan sistemlerde, yeni kullanıcılar bir şeyleri yanlışlıkla silmek gibi saçma şeyler yapma eğilimindedir. Dolayısıyla, insanlar bir pozisyonda yeni olduklarında, sıfır deneyim dışında, daha önce o pozisyonda olan kişinin tüm erişim haklarına sahip olurlar. Yanlışlıkla bir şeyi silmek ve hızlı bir şekilde kurtarabilmek, herkesin hızlı bir şekilde işine dönmesini sağlar.

Ancak birisinin dediği gibi, bazen bir sebepten dolayı o anahtara geri ihtiyacınız olabilir, bu noktada onu gerçekten silmeniz, ardından kayıtları yeniden oluşturmanız (silme işlemini geri alıp kaydı değiştirmeniz) gerekir.


1
+1 çünkü kullanıcı dostu olma, yıkıcı hatalar yapma yeteneğimi sınırlamayı içeriyor.
Jesse

6

Kişisel veriler söz konusuysa, her iki şekilde de yasal sorunlar vardır. Sanırım büyük ölçüde nerede olduğunuza (veya veritabanının nerede olduğuna) ve kullanım şartlarının ne olduğuna bağlı.

Bazı durumlarda insanlar sisteminizden kaldırılmayı isteyebilir, bu durumda kalıcı bir silme işlemi gerekir (veya en azından tüm kişisel bilgilerin silinmesi).

Kişisel bilgiler söz konusuysa, bir strateji benimsemeden önce hukuk departmanınıza danışacağım.


5

Bunları silinmiş olarak işaretliyorum ve gerçekten silmiyorum. Ancak arada bir tüm çöpleri süpürüp arşivlerim, böylece performansı düşürmez.


2

Veritabanı erişiminizi yavaşlatan "hareketsiz" kayıtlarla ilgili endişeleriniz varsa, bu satırları "arşiv" tablosu olarak işlev gören başka bir tabloya taşımak isteyebilirsiniz.


1

Kullanıcı tarafından girilen / yönetilen veriler için, tanımladığınız bayrak yöntemini kullandım ve kullanıcıya, seçmeleri halinde öğeleri gerçekten silmek için bir "çöp kutusunu boşaltın" arayüzü verdim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.