Vantagens e desvantagens de usar tipos ENUM vs Inteiro?


110

Digamos que em alguma tabela aleatória, você tenha uma coluna chamada status . Seus valores do mundo real seriam ativados ou desativados .

É melhor que o tipo de dados desta coluna seja int / bool (1 ou zero) ou use ENUMcom os valores sendo enablede disabled? Quais são as vantagens ou desvantagens?

Digamos que, em vez de apenas dois status válidos, você tenha 4 ou 10 ou mais? As vantagens e desvantagens oscilam para um lado ou para o outro à medida que o número de valores exigidos aumenta?


5
Esta pergunta deve ser marcada por todos os desenvolvedores do MySQL, pois pode se tornar uma fonte de desgosto ou triunfo. +1 !!!
RolandoMySQLDBA 19/10/11

Respostas:


70

Achei um artigo muito bizarro, mas informativo, sobre 8 razões pelas quais não se deve usar o ENUM.

Mesmo sem o artigo, eu sei


11
Mesmo que as outras respostas neste tópico sejam muito informativas, estou marcando esta como a resposta por causa do artigo muito útil.
Jake Wilson

6
+1 Você não pode reutilizar a lista de membros de uma coluna ENUM em outras tabelas. ENUM tem portabilidade limitada para outros DBMS.
onedaywhen

O que eu devo fazer se um campo tiver relações com outros registros da mesma tabela? Por exemplo, suponha unitsmodelo para itens de uma loja onde cada registro deve ter propriedade para suas unidades relacionadas composition. ou seja, Ton, Kg, gm
SaidbakR

Nada de bizarro nesse artigo - é ótimo! Eu acho que foi esse post que me levou a entender por que eles são ruins! Eu dei um +1!
Vérace 24/10

11
O artigo sugere usar uma boa tabela antiga, em vez dos tipos ENUM. Devemos adicionar isso à resposta?
precisa

39

Bem, primeiro temos os requisitos de armazenamento . Eu vou assumir que você quis dizer um tinyint (em vez de int).

  • ENUM usa 1 byte (se estiver abaixo de 255 valores) ou 2 bytes (até o máximo de 65.535
  • TinyInt leva 1 byte (máximo de 255 valores)
  • Boolean é um sinônimo para TinyInt

Então, na superfície, eles são todos iguais. ENUM ocupa alguns metadados para o valor da string associado a ele ( src antigo )

Eu diria que, à medida que você adiciona mais valores, qualquer vantagem começa a se afastar ENUM. Especialmente se você adicionar os valores após a tabela já estar em uso, porque é necessário alterar a estrutura da tabela para acomodar.

Qual é a vantagem de usar um ENUM? Uma representação de sequência do que o valor significa. É isso, no que me diz respeito. A importância disso depende da sua aplicação.


4
+1 por mencionar a única vantagem real: representação de cadeias. Tudo o resto é uma lavagem daqui para frente.
RolandoMySQLDBA 19/10/11

19

Acho ENUM é uma definição curta de uma tabela de códigos. Sua principal vantagem é que evita o código necessário para ingressar e mostra a descrição do código. Também facilita a configuração dos valores se eles chegarem em forma de sequência.

Acho que tem as seguintes desvantagens:

  • Não há capacidade para metadados adicionais sobre o código.
  • Difícil adicionar ou desativar valores. (Os códigos de desativação podem ser realizados com um campo de gatilho e expiração.)
  • I18n no banco de dados não pode ser feito.
  • Não reutilizável em tabelas.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.