2009-10-23 23 views
16

Tengo un número de enumeraciones en mi aplicación que se utilizan como tipo de propiedad en algunas clases.La mejor manera de almacenar valores enum en la base de datos - String o Int

¿Cuál es la mejor manera de almacenar estos valores en la base de datos, como String o Int?

FYI, también voy a mapear estos tipos de atributos usando Nhibernate con fluidez.

Código de ejemplo:

public enum ReportOutputFormat 
{ 
    DOCX, 
    PDF, 
    HTML 
} 

public enum ReportOutputMethod 
{ 
    Save, 
    Email, 
    SaveAndEmail 
} 

public class ReportRequest 
{ 
    public Int32 TemplateId 
    { 
     get { return templateId; } 
     set { templateId = value; } 
    } 
    public ReportOutputFormat OutputFormat 
    { 
     get { return outputFormat; } 
     set { outputFormat = value; } 
    } 

    public ReportOutputMethod OutputMethod 
    { 
     get { return outputMethod; } 
     set { outputMethod = value; } 
    } 
} 

Respuesta

13

Ambos tienen ventajas. Si los almacena por su valor entero, debe tener cuidado de editar su enumeración más adelante en su proyecto. Si de algún modo los valores enteros de los elementos de enumeración se redefinen, todos sus datos se dañarán. Pero será el tipo de datos más rápido/más pequeño de usar.

Si utiliza la representación de cadena no tendrá el problema de valor redefinido mientras no cambie el nombre de los elementos en la enumeración. Sin embargo, las cadenas ocupan más espacio en su base de datos y probablemente sean un poco más costosas de usar.

Al final, no hay un ganador definitivo, supongo.

Editar

Usando el valor entero podría ser la mejor manera. Puede superar el problema de "valor redefinido" para los elementos de enumeración, estableciendo el valor para cada elemento usted mismo. De hecho, una buena sugerencia de Kevin.

+2

¡No puedo creer que siquiera consideras la mitad de recomendar un enfoque que podría resultar fácilmente en corrupción de datos! ¿Solo por una preocupación imaginada por compacidad? Si la preocupación por la compacidad es tan fuerte, agrega un campo int a la enumeración. NUNCA confíes en el ordinal. Lee Effective Java. –

+13

Realmente no veo dónde recomiendo nada para ser sincero. Solo estoy afirmando ventajas y desventajas. Aunque tiene un punto, no queriendo confiar en el valor ordinal, es posible que desee convertir ese 'fuego' en su comentario en un nivel inferior;) – pyrocumulus

+0

@KevinBourrillion ¿Qué significa "agregar un campo int a la enumeración"? – John

16

La aplicación es fácil en ambos casos, y las diferencias de rendimiento debe ser menor de edad.

Por lo tanto, vaya por el significado: las cadenas son más significativas que los números, entonces use la secuencia.

+5

+1 He trabajado con millones de registros. Solo entonces me di cuenta de que el significado era mucho más importante que la "compacidad". – Sarmaad

+0

A veces el rendimiento es más importante, para que no se pierda el significado. Así que elige tu veneno y determina cuál tiene más valor. – Suncat2000

Cuestiones relacionadas