¿Enumeraciones VS tablas? / Хабр
Problema
¿Por qué utilizar una de estas soluciones?
Hay modelos en los que es necesario identificar variedades y hacerlo mediante tipos, no categorías… Vamos a resolverlo…
Tipo – un tipo de modelo, no siempre, pero que influye en la composición de sus parámetros
Categoría – una de las características del modelo, que indica que pertenece a una variedad, sin afectar la composición de sus parámetros
Solución
Este problema se puede solucionar de 2 formas principales:
Usar enumeraciones (transferencias)
Usar mesas
Uso enumeraciones Más adecuado cuando hay un número pequeño de tipos (hasta 5 para cada enumeración)
Con la ventaja de utilizar mesas Esto incluye la capacidad de implementar tipos de varios niveles sin crear entidades y tipos adicionales.
No es necesario crear mesa para cada tipo que tiene subtipos, qué es recomendable hacer al utilizar enumeraciones.
Situación práctica
Existe una base de datos en la que es necesario resaltar los tipos de “cuentas” para la aplicación de contabilidad doméstica.
Las cuentas son:
Débito
Crédito:
Depósito:
He desarrollado dos opciones de diagramas y estructuras de datos para resolver una situación específica:
Pruebas: enumeraciones versus tablas
Datos de prueba:
18.000 registros = 10.000 cuentas + 1.500 crédito + 3.500 objetos + 3.000 depósitos
Utilicé el DBMS PostgreSQL porque me gusta más que otros.
Las pruebas se realizaron 10 veces para obtener más datos promedio.
Para conectar la aplicación .NET a la base de datos utilizamos: ORM (Marco de entidad) Y ADO.NET (Npgsql).
¡En las imágenes la medida está en milisegundos!
Generación de datos
El primero es (no importante) generar datos usando Falsificador de .NET
Resultó que un esquema con tablas se genera más rápido, aunque desde el punto de vista de los modelos, las acciones de generación no son diferentes.
Agregar datos
La segunda prueba consiste en agregar los 18.000 registros a la base de datos.
Para Marco de entidad simplemente agregando entradas.
Si no fuera por ADO.NET (Npgsql) Podemos añadirlo de varias formas:
Todos los registros se agregan en 1 solicitud
Paquetes de <= 1000 solicitudes
Paquetes de <= 800 solicitudes
Paquetes de <= 500 solicitudes
Obviamente, lo más largo es agregar todos los registros con 1 solicitud… en promedio unos 19-20 segundos.
Interesante:
Comparar sumando mediante Marco de entidad Y envío por lotes (estudio dentro de un estudio)Resultó que la velocidad Marco de entidad agregando +- se comparan con el envío de paquetes por <= 1000 solicitudes.
Por lo tanto, los paquetes más pequeños proporcionarán mejoras en el rendimiento.Pude lograr el máximo aumento enviando paquetes a través de <= 500 solicitudessuperando así Marco de entidad en 0,5-0,7 segundos o en 33-38%!
…Volver a la investigación Enumeraciones VS Tablas:
La única medida en la que el enfoque de tabla pudo “derrotar” las enumeraciones fue agregar todos los registros con 1 consulta… y luego dentro del margen de error – sólo el 1,6%… no mucho…
En todas las demás mediciones, la superioridad del enfoque de enumeraciones es obvia.
En promedio es más rápido por 13%:
Añadiendo vía Marco de entidad – 19%
Agregando 1 solicitud – -1,6%
Agregando lotes de <= 1000 solicitudes - 11%
Agregando lotes de <= 800 solicitudes - 9%
Agregando lotes de <= 500 solicitudes - 14%
Diferencia entre tablas y enumeraciones al agregar datos (enfoque de % de tablas) | |
Añadiendo vía Marco de entidad | 19% |
Agregando 1 solicitud | – 1,6% (en la zona de error) |
Agregar lotes de <= 1000 solicitudes | 11% |
Agregar lotes de <= 800 solicitudes | 9% |
Agregar lotes de <= 500 solicitudes | 14% |
Recuperando un registro
El algoritmo para obtener un registro es el siguiente:
Obtenemos un registro de cuenta por Id.
Determinar qué tipo de cuenta tiene la entrada
Subimos a la tabla correspondiente y de allí sacamos el registro por Id.
La situación aquí es ambigua:
si usas Marco de entidadentonces las enumeraciones son más rápidas que el enfoque de la tabla por 3%.
si usas npgsqlentonces el enfoque de la tabla es más rápido que las enumeraciones por 5%.
Estos valores están dentro del margen de error, por lo que asumiré que no hay diferencia entre los enfoques al recibir 1 registro.
¿Conclusión?
Al agregar registros, el enfoque de enumeración gana en promedio por 13%.
Pero las enumeraciones tienen limitaciones que impiden que se utilicen en todas las situaciones en las que es necesario introducir tipos de modelos:
Son inmutables (sí, puedes agregar un nuevo valor… pero eliminar los innecesarios ya es difícil)
Es mejor almacenar no más de 5 a 7 valores en una enumeración para que no se conviertan en nomenclatura.
Requiere sólidos conocimientos de SQL
Debe elegir el enfoque de enumeración (enfoque de enumeración) si:
No se necesita estructura de subtipo
No hay planes para cambiar la lista de valores.
El número de tipos no supera los 5-7 por enumeración.