Hiç bir veritabanındaki verileri silmeli miyiz?


39

Veritabanlarında yeniyim ve temel kavramları anlamaya çalışıyorum. Bir veritabanındaki verilerin nasıl silineceğini öğrendim. Fakat arkadaşlarımdan biri bana veritabanındaki verileri silmemen gerektiğini söyledi. Aksine, artık gerekmediğinde, basitçe işaretlemek veya 'kullanımda değil' olarak işaretlemek daha iyidir.

Bu doğru mu? Öyleyse, IBM gibi büyük bir şirket, verilerini yüz yıl veya daha uzun bir süre boyunca nasıl ele alır?


2
Lütfen açıklığa kavuşturunuz - SQL'de silme komutları vermeniz gerekip gerekmediğini mi soruyorsunuz ya da altta yatan veritabanı motorunun gerçekten silinmiş olarak işaretlenen verileri silip silmediğini mi soruyorsunuz?
GrandmasterB

4
@StartupCrazy: Bu yorum benim için hiçbir şeyi netleştirmiyor.
Doktor Brown,

6
"Biz" ile kimler kastedilmektedir?
Dinamik

3
Her şeyi neredeyse takıntılı tutmayı çok seviyorum. Ancak hangi işletmede olduğunuzu bilmiyorum, ancak belirli bir süre boyunca yasal olarak silmeniz gereken bazı veriler ve belirli bir süre sonra silmeniz gereken bazı veriler.
Pieter B,

6
Ne tür bir veri olduğuna bağlı. Bazı durumlarda yasal sebeplerden dolayı silmelisiniz.
KodlarInChaos

Yanıtlar:


63

Tüm bu şeylerde olduğu gibi cevap "bağlıdır".

Kullanıcı verileri geri almak isteyebilirse, arkadaşların haklıdır - gerçekten silmeyin, sadece kaydı "silindi" olarak işaretle. Bu şekilde kullanıcı fikrini değiştirdiğinde verileri kurtarabilirsin.

Bununla birlikte, silinen veriler belirli bir zaman diliminden daha eskiyse (örneğin bir yıl), onu canlı tablolardan gerçekten silmeye karar verebilirsiniz, ancak kullanıcının istediği zaman onu bir arşiv masasında veya hatta yedeklemede tutmaya karar verebilirsiniz geri döndü. Bu şekilde veri miktarını (canlı ve yakın zamanda silinmiş) minimumda tutabilirsiniz.

Ancak, veriler geçici veya kolayca yeniden oluşturulursa, verileri gerçekten silmeye karar verebilirsiniz.

Orada Söz konusu verilerin bir sınıftır var silmeye - ve bu kullanıcı Eğer daha fazla tutmak istemediği kişisel veriler var. Bunu zorunlu bir gereklilik haline getiren yerel yasalar (örneğin AB'de) olabilir ( Gavin için teşekkürler )

Eşit gerektirir kurallar olabilir değil bu yüzden yasaya uymak için yapmanız gereken ne herhangi bir düzenleyici otoriteler ile her şey kontrol karar vermeden önce, verileri silmek için.


8
Bazı uygulama alanları (muhasebe, tıbbi cihazlar) muhtemelen denetim gereklilikleri nedeniyle verilerin silinmemesini gerektirmektedir.
Paul,

3
Bazı durumlarda , kullanıcıların kişisel bilgileriyle ilgili herhangi bir şey olan bir örneği silmeniz GEREKİR . AB Yasası (ve muhtemelen başkaları), bir kullanıcının verilerinin silinmesini isteme hakkına sahip olması gerektiğini belirtir. Böyle bir durumda bu veriler silinmeli ve artık aktif olmadığı için işaretlenmemelidir. İkincisi gizlilik yasalarının ihlali olur.
Gavin Coates,

Veritabanında biraz yer açmak performansını arttırır mı?
viveksinghggits

17

Bu aslında birçok şirket için önemli bir sorundur. Hangi verilerin gerçekten kullanımda olduğunu net bir şekilde belirlemenin bir yolu yoktur, bu yüzden sadece veritabanında bulunur. Veri silme ve arşivleme her büyük sistem tasarımının bir parçası olmak zorundadır, ancak nadiren öyledir. Pek çok şirket sadece onunla yaşıyor, daha büyük diskler satın alıyor ve performanslarını korumak için sorgularını ve endekslerini değiştiriyorlar, sistemleri değiştirene kadar ve ardından mevcut verileri tanımlamak ve bu kayıtları yalnızca yeni sistemlerine geçirmek için önemli miktarda çaba harcıyorlar.

Evet, gerekir senin veritabanından veri silme, ancak ne zaman ve anlatmak için sık sık basit değil.


1
"Hangi verilerin gerçekten kullanımda olduğunu net bir şekilde belirlemenin bir yolu yok" - Ben aynı fikirde değilim. Her tablodaki bir "IsDeleted" bit alanı, bir kaydı artık ilgili olmayan olarak tanımlamanın oldukça temiz bir yoludur. Silme işleminin nasıl basılacağı gibi, sorduğu soruların çoğu da fiziksel silme şemalarında mevcuttur ve cevaplar veri modeline ve depolama boyutuna veya performansına daha fazla değer verip vermediğinize bağlıdır.
KeithS

Söylediğim şey buydu, sistemler bir çeşit son kullanma göstergesiyle tasarlanmalı. Bu göstergelerin yokluğunda (birçok şirkette olduğu gibi), hangi kayıtların güvenle silinebileceğini tanımlamanın bir yolu yoktur.
TMN

12

Bu duruma, "Duruma bağlı olarak" kaynayan pek çok iyi cevap var ve bunlara hiçbir şey ekleyemiyorum.

Bununla birlikte, belirtilmemesi gerektiğini düşündüğüm bir şey, bir dizilim ya da bir AUTO_INCREMENT sistemi tarafından üretilen birincil anahtarları asla tekrar kullanmamanız gerektiğidir.

Böyle bir sistem tarafından birincil anahtar atanmış bir öğeyi sildiğinizde, birincil anahtar sütununda silinen verilerden kalan boşluklar olur. Bu boşlukları, eklendiklerinde yeni öğelere yeniden atamak, hatta daha da kötüsü, boşlukları kaldırmak için yeni bir kimlik vermek üzere mevcut verileri karıştırmak, ancak bunu yapmak sizin ortaya çıkacak sorunlara yol açacaktır. anahtarları sadece yalnız bıraktıysanız asla uğraşmak zorunda kalmazsınız.

Yeniden sipariş edilen sarf malzemelerini yönetmek için bir yazıcı veritabanını sakladığınızı varsayalım. Eski bir lazer yazıcı olan Yazıcı 13, ekonomik onarımın ötesine geçer, böylece siz onu atarsınız. Bu arada, ilgisiz bir nedenden dolayı, birisi depoda barkod yazdırma yapmak için yeni bir termal yazıcı sipariş eder ve bu yazıcı, yazıcı 13'ün değiştirilmesinden önce gelir. Yönetici bu yeni yazıcıyı veritabanına kaydeder ve çünkü 13 artık ücretsizdir. ve kimlikleri geri dönüştürüyorsunuz, yeni termal yazıcı 13'ü kimliği olarak tahsis ediyor.

Şimdi birileri size yazıcı 13'ün neredeyse tükendiğini söylüyor. Yazıcının 13 bir lazer yazıcı olduğunu hatırlıyorsunuz, bu yüzden veritabanına bakmaktan rahatsız olmuyorsunuz ve bir toner kartuşu siparişi veriyorsunuz. Yazıcı 13 artık lazer yazıcı olmadığından yalnızca termal mürekkep paketi sipariş etmeniz gerekiyordu. Toner kartuşu geldiğinde kullanamazsınız çünkü bu yazıcı için yanlış mürekkep doldurmasıdır, daha fazla barkod yazdıramazsınız ve gönderilmeyi bekleyen herhangi bir sipariş gönderemezsiniz.

Daha da kötüsü, yazıcıyı 13 silip boşluğu doldurmak için peşinden gelen tüm yazıcıları karıştırırsanız ne olur? Yazıcı 14 (bazı eskimiş eski nokta vuruşlu) yazıcı 13, yazıcı 15 ise yazıcı 14 ve benzeri hale gelir.

Tüm yazıcıların üzerinde etiketler vardır, böylece veritabanına çapraz referans verilebilirler, ancak şimdi tüm etiketler eskidir. İlerlemeniz gerekecek, işletmedeki her yazıcıyı bulmanız (ki bunlar yüzlerce olabilir!) Ve yeniden etiketlemeniz gerekir. Bu, zamanın etkili bir şekilde kullanılması anlamına gelmez. Ve aynı zamanda hataya açık bir işlemdir ve hiç yapılmazsa ne olur? Birisi 14 yazıcısının bozulduğunu ve acilen düzeltilmesi gerektiğini söylesin diye ararsınız, bu nedenle bakarsınız ve 14 yazıcısının Resepsiyonda inkjet yazıcı olduğunu görürsünüz. Sadece kimlikleri karıştırdığınız için, aslında acilen düzeltilmesi gereken nokta vuruşlu yazıcı. Sorunu çağıran adam takılmaya bırakılırken, resepsiyonist, kırılmayan bir yazıcıyı tamir etmek için hiç aramadığı bir teknik destek görevlisine sahiptir.

Bir otomatik artış sistemi tarafından kalıcı olarak atanan kimlikleri kalıcı olarak düşünmelisiniz, değişmezler ve kimliğin ifade ettiği şey sona ererse bile tekrar kullanılamazlar. Bazı insanlar, kimlikleri tükenmek konusunda endişelenmek istemediklerini iddia ediyor, ancak 32 bit sistemlerde ve imzalı kimliklerde bile 2 milyar kadar kimlik var. Kimlik sütununu imzasız hale getirebilirseniz, bu işlem 4 milyar olur ve 64 bit sistemlerde kullanılabilir kimlikler adeta gökyüzündeki yıldız sayısından daha fazladır. Kimlikleriniz tükenmeyecek.


3
Çoğu durumda otomatik olarak üretilen sayıları hiç düşünmemelisiniz, anlamsızdırlar ve kullanıcıya maruz bırakılmamalıdırlar. Yazıcının 13 mürekkebinin azaldığını, belki de "13 numaralı yazıcıdaki yazıcıyı" belirten bir mesaj almamalısınız, ancak otomatik olarak üretilen numaradan değil.
jmoreno

Doğru, ancak yukarıdaki örnek tam olarak böyleydi, otomatik olarak üretilen anahtarlarla uğraşırsanız neyin yanlış gidebileceğini gösteren bir örnek. Gerçekte, referans bütünlüğü ile yapmak daha iyidir.
GordonM

Yabancı anahtar kısıtlamaları yoksa ve bunun yerine psuedo yabancı anahtarlarınız varsa, bu sadece bir RI problemidir. Bu durumda muhtemelen daha büyük sorunlarınız var.
jmoreno

Ne kadar mysql veri tabanına girdiğime şaşıracaksınız. Pek çok geliştirici innodb'a karşı bir isteksizliğe ve hatta tüm tesislerini kullanmayanlara karşı bir isteksizliğe sahip görünüyor.
GordonM

4

Burada zaten pek çok iyi cevap var. Sadece henüz kimsenin bahsetmediği bir durum eklemek istiyorum:

Hassas verileri . Kullanıcı onu silerse, o zaman gerçekten onu silmek daha iyi!

Akla gelen çok yaygın bir durum parola değiştirme / sıfırlamadır. Veritabanınızda eski şifreleri (karma, tuzlu vb.) Saklamak istemezsiniz. Kullanıcılar eski (ve kötü) şifrelerini başka sitelerde kullanıyor olabilir.

Ayrıca, belirli türdeki verileri saklamanıza izin verilen yasalara gelince, tabii ki yumuşak silinmeler yapmaz. Onu gerçekten silmelisin.

Bu yüzden kendime şunu sorardım: kullanıcı (ya da başka birisi, örneğin hükümet) verinin silindiğine inandırırsam sinirlenir mi, ama aslında yine de elimde ve her an geri yükleyebilirim?


İlginç. Büyük şirketler bunu gerçekten uyguluyor mu?
fuddin

2
Bu iyi bir nokta, ancak parola geçmişi örneğinize gelince - eski parolaları sık sık saklamak istersiniz, böylece son 12 ya da her neyse bunların kopyaları olmadıklarından emin olabilirsiniz. Beni yanlış anlama - Bu politikayı sevmiyorum, ama uyguladım ve kurumsal uygulamalarda oldukça yaygın görünüyor.
Mike Partridge

2
Sadece bilgili olmak için hiçbir zaman bir şifreyi saklamamalısınız. Tek yönlü şifreli sonucu depolarsınız. Birisi şifresini unutursa, onlar için yeni bir tane oluşturursun. Bir şifreyi "kurtarmak" YOK YOK olmalı, çünkü eğer başarabilirseniz başkası yapabilir.
TMN

1
Kredi kartı numaraları Asla saklanmamalı. Aslında asla saklanmamalı. Bir müşteri bana e-postayla kredi kartı numarasını gönderecek kadar aptalsa, gerçek bir sorunum var. Ondan kurtulmanın bir yolu olmalı.
gnasher729

AB GSYİH, görüşlerini bildirir.
ekran adı

3

Genellikle veritabanımdaki kullanıcı verilerini kaldırmıyorum. Onları gizlenmeleri için işaretliyorum. Çoğu zaman bir kullanıcı yanlışlıkla bir şeyi siler ve kolayca değiştirilmesini ister. Aynı zamanda ilgili veriler için referans bütünlüğünün korunmasına yardımcı olur. Bu, küçük ve orta ölçekli veritabanları için çalışır. Performansın bu karardan ağır şekilde etkilendiği sistemlerde, arşiv tabloları, otomatik yedeklemeler vb. Gibi özel yollarla ele alınmaktadır.

Gerektiği gibi arka uç verilerini atarız, örneğin süresi dolmuş web sitesi oturum verileri ve eski günlük bilgileri. Onları sonsuza dek korumanın hiçbir anlamı yok.

Her zamanki gibi, kesin cevap gerçekten özel duruma bağlı.


1

Bunun gerçekleştiği birkaç yıl boyunca Döviz müracaatı üzerinde çalışıyorum. Uygulamanın yıllar boyunca topladığı veriler performans üzerinde etkili olmuştur (üstel).

Kod açısından elimizden geleni yaptıktan sonra, bir yıldan daha eski verileri arşivlemeyi yönetmeye önerdik. Konsepti doğruladılar (yasal sorunlar) ve neyse ki bunu başarabildik. Böylece sildik ancak verileri arşivledik, böylece işletme hala raporlarını çalıştırabilirdi vs.


1

Çoğu durumda, gelecekte gerekli olması durumunda verileri saklamanız gerekir. Çalıştığınız işletme, şirketin şirketini belirli bir yöne yönlendirecek kararlarını temel almak için geçmiş verilere bakmak isteyebilir.

Her tabloya 'Date_Time_Removed' sütunu eklemeniz ve satırları fiziksel olarak silmek yerine satırın neredeyse silindiği bir tarih ve saat belirlemeniz gerekir. Sonra saklı yordamlarınızda veya sql'nizde 'Date_Time_Removed' sütununda etken olur; örneğin, date_time_removed öğesinin boş olduğu tablo1'den bir blah seçin.

Elbette bir veritabanına yanlışlıkla eklenmiş olan satırlar, özellikle de test verileri olmak üzere kalıcı olarak kaldırılmalıdır.

Tüm okunaklı verileri saklayarak, gelecekte depolamak için veritabanınızı kullanma seçeneğiniz de vardır.


0

Sunulan diğerlerinden başka bir durum, verilerin silinmesidir ancak veritabanında yapılan işlemlerin kayıtları (silme dahil) uzun süre arşivlerde saklanır. Bunun ana kapsamı, geçmiş tarihlere bir geri alma sistemi uygulamaktır, ancak silinen verileri (veritabanından silinen, ancak arşivlerde saklanan) bir şekilde depolamak için de kullanılabilir.

Silinen verilerin arşivlerini saklamak bu kadar büyük bir anlaşma olmaz. Büyük şirketler ayrıca kod sürümlerini ve daha birçok bilgiyi (teknik olmayan ilgili şeyler hakkında konuşmamak) saklayabilirler; bu nedenle büyük verilerin depolanması sonunda onlar için olağan bir durumdur.

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.