Eski veritabanı sütunlarının kullanımdan kaldırılmasıyla ilgili en iyi uygulamalar nelerdir? [kapalı]


14

Erken bir aşamada müşterilerden A, B ve C verileri toplayacak bir uygulama tasarlıyorum, ancak daha sonra bunun yerine A, B ve D verilerini toplayacak.

A, B, C ve D çok ilişkilidir ve şu anda tek bir veritabanı PostgreSQL tablo T'nin sütunları olarak mevcuttur .

C artık gerek yok, ben benim başvuru ( Django ORM kullanın ) referanslarını kaldırmak istiyorum , ama zaten girilen verileri tutmak istiyorum. Bunu yapmanın en iyi yolu nedir?

ABD için yeni bir tablo oluşturmayı düşündüm, ancak bu, tablo T'ye başvuran herhangi bir satırla ilgili sorunlara neden olabileceği anlamına gelir.

Sadece C sütununu bırakabilir ve koddaki referansları kaldırabilir, mevcut verilerin hayatta kalmasını sağlayabilirim.

Görmediğim daha iyi bir seçenek var mı?

Bazı ekstra ayrıntılar:

Satır sayısı büyük olmayacak, büyük olasılıkla kullanıcı başına 1-2 olacaktır. Bu bir kitlesel pazar uygulamasıdır, ancak C'den D'ye geçiş yaptığım zaman, kullanıcı tabanı henüz çok büyük olmayacaktır. Bu bir olasılık olmasına rağmen, C ve D muhtemelen aynı anda toplanmayacaktır. C ve D büyük olasılıkla her birini birden değil, her biri birden fazla sütunu temsil eder.


Buna yaklaşmanın doğru yolunun, {A, B, C} 'den toplanan satırlarla {A, B, D}' den toplanan satırları ayırmanız gerekip gerekmediğine ve eğer evet ise, mevcut verilerinize bağlı olduğunu düşünüyorum. model buna izin verir. Ayrıca, {A, B, C} 'den toplanan satırlarla ne yapacağınıza da bağlı olacaktır - uygulamanın yeni sürümü bunları boş bir "D" ile {A, B, D} olarak gösterir, ancak kullanıcı C sütununun içeriğini görmezse, içeriği görmediği için o satırı db'den silebilir (uygulama satırların silinmesine izin veriyorsa).
Doc Brown


C ve D ile aynı anda toplanan hiç satır var mı? Yoksa her zaman A, B, C, Null veya A, B, Null, D mi olacak? Aynı satırlarda kısa bir süre için C, D varsa ... A, B, C ve A, B, D tablolarının olmamasının nedeni nedir? Yüzlerce veri satırından mı bahsediyoruz? Milyonlarca? milyarlarca? Tepki süresi bir faktör mü? Her durumu benzersiz kılan detaylar ...
WernerCD

@WernerCD, soruya davamla ilgili bazı ayrıntılar ekledi
Jad S

Ya sütunu kullanırsınız ya da kullanmazsınız. Kullan, sakla. Yapma, bırak. Verileri saklamak istiyorsanız, farklı bir tabloya taşıyın (yabancı anahtar kısıtlaması yok) veya dışa aktarın.
Thaylon

Yanıtlar:


31

Verileri saklamak istiyorsanız, eski değildir. Sadece olduğu yerde bırakın. Bir tabloya eşlenen bazı sınıfların her sütunu eşlememesi sorun yaratmaz.


1
bir süre sonra çok sayıda boş sütun alabilirsiniz
Ewan

8
belki
Ewan

8
Sanırım bu tür bir cevaptan rahatsızlık duyuyorum, elbette ondan kurtulabilirsiniz, ama teknoloji borcu. Sonunda gerçek bir çözüm istiyorsun ve şimdi tüm teknoloji işe sınıfının en iyisi olan sınıf şirketinizin neden db'nize dağılmış rastgele sütunlara sahip olduğunu açıklamak zorunda değilsiniz
Ewan

1
@Ewan'ın amacını görüyorum, ancak kullanım durumum için bunu yapmalı. İşler kafamda aşırı basitleştirilmiş olabilir, ancak daha sonra bir veri taşıma komut dosyası çalıştırmak gerekirse, C verilerini T tablosundaki orijinal satıra referansla yeni bir tabloya kopyalamak ve sonra silmek oldukça basit olmalıdır. T tablosundaki C sütunları.
Jad S

3
@Ewan - diyelim ki sütun eskimesi sadece bir kez olmayacak - tasarım gereksinimleri keşfedildiği veya değiştiği için birkaç kez olabilir. Bir null sütunun alternatifi, bir sütun artık kullanılmadığında ayrı tablolara (örn. Kalıtım yapıları) bölünmekse, veritabanı eski sütunlar için birleştirme tablolarıyla doludur. Bunun daha da kötü sonuçlanacağına inanıyorum.
Thomas W

8

Tamam, böylece durumunuz eski satırların C özelliğine sahip olmasını istiyorsunuz, ancak yeni satırlar istemiyorsunuz.

Bu, bir sınıf mirası ilişkisine sahip olmakla eşdeğerdir

class All
{
    string A;
    string B;
}

class Old : All
{
    string C;
}

class New : All
{
    string D;
}

veritabanında 1'e 1 ilişkisi olan üç tablo ile temsil edeceğiniz

table All
    id varchar
    A varchar
    B varchar

table Old
    id varchar
    C  varchar

table New
    id varchar
    D  varchar

Böylece yeni Eski tabloyu oluşturmak için bir geçiş komut dosyası oluşturabilir, id ve C verilerini ona kopyalayabilir ve C sütununu Tüm tablosundan kaldırabilirsiniz.

Kodunuzu yeni sql ile gerektiği şekilde güncelleme;

Alternatif olarak, yalnızca eski C verilerini sorgulayabilmeniz gerekiyorsa, A, B, C ile tüm verileri kopyalayıp C sütununu kaldırarak yeni bir Arşiv tablosu oluşturabilirsiniz, D col'u 'Live' tablonuza ekleyin


1
Tabloları ayırırsam, üçünü almayı tercih ederim: {A, B} {C} {D}
Aconcagua

bu örnekle uyuşmuyor mu?
Ewan

Bekle. okumak özledim
Ewan

2

Veri depolama endişe yaratabilirse, tabloları bölün: anahtar / A / B tuşu / C tuşu / D

Bir görünüm (db'deki veri konumunun tanımı) veya ORM tanımını değiştirerek erişim gerçekleştirebilirsiniz.

Bu en yüksek performans değil (birleştirme dahil), ancak altta bulunan depolamayı değiştirmeden A / B / C / D'nin herhangi bir kombinasyonunu sunabilir ve gerçek erişim kalıplarınıza bağlı olarak yeterli olabilir.

Bir üretim sisteminde arıza süresi, yeniden yapılandırma tabloları vb. Alma şansınız olmayabilir.

Görünümü kullanarak erişimin gerçekleştirilmesi, alt tabloda yer alan tabloda minimum değişiklikle ve veri hareketi olmadan A / B / C'den A / B / C / D'ye A / B / D'ye geçmenizi sağlar. Bir görünüm okuma mantığına saydam olacak ve eğer dbms'iniz ya fonksiyonları ya da güncellenebilir görünümleri destekliyorsa yazma mantığına da şeffaf olacaktır.

Gerçekten kararınızın birçok gerçek dünya endişesini yansıtacağını düşünüyorum: 1) C & D veri türleri nelerdir 2) C / D için toplanan göreceli veri hacimleri 3) C / D verilerinin tamamen C veya D girişlerine kıyasla göreceli çakışması 4) Kesinti / bakım penceresi kullanılabilirliği ve süresi 5) Güncellenebilir görünümler için DBMS Desteği 6) db fiziksel yapı detaylarının ORM'de tutulması ve db'deki görünümler / işlevler aracılığıyla sunarak şeffaf hale getirilmesi (tüm erişim için aynıdır) sadece geçerli olanı değil)

Cevabım (1) için büyük / karmaşık veri türleri, (3) için küçük çakışma ve (4) için minimum kesinti süresi, ideal olarak (5) 'te iyi dbms desteği ve (6)' daki verilere erişen çoklu uygulamalar için tercih etti.

Ancak birçok alternatif için doğru / yanlış yoktur: - A / B / C ile başlayın, daha sonra D ekleyin, ORM'yi ayarlayın, daha sonra C sütunu bırakın - A / B / C / D ile başlayın ve null'ları yok sayın vb. , çözümünüzü ve amaçlanan amaç / yaşam döngüsü hakkında bildiklerinizi düşünün, bazı boyut / hacim modellemesi yapın ve her şeyi beklediğimiz gibi döndürmeyeceğinden işleri daha sonra değiştirmeyi bekleyin.


1

Referansların kaldırılması ve verilerin yetim kalması düşük riskli bir seçenektir.

Sütunu kaldırarak açığa çıkarmak önemli olabilecek veya olmayabilecek verilerin her zaman bilinmeyen 'arka kapı' kullanımları vardır.

C sütununun içeriğine bağlı olarak, DB dahili olarak tam tablo taraması yaptığında veya optimizasyon aracı bunu dizinleri kullanmaktan daha verimli olarak görürse birleştirmeler sırasında tüm tabloyu belleğe çekmeye çalıştığında küçük bir performans sorunu olabilir.

Uygulamalar seçili sütunlardan ziyade tüm tabloyu okuyor olabilir - ancak yalnızca bir ORM kullanıyorsanız, bu olası değildir.


1

Burada göz önünde bulundurulması gereken birçok şey var, ancak doğrudan tabloda değişiklik yapmak yerine, tabloyu kaplamak için bir görünüm eklemeyi düşünebilirsiniz. Bu şekilde değişmesi gereken sadece görüştür.

Django ORM'ı bilmiyorum, ama bir olasılık olabilir.


2
OP, Postgres kullandıklarını söyledi.
TripeHound

Teşekkürler - bir etiket görmedim. Q.
Robbie Dee

0
  • A, b, c sütunlarına sahip bir Tablo A'nız var.
  • A, b, d sütunlarıyla yeni bir Tablo B oluşturun.
  • Verilerinizi Tablo B'ye taşıyın.
  • Yabancı anahtarlarınızı A tablosuna B tablosuna getirin.

Şimdi Tablo B'yi kullanabilirsiniz ve hala referans olarak eski verileriniz vardır.

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.