ENUM vs Tam sayı türlerini kullanmanın avantajları ve dezavantajları?


110

Diyelim ki bazı rastgele tablolarda durum adında bir sütununuz var . Gerçek dünyadaki değerler ya etkinleştirilebilir ya da devre dışı bırakılabilir .

Bir int / BOOL (1 ya da sıfır) ya da kullanmak için bu sütun türüne için daha iyi ENUMdeğerler olmak enabledve disabled? Avantajları ve dezavantajları nelerdir?

Diyelim ki sadece iki geçerli statü yerine, 4 veya 10 veya daha fazlasına mı sahipsiniz? Gereken değerlerin sayısı arttıkça avantajlar ve dezavantajlar bir tarafa mı yoksa diğer tarafa mı sallanıyor?


5
Bu soru, tüm MySQL Geliştiricileri tarafından işaretlenmelidir, çünkü bu bir kalp kırılması veya zafer kaynağı olabilir. +1 !!!
RolandoMySQLDBA 19:11

Yanıtlar:


70

ENUM kullanmamasının 8 nedeni hakkında çok tuhaf ama bilgilendirici bir yazı buldum .

Makale olmadan bile biliyorum


1
Bu konudaki diğer cevaplar çok bilgilendirici olsa da, bunu çok yararlı bir yazı nedeniyle cevap olarak işaretliyorum.
Jake Wilson

6
+1 Bir ENUM sütununun üye listesini diğer tablolarda tekrar kullanamazsınız. ENUM, diğer DBMS'lerle sınırlı bir taşınabilirliğe sahiptir.
birgün

Bir alanım aynı tablonun diğer kayıtları ile ilişkide ise ne yapmalıyım? Örneğin, unitsher bir kaydın ilgili birimler için özelliği olması gereken bir mağaza ürünü modeli varsayalım composition. yani Ton, Kg, gm
SaidbakR

Bu makale hakkında garip bir şey yok - bu harika! Sanırım beni neden kötü olduklarına bağlayan bu yazıydı! +1 verdim!
Vérace

1
Makale, ENUM türleri yerine iyi bir eski tablo kullanmanızı önerir. Bunu cevaba ekleyelim mi?
Utku

39

Öncelikle depolama gereksinimlerine sahibiz . Seni küçük bir anlam ifade ettiğini varsayıyorum (int yerine).

  • ENUM 1 bayt (255 değerin altındaysa) veya 2 bayt (maksimum 65,535'e kadar) alır
  • TinyInt 1 bayt alır (en fazla 255 değer)
  • Boolean, TinyInt kelimesinin eş anlamlısıdır.

Yani, yüzeyde hepsi aynı. ENUM, kendisiyle ilişkilendirilmiş dize değeri için bazı meta veriler alıyor ( eski src )

Yine de, daha fazla değer ekledikçe, herhangi bir avantajın ortadan kalkmaya başladığını söyleyebilirim ENUM. Özellikle tablo zaten kullanımda olduktan sonra değerleri eklerseniz, buna uyması için tablo yapısını değiştirmeniz gerekir.

Bir kullanmanın avantajı nedir ENUM? Değerin ne anlama geldiğini gösteren bir dize temsili. Endişelendiğim kadarıyla bu kadar. Bunun ne kadar değerli olduğu, uygulamanıza bağlıdır.


4
Tek gerçek avantajdan bahsetmek için +1: Dize gösterimi. Geriye kalan her şey ileride bir yıkama.
RolandoMySQLDBA 19:11

19

ENUM'un bir kod tablosunun kısa bir tanımı olduğunu görüyorum. Başlıca avantajı, katılmak ve kod açıklamasını göstermek için gereken kodu kaçınmasıdır. Ayrıca, dize biçiminde gelirlerse değerleri ayarlamayı kolaylaştırır.

Aşağıdaki dezavantajlara sahip olduğunu düşünüyorum:

  • Kod hakkında ek meta veriler için yetenek yok.
  • Değer eklemek veya devre dışı bırakmak zor. (Devre dışı bırakma kodları bir tetikleyici ve son kullanma alanıyla sağlanabilir.)
  • Veritabanındaki I18n yapılamaz.
  • Tablolar arasında tekrar kullanılamaz.
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.