¿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:

  1. Usar enumeraciones (transferencias)

  2. 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:

\Diagrama de base de datos usando tabla de tipos

\Diagrama de base de datos usando tabla de tipos

Diagrama de base de datos usando enumeraciones (enumeraciones)

Diagrama de base de datos usando enumeraciones (enumeraciones)

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.

Generación de modelo (ms)

Generación de modelo (ms)

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 entidad19%

  • Agregando 1 solicitud – -1,6%

  • Agregando lotes de <= 1000 solicitudes - 11%

  • Agregando lotes de <= 800 solicitudes - 9%

  • Agregando lotes de <= 500 solicitudes - 14%

Agregar registros a la base de datos (ms)

Agregar registros a la base de datos (ms)

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.

Recuperar un registro de la base de datos (ms)

Recuperar un registro de la base de datos (ms)


¿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.

Repositorio con proyecto de prueba

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *