Zalety i wady korzystania z typów ENUM vs Integer?


110

Powiedzmy, że w jakiejś losowej tabeli masz kolumnę o nazwie status . To rzeczywiste wartości byłyby włączone lub wyłączone .

Czy lepiej jest, jeśli typem danych tej kolumny jest int / bool (1 lub zero), czy użycie ENUMwartości o wartościach enabledi disabled? Jakie są zalety lub wady?

Powiedzmy, że zamiast tylko dwóch ważnych statusów, masz 4 lub 10, a nawet więcej? Czy zalety i wady kołyszą się z jednej lub drugiej strony, gdy rośnie liczba wymaganych wartości?


5
To pytanie powinno zostać dodane do zakładek przez wszystkich programistów MySQL, ponieważ może stać się źródłem złamanego serca lub zwycięstwa. +1 !!!
RolandoMySQLDBA

Odpowiedzi:


70

Znalazłem bardzo dziwny, ale pouczający artykuł na temat 8 powodów, dla których nie należy używać ENUM.

Nawet bez tego artykułu wiem


1
Mimo że inne odpowiedzi w tym wątku są bardzo pouczające, zaznaczam tę odpowiedź jako bardzo pomocny artykuł.
Jake Wilson

6
+1 Nie możesz ponownie użyć listy członków kolumny ENUM w innych tabelach. ENUM ma ograniczoną przenośność do innych DBMS.
poniedziałek

Co powinienem zrobić, jeśli pole ma relacje z innymi rekordami tej samej tabeli? Załóżmy na przykład, że unitsmodel sklepu zawiera przedmioty, w których każdy rekord powinien mieć właściwość dla powiązanych jednostek composition. tj. Ton, Kg, gm
SaidbakR

Nic dziwnego w tym artykule - jest świetny! Myślę, że to ten post wyjaśnił mi, dlaczego są źli! Dałem mu +1!
Vérace

1
Artykuł sugeruje użycie starej dobrej tabeli zamiast typów ENUM. Czy powinniśmy dodać to do odpowiedzi?
Utku

39

Po pierwsze, mamy wymagania dotyczące przechowywania . Zakładam, że miałeś na myśli tinyint (zamiast int).

  • ENUM zajmuje 1 bajt (jeśli jest poniżej 255 wartości) lub 2 bajty (maksymalnie 65 535)
  • TinyInt zajmuje 1 bajt (maksymalnie 255 wartości)
  • Boolean jest synonimem TinyInt

Na powierzchni wszystkie są takie same. ENUM pobiera jednak pewne metadane dla powiązanej z nim wartości ciągu ( starszy src )

Powiedziałbym, że kiedy dodajesz więcej wartości, wszelkie korzyści zaczynają odchodzić ENUM. Zwłaszcza jeśli dodasz wartości po tym, jak tabela jest już w użyciu, ponieważ musisz zmienić strukturę tabeli, aby ją dostosować.

Jaka jest zaleta korzystania z ENUM? Ciąg znaków reprezentujący wartość. To wszystko, o ile mi chodzi. Jak cenna jest to zależy od twojej aplikacji.


4
+1 za wzmiankę o jedynej prawdziwej przewadze: reprezentacja łańcucha. Cała reszta to pranie do przodu.
RolandoMySQLDBA

19

Uważam, że ENUM jest krótką definicją tabeli kodów. Jego główną zaletą jest to, że unika kodu wymaganego do dołączenia i wyświetlenia opisu kodu. Ułatwia także ustawianie wartości, jeśli zostaną dostarczone w postaci ciągu.

Uważam, że ma następujące wady:

  • Brak możliwości uzyskania dodatkowych metadanych dotyczących kodu.
  • Trudno jest dodać lub wyłączyć wartości. (Wyłączenie kodów można wykonać za pomocą pola wyzwalacza i wygaśnięcia).
  • I18n w bazie danych nie można zrobić.
  • Nie można używać ponownie w różnych tabelach.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.