.net - utiliza - tipo de dato enum sql server
¿Debería usar enum o consultar una tabla en mi base de datos? (4)
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.
En mi base de datos tengo tablas que definen tipos, por ejemplo
Tabla: Tipos de publicación
ID | Type ---------- 1 | Article 2 | Abstract 3 | Book ....
Que se relaciona a través de la clave ID con una tabla de publicaciones 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 conteo de artículos por un autor de un tipo específico, podría
llamar a la función con dos enteros
countPublications (authorID, 1)
configurar una enumeración para que pueda escribir
countPublications (authorID, pubType.Article)
o
de alguna manera use la tabla de tipo de publicación para filtrar el conjunto de datos de publicación, pero no entiendo cómo hacerlo.
¿Qué otros enfoques debería considerar?
Gracias
Habiendo mantenido este tipo de cosas en una vida anterior, estoy de acuerdo con Steven en que una enum
es bastante razonable. Su código es claro y una enum
significa que debe actualizar solo un archivo si agrega tipos de datos.
También sugiero comentar la enum
, dejando en claro que los valores deben coincidir con los de la tabla Publication Types
en su 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.
Por diversas razones, sería bueno mantener 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 refleje los datos en 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 de la tabla cambian, lo cual es poco probable, puedo hacer un comentario en 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 o comentarios. Ahora puedo continuar con mi mente a gusto.
si los tipos de publicación son esencialmente estáticos, las enumeraciones están bien
Existe una pequeña diferencia entre la inclusión
inner join lookuptable lt on lt.id = (int)myenum.sometype
en una consulta y agregando
inner join lookuptable lt on lt.name = "somehardcodeddescription"
ambas son constantes incrustadas, la primera solo tiene un tipo bien definido detrás de ella
alternativamente podrías usar
inner join lookuptable lt on lt.name = myenum.sometype.ToString
prefiero el anterior
si, por otro lado, se pueden agregar nuevos tipos de búsqueda después de implementar el código, una enumeración quedará obsoleta rápidamente;
pero si hay un conjunto central de valores de enum estáticos que el código necesita y el resto no importa, entonces la solución anterior sigue estando bien
como de costumbre, "depende" ;-)