Tombstone Tablosu vs Veritabanı senkronizasyonu ve yumuşak silme senaryolarında Silinen Bayrak


17

İstemci senkronizasyonu ihtiyaçları için silinen öğeleri takip etmem gerekiyor.

Genel olarak, bir mezar taşı tablosu ve sunucu veritabanından bir satır silindiğinde izleyen bir tetikleyici eklemek daha iyidir - temel olarak silinen öğedeki verilerle mezar taşı tablosuna yeni bir satır eklemek - veya öğeleri orijinal tabloyu seçin ve bir satırın silindiğini ve silme gerçekleştiğinde izlenecek başka bir sütunu belirtmek için bunları genellikle bit türünde bir sütunla silindi olarak işaretleyin ?

Yanıtlar:


17

Genel olarak, belirli gereksinimleri bilmek ve çoğu durumda neyin en iyi olduğuna bağlı olarak tasarım kararları vermemek daha iyidir. Her ikisi de tercih edilebilir. Toplanacak bazı özellikler:

  • Silme işlemlerinin ne kadar hızlı olması gerekir?
  • Silme işlemlerinin ne kadar hızlı olması gerekir?
  • Silinen veriler ne sıklıkta sorgulanacak ve silinmemiş verilerle sorgulanacak mı?
  • Silinmiş veri sorgularının ne kadar hızlı olması gerekir?
  • Yalnızca silinen öğeleri veya değişiklikleri korumanız mı gerekiyor?
  • Birincil tablodaki tabloyu / dizinleri küçük tutmanız mı gerekiyor?
  • Veritabanı platformunda hangi bölümleme ve / veya değişiklik izleme teknolojileri bulunmaktadır?
  • Ne kadar disk alanı var?
  • Silme işlemi anında veya toplu işlemlerde mi gerçekleşecek?

Görüyorum ki, bu farklı sistem gereksinimleri arasında bir takas konusu. Hızlı silmeye / silmeye ihtiyacım olursa, bayrak tercih edilir, ancak silinen öğeler ve birincil tabloda hızlı sorgulara ihtiyacım varsa ve belki de her türlü değişikliği izlemem gerekiyorsa, kaldırıldı olarak işaretleme yaklaşımı daha iyi.
Lorenzo Polidori

Anladın. Başka bir seçeneğin tercih edileceği durumlar bile olabilir. Örneğin, yalnızca yumuşak silme işlemlerinin 24 saat boyunca kullanılabilir olması gerekiyorsa, Oracle'da garantili bir geri alma saklama süresi ayarlamayı ve ardından silinen verileri görmek için geri dönüş sorgularını kullanmayı düşünebilirsiniz.
Leigh Riffel

5

Belki iki yöntemi bilerek birleştirmelisiniz. Neden ???

Bu tabloyu kullanalım (MySQL-dialect)

CREATE TABLE mydata
(
    id int not null auto_increment
    firstname varchar(16) not null,
    lastname varchar(16) not null,
    zipcode char(5) not null,
    ...
    deleted tinyint not null default 0
    KEY (deleted,id),
    KEY (deleted,lastname,firstname,id),
    KEY (deleted,zipcode,id),
    KEY (lastname,firstname),
    KEY (zipcode),
    PRIMARY KEY (id)
);

PRIMARY KEY hariç, yaptığınız her dizinin öncesinde deletedbayrak olması ve ile bitmesi gerektiğini unutmayın id.

Mezar taşı tablosunu oluşturalım

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

Tablonuzda zaten bir deletedbayrak varsa, mezar taşı tablosunu doldurabilirsiniz

INSERT INTO mytomb SELECT id FROM mydata WHERE deleted = 1;

Tamam şimdi veri ve mezar taşı hazır. Silme işlemlerini nasıl gerçekleştirirsiniz?

Diyelim ki 07305 posta kodundaki herkesi siliyorsunuz. Aşağıdakileri çalıştırırsınız:

INSERT IGNORE INTO mytomb SELECT id FROM mydata WHERE deleted=0 AND zipcode='07305';
UPDATE mydata SET deleted=1 WHERE deleted=0 AND zipcode='07305';

Tamam bu her iki şekilde de bakıldığında bir sürü yük gibi görünüyor.

Şimdi, silinen tüm verileri görmek istiyor musunuz? İşte iki farklı yol:

  • SELECT * FROM mydata WHERE deleted=1;
  • SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);

Mytomb'deki id sayısı, verilerimin satır sayısının% 5'inden fazlaysa, tam tablo taramasıdır. Aksi takdirde, her satır için arama içeren bir dizin taraması. Bu bakımdan tüm ölçütlere dikkat edin. Açıklama planlarına bakın.

Şimdi, 07304 posta kodlu herkesi görmek ister misiniz? İşte iki farklı yol:

  • SELECT * FROM mydata WHERE deleted=1 AND zipcode='07304';
  • SELECT A.* FROM mydata A LEFT JOIN mytomb B USING (id) WHERE B.id IS NULL AND A.zipcode='07304'

Kitle silmeye ne dersiniz? İşte iki farklı yol:

  • DELETE FROM mydata WHERE deleted=1;
  • DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;

SONUÇ

Şimdi, her iki yöntemi de saklamayı söylemiyorum. Bunu zaman içinde yapmak, genel çalışabilirlik açısından hangi yöntemin daha hızlı olduğunu gösterir. Canlı verileri sorgulamak, silinen verileri sorgulamak ve toplu silme işlemlerinin sizin için en iyi sonucu vereceğine karar vermelisiniz.


Her iki tekniği de sürekli olarak kullanmanın bir avantajı var mı? Ya da performansı değerlendirmek için bunları paralel olarak kullanmayı ve sonra birini ya da diğerini taahhüt etmeyi mi öneriyorsunuz?
Tüm Ticaretten Jon
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.