Diseño de base de datos relacional: claves sustitutivas frente a claves naturales en el contexto de la velocidad de consultas, ORM y desarrollo de aplicaciones

dapper database-design orm relational-database sql

Pregunta

Supongamos que tengo un conjunto de entidades 'modelo' y un conjunto de niveles de dificultad. Cada modelo tiene una cierta tasa de éxito porcentual para un día determinado en un nivel de dificultad determinado.

Una entidad modelo tiene un nombre, que es único e inmutable bajo cualquier circunstancia, por lo que constituye una clave primaria natural. Un nivel de dificultad se describe solo por su nombre (fácil, normal, etc.). Es muy poco probable que cambien los niveles de dificultad, aunque es posible que se agregue uno nuevo. Un registro de índice de éxito se identifica de forma única por el modelo al que pertenece, el nivel de dificultad y la fecha.

Aquí está el diseño db más trivial para este escenario: diseño db con llaves naturales

En este diseño, 'nombre' es la clave principal para los 'modelos' de la tabla y está representado por un campo VARCHAR (20). Del mismo modo, un campo VARCHAR (20) 'nombre' es la clave primaria para la tabla 'difficulty_levels' (una tabla de búsqueda). En la tabla 'success_rates', 'model_name' es una clave externa que hace referencia al campo 'nombre' en la tabla 'modelo', y 'difficulty_level' es una clave externa que hace referencia al campo 'nombre' en la tabla 'difficulty_levels'. Los campos 'model_name', 'difficulty_level' y 'date' conforman una clave primaria compuesta para la tabla 'success_rates'.

Las consultas más utilizadas serían:

  • obteniendo todas las tasas de éxito para cierto modelo, nivel de dificultad y período de tiempo

  • obtener los modelos más / menos exitosos para un cierto período y nivel de dificultad.

Ahora, mi pregunta es: ¿necesito agregar claves primarias sustitutas a las tablas "modelos" y "niveles_de_mensaje"? Supongo que almacenar valores int en lugar de valores varchar en los campos de clave externa de 'success_rates' ocupa menos espacio, y tal vez las consultas serán más rápidas (solo mi loca conjetura, no estoy seguro de eso)?

El problema que veo con las claves sustitutas es que no tienen relevancia para la lógica de negocios en sí. Estoy planeando usar un mini-ORM (probablemente Dapper), y sin las claves sustitutas puedo operar en clases que representan muy claramente las entidades con las que estoy trabajando. Ahora, si agrego claves sustitutas, tendré que agregar propiedades 'Id' a mis clases, y realmente estoy en contra de agregar una implementación de almacenamiento de base de datos así a una clase que pueda usarse en cualquier lugar de la aplicación, ni siquiera en conexión con un almacenamiento de base de datos. Podría agregar clases de almacenamiento proxy con una propiedad Id, pero eso agrega otro nivel de complejidad. Además, el hecho de que la propiedad 'Id' no sea de solo lectura (por lo que el ORM puede establecer los ID después de guardar la entidad en la base de datos) significa que sería posible establecer accidentalmente un valor aleatorio / inválido.

No estoy muy familiarizado con los ORM y no tengo conocimiento de Dapper, así que corrígeme si me equivoqué en alguno de estos puntos.

¿Cuál sería el mejor enfoque aquí?

Respuesta popular

El problema que veo con las claves sustitutas es que no tienen relevancia para la lógica de negocios en sí.

Ese es realmente el beneficio, no el problema. El valor de la clave es el identificador inmutable de la entidad, independientemente de lo que cambie. Realmente dudo que haya un ORM ampliamente utilizado que no pueda usarlo fácilmente, ya que la alternativa (los cambios en cascada a un valor clave para cada registro de niños) es mucho más difícil de implementar.

También sugiero que agregue un valor a sus niveles de dificultad que permita que la jerarquía de dificultades crecientes se represente en el modelo de datos, de lo contrario, "más difícil que" o "más fácil que" no se puede representar de manera robusta.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué