(potansiyel olarak) on milyonlarca kayıt içeren bir tablo.
SQL Server'ın verimli bir şekilde işleyebileceği göz önüne alındığında, aslında bu kadar değil. Tabii ki, en büyük tablolardan birinin (tek örnekli sistem) 2 milyon sıraya sahip olduğu ve şimdiye kadar ele aldığım en yüksek işlerden birini hatırlıyorum. Daha sonra bir sonraki iş, yüz milyonlarca satıra sahip bazı tablolarla 17 Üretim örneğine sahipti ve bunların hepsi, 1 milyardan fazla satıra sahip birden fazla olgu tablosuyla bir Veri Ambarı'nda toplandı. Beni yanlış anlamayın, on milyonlarca satırda alay etmiyorum, sadece iyi bir veri modeli ve uygun indeksleme (ve dizin bakımı) ile SQL Server'ın çok işleyebileceğini vurguluyorum .
Herhangi bir zamanda öğelerin% 50'sine kadar "onaylanmamış" olabilir.
Hmm. Kulağa doğru gelmiyor. Girişleri "onaylama" oranı, yeni giriş alma oranının yarısı kadardır? Her 2 yeni giriş için yalnızca 1 tanesi "onaylanacak" mı? 2 milyon satır ve her biri "onaylanmış" ve "onaylanmamış" için 1 milyon, bir kaç yıl sonra 10 milyon girişle, her birinin "onaylanmış" ve "onaylanmamış" için 6 milyon olmasını mı bekliyorsunuz? Yoksa 1 milyon "onaylanmamış" bir şekilde sabit kalacak mı, 10 milyon yeni giriş ile 11 milyon "onaylı" ve hala 1 milyon "onaylanmamış" olacak mı?
Kayıtlar "onaylanabilir", ancak tam tersi olmayabilir.
Bugün bu doğrudur , ancak işler zamanla değişir ve bu nedenle işletmenin "onaylamama" ya da "arşivlenmiş" gibi başka bir duruma izin vermeye karar vermesi olasılığı her zaman vardır.
Öyleyse, seçimlere bakalım:
İşaretle (veya muhtemelen TINYINT
"durum")
- Her durumun sorguları için biraz daha yavaş
- Zaman içinde daha esnek / yalnızca yeni bir Arama durumu değerine sahip üçüncü bir durum (örneğin "Arşivlendi") gibi bir değişikliği dahil etmek kolaydır. Yeni tablo yok (zorunlu olarak), bazı yeni kodlar, sadece bazı kodlar güncellendi.
- Daha az iş (kod, test vb.) Ve tek bir
TINYINT
sütunu güncelleme hatası
- Daha az karmaşık = zaman içinde daha düşük bakım maliyetleri, yeni çalışanların anlaması için daha kısa eğitim süresi
- (muhtemelen) Bir tablo güncellendiğinde İşlem Günlüğü üzerinde daha küçük etki
- İki tablo arasında "RecordStatus" ve FK için bir Lookup tablosuna ihtiyacınız var.
İki ayrı tablo (biri "onaylandı", biri "onaylanmadı" için)
- Her durumun sorguları için biraz daha hızlı
- Zaman içinde daha az esnek / üçüncü bir durum (örneğin "Arşivlendi") gibi bir değişikliği dahil etmek daha zor; yeni durum büyük olasılıkla başka bir tablo ve kesinlikle yeni ve güncellenmiş kod gerektirir.
- Daha fazla çalışma (kod, test vb.) Ve kayıtların "Onaylanmadı" tablosundan "Onaylandı" tablosuna taşınması için daha fazla alan
- Daha karmaşık = zaman içinde daha yüksek bakım maliyetleri, yeni çalışanların anlaması için daha uzun eğitim süresi
- (muhtemelen) Bir tablo silindiğinde ve bir tablo eklendiğinde İşlem Günlüğü üzerinde daha büyük etki
- " Öğenin kimliğinin yenilenmesi " konusunda endişelenmenize gerek yok : Onaylanmamış tablonun bir
IDENTITY
sütun olan kimlik sütunu ve Onaylanan tablonun (burada gerekli olmadığı için) olmayan bir kimlik sütunu IDENTITY
vardır. Dolayısıyla tablolar arasında kayıt hareket ettikçe kimlik değerleri tutarlı kalır.
Şahsen ben StatusID
başlamak için sütun ile tek tabloya doğru eğilir . İki tablo kullanmak aşırı karmaşık, erken bir optimizasyon gibi görünüyor. Kayıt sayısının birkaç yüz milyonlarca olması ve endekslemenin herhangi bir performans kazanımı sağlamaması durumunda bu optimizasyon türü tartışılabilir .