2009-09-02 16 views
5

Bir tamsayı (veya genel olarak herhangi bir sayı veri türü) ile ilgili olarak DB katmanında bir (Java) Numaralandırma (sabit sabitler kümesi) temsil etmek için performans ve "okunabilirlik/iyi kodlama stili" açısından en iyi çözüm nedir? dize gösterimi.Veritabanındaki Sabitleri (Enum) en iyi nasıl gösterir (INT vs VARCHAR)?

Uyarı: Orada doğrudan "numaralamalar" destekleyen bazı veritabanı sistemleri vardır ama bu iş-Layer-uygulanması ile senkronize Veritabanı Enum-Tanımı keept için gerektirecektir. Ayrıca, bu tür bir veri türü, tüm Veritabanı sistemlerinde mevcut olmayabilir ve aynı zamanda sözdiziminde de farklılık gösterebilir => Tüm veritabanı sistemlerinde kolayca yönetilebilen ve kullanılabilen kolay bir çözüm arıyorum. (Bu yüzden benim sorum sadece Sayı ve Dize gösterimini adresler.)

Bir sabitlerin Sayı gösterimi saklamak için çok etkili görünüyor (örneğin, tamsayı olarak yalnızca iki bayt tüketir) ve büyük olasılıkla indeksleme açısından çok hızlıdır ancak ("0" vs. "1" vs) okunması zor ...

Dize gösterimi daha okunabilir ("0" ve "1" ile karşılaştırıldığında "etkin" ve "devre dışı" saklamaktır), ancak çok fazla depolama alanı tüketir ve büyük olasılıkla endeksleme açısından daha yavaştır.

Sorularım, bazı önemli yönleri özledim mi? Veritabanı katmanında bir enum gösterim için ne önerirsiniz?

Çok teşekkür ederim! Bu geri enum ve çok daha istikrarlı ilişkilendirmek kolay olduğu gibi

+0

Tam çift: http://stackoverflow.com/questions/229856/ways-to-save-enums-in-database – ChssPly76

cevap

3

, ben genişletilmiş metin ile kısa alfanümerik kod kullanın ve sonra bir arama tablosu olmasını tercih ederim. Gerektiğinde, veritabanı tablosundan dinamik olarak programdaki enum tablosunu yapıyorum.

Örneğin, diyelim ki, işlem türünü içeren beklenen bir alan varsa ve olası değerler satışı, İade, Servis ve Layaway varsayalım. Kod ve açıklama içeren bir işlem türü tablosu oluşturabilir, kodları "SA", "RE", "SV" ve "LY" yapabilir ve kod alanını birincil anahtar olarak kullanabilirim. Sonra her işlem kaydında bu kodu yayınlayacağım. Bu, kayıttaki ve dizin içindeki bir tamsayı anahtarından daha az yer tutar. Tam olarak nasıl işlendiği, veritabanı motoruna bağlıdır, ancak tamsayı anahtarından önemli ölçüde daha az verimli olmamalıdır. Ve anımsatıcı olduğu için kullanımı çok kolay. Bir kaydı dökebilir ve değerlerin ne olduğunu kolayca görebilir ve hangisinin hangisi olduğunu hatırlayabilirsiniz. Kodları çeviri olmadan kullanıcı çıktısında görüntüleyebilir ve kullanıcılar bunları anlayabilir. Gerçekten de bu, tamsayı tuşlarına göre bir performans artışı sağlayabilir: Çoğu durumda, kısaltmalar kullanıcılar için iyidir - genellikle ekranları kompakt tutmak ve kaydırma işlemlerinden kaçınmak için kısaltmalar isterler - böylece işlem masasına katılmanız gerekmez çeviri almak için

Her kayıtta uzun bir metin değeri saklamıyorum. Bu örnekte olduğu gibi, işlem masasını dağıtmak ve "Layaway" i saklamak istemem. Bu sadece verimsiz olmakla kalmıyor, aynı zamanda kullanıcıların bir gün "Layaway satışı" ya da "Lay-away" gibi ince bir fark yaratmalarını istediklerini söylemesi oldukça olası. Sonra sadece veritabanındaki her kaydı güncellemeniz gerekmez, ancak bu metnin gerçekleştiği her yer için programı araştırmanız ve değiştirmeniz gerekir.Ayrıca, metin ne kadar uzun olursa, bir programcının bir programcı tarafından yanlış yazılması ve anlaşılmaz hatalar yaratması daha olasıdır. Ayrıca, bir işlem türü tablosuna sahip olmak, işlem türü hakkında ek bilgi depolamak için uygun bir yer sağlar. Asla, "eğer what whatcode = 'A' ya da whatevercode = 'C' ya da 'what' = 'X' yazıyorsa kod yazmayın." Bu üç kod, diğer kodlardan bir şekilde farklı kılan şey ne olursa olsun, işlem tablosunda ve bu alanı test edin. "Peki, bunlar vergiyle ilgili tüm kodlar" dır ya da herneyse, daha sonra "tax_related" adlı bir alan yaratır ve her kod değeri için doğru ya da yanlış olarak ayarlar. Aksi halde, bir kişi yeni bir işlem türü oluşturduğunda, bunların/veya listelerin tümünü incelemek ve bu türlerin eklenip eklenmemesi gerektiğini belirlemek zorundadır. Bu üç kod değerine niçin bazı mantıkların neden uygulandığını anlamak zorunda olduğum çok sayıda şaşırtıcı program okudum ve listede yer alması gereken dördüncü bir değer olduğunu düşündüğünüzde bunun çok mu olduğunu söylemek zor. Bir şekilde gerçekten farklı olduğu için ya da programcı bir hata yaptığında eksik.

Çeviri tablosunu oluşturmama neden olan tek liste, listenin çok kısa olduğu zamandır, tutulacak ek bir veri yoktur ve evrenin niteliğinden hiç değişmeyeceği açıktır. değerler güvenli bir şekilde kodlanmış olabilir. Doğru/yanlış veya pozitif/negatif/sıfır veya erkek/dişi gibi. (Ve yine de, bu sonuncusu, göründüğü kadar bariz, şu anda "transgendered" ve benzerlerini içermekte ısrar eden insanlar var.)

Bazı insanlar dogmatik olarak her tablonun otomatik olarak oluşturulmuş bir sıralı tamsayı anahtarına sahip olduğu konusunda ısrar ediyorlar. Bu gibi anahtarlar birçok durumda mükemmel bir seçimdir, ancak kod listeleri için yukarıda belirtilen nedenlerden dolayı kısa alfa anahtarını tercih ederim.

1

Ben, dize temsilini saklamak istiyorum. Ordinal() işlevini kullanmak, dizinin ortasına yeni bir numara eklerseniz değişebilir, bu nedenle kendi numaralandırma sisteminizi uygulamak zorunda kalırsınız. Performans açısından

, tüm çeteleler için kullanılacak bağlıdır, ancak büyük olasılıkla dönüşümle birlikte bir bütün ayrı temsilini geliştirmek yerine sadece doğal dize temsilini kullanmak için erken iyileştirmedir. Çoğu durumda

İlgili konular