2008-10-31 17 views
12

En mi base de datos que tienen tablas que definen tipos, por ejemplo¿Debo usar enum o consultar una tabla en mi base de datos?

Tabla: Tipos de publicación

 

ID | Type 
---------- 
1 | Article 
2 | Abstract 
3 | Book 
.... 

que se relaciona a través de la clave de identificación para una publicación mesas que tiene el campo TypeId.

Luego creo una tabla de datos de PublicationTable mi aplicación .NET que deseo filtrar en función del tipo de publicación. Por ejemplo, la siguiente función me da la cantidad de publicaciones para un autor específico y tipo de publicación.

 

    Public Function countPublications(ByVal authorID As Integer, _ 
             ByVal publicationType As Integer) As Integer 

     Dim authPubs As New PublicationsDataSet.tblPublicationsDataTable 
     authPubs = Me.getAuthorsPublications(authorID) 

     Dim dv As New DataView(authPubs) 
     dv.RowFilter = "status='published' AND type='" + _ 
         publicationType.ToString + "'" 

     Return dv.Count 

    End Function 

para llamar a esta función para obtener un recuento de artículos escritos por un autor de un tipo específico, que pude

  1. llamada a la función con dos enteros

    countPublications (authorID, 1)

  2. configuración de una enumeración de modo que yo pueda escribir

    countPublications (authorID, pubType.Article)

    o

  3. utilizan de alguna manera la tabla de tipos de publicación para filtrar los datos de publicación establecidos, pero no he conseguido mi cabeza alrededor de cómo hacer esto.

¿Qué otros enfoques debo considerar?

Gracias

Respuesta

5

si los tipos de publicación son esencialmente estático, enumeraciones son bien

no se puede descartar poca diferencia entre la incrustación

inner join lookuptable lt on lt.id = (int)myenum.sometype 

en una consulta y la adición de

inner join lookuptable lt on lt.name = "somehardcodeddescription" 

que ambas son constantes incrustadas, la primera solo tiene una buena Tipo efined detrás de él

alternativamente se podría utilizar

inner join lookuptable lt on lt.name = myenum.sometype.ToString 

Prefiero la primera

si, por el contrario, los nuevos tipos de búsqueda pueden añadirse después de que el código se implementa, a continuación, una enumeración se convertirse rápidamente en obsoleto;

pero si hay conjunto básico de valores de enumeración estáticas que las necesidades de código y el resto no importan a continuación, la primera solución es aún válido

como de costumbre, "depende" ;-)

+0

Justo como sospechaba.el problema se reduce a la mantenibilidad si los datos en mi tabla de tipos deben ser modificados (pero está en lo cierto en su mayor parte, la tabla de tipos es estática). – Azim

+0

gracias por su respuesta – Azim

+0

de nada, ¡espero que haya sido de ayuda! –

5

Habiendo mantenido este tipo de cosas en una vida anterior, estoy de acuerdo con Steven en que un enum es bastante razonable. Su código es claro y un enum significa que necesita actualizar solo un archivo si agrega tipos de datos.

También sugiero que comentes el enum, dejando en claro que los valores deben coincidir con los de la tabla Publication Types de tu base de datos.

¡Buena pregunta, por cierto! +1 para explicar la pregunta con tanta claridad y tomarse el tiempo para pensar en soluciones antes de publicarlas.

2

Creo que depende de la frecuencia con la que su lista de tipos de publicación cambiará en el futuro y de la facilidad con la que puede enviar una actualización de su aplicación. Si la lista no cambia a menudo, o si la actualización de su aplicación en el campo es fácil, entonces una enumeración tiene sentido. Si es probable que la lista cambie con frecuencia, o si la actualización de su aplicación es particularmente difícil, mantener la lista en una tabla en la base de datos es sensato.

0

Por diversas razones, sería bueno tener listas como mi lista de tipos de publicación y otras en un solo lugar; la base de datos. Entonces solo hay un lugar para que ellos cambien. Sin embargo, me parece que esto agrega algo de complejidad al código y aún necesitaría tener algunos elementos codificados en el código si quisiera referirme a un tipo de publicación específica como Artículos de revista. Por lo tanto, tener un tipo enumerado que refleja los datos de la tabla me da la posibilidad de llamar a mi función de recuento de una manera legible

countPublications(authorID, publicationType.JournalArticle) 

Si los datos en los cambios de la tabla que es poco probable, puedo tener un comentario de la base de datos para recordarle al responsable (probablemente a mí) que actualice el tipo enumerado en el código y viceversa.

Gracias a todos por sus respuestas. Ahora puedo continuar con mi mente a gusto.

Cuestiones relacionadas