Mi posición predeterminada es tratar de usar tipos fuertes para agregar restricciones a los valores, donde los conoce con anticipación.Por lo tanto, en su ejemplo, puede ser preferible utilizar byte dayOfWeek
porque está más cerca de su rango de valores deseado.
Aquí está mi razonamiento; con el ejemplo de almacenar y pasar un año-parte de una fecha. La parte del año: al considerar otras partes del sistema que incluyen SQL Server DateTimes, está limitada a 1753 a 9999 (observe que el rango posible de C# para DateTime es diferente). Por lo tanto, un short
cubre mis valores posibles y si intento pasar algo más grande el compilador me avisará antes de que el código compile. Desafortunadamente, en este ejemplo en particular, la propiedad C# DateTime.Year devolverá un int, lo que me obligará a emitir el resultado si necesito pasar, p. DateTime.Now.Year
en mi función.
Esta posición inicial se basa en consideraciones de almacenamiento a largo plazo de datos, asumiendo 'millones de filas' y espacio en disco, aunque es barato (es mucho menos económico cuando está alojado y ejecuta una SAN o similar).
En otro ejemplo de DB, utilizaré tipos más pequeños como byte (SQL Server tinyint) para ID de búsqueda donde estoy seguro de que no habrá muchos tipos de búsqueda, hasta long (SQLint bigint) para id donde hay es probable que sean más registros. es decir, para cubrir registros transaccionales.
Así que mis reglas de oro:
- Ir por la corrección primero, si es posible. Use DayOfWeek en su ejemplo, por supuesto :)
- Vaya por un tipo de tamaño apropiado, haciendo uso de las comprobaciones de seguridad del compilador que le dan errores lo antes posible;
- ... pero contrarrestan las necesidades extremas de rendimiento y simplicidad, especialmente cuando no se trata de almacenamiento a largo plazo, o cuando consideramos una tabla de búsqueda (conteo bajo de filas) en lugar de una cuenta transaccional (conteo alto de filas).
En aras de la claridad, el almacenamiento de la base de datos no se contrae tan rápido como se espera al reducir los tipos de columnas de bigint a tipos más pequeños. Esto se debe tanto al relleno de los límites de las palabras como a los problemas de tamaño de página internos de la base de datos. Sin embargo, probablemente almacene cada elemento de datos varias veces en su base de datos, quizás almacenando registros históricos a medida que cambian, y también manteniendo los últimos días de copias de seguridad y copias de seguridad de registros. Así que ahorrar un pequeño porcentaje de sus necesidades de almacenamiento tendrá un ahorro a largo plazo en el costo de almacenamiento.
Nunca he tenido problemas personales cuando el rendimiento en memoria de los bytes frente a los ints ha sido un problema, pero he perdido horas y horas teniendo que reasignar el espacio en disco y tener los servidores en vivo completamente puestos porque no había una sola persona disponible para monitorear y administrar tales cosas.
Para ese ejemplo _particular_ no usaría un int _or_ a byte. Una enumeración sería mejor en ese caso (¿qué significa 2? ¿Martes? Lunes?). Sé que estás generalizando, pero algunos casos específicos podrían manejarse mejor con algo que no sea un tipo numérico estricto. –
En lo que se refiere a la eficiencia, no se puede decir sin un perfil. Si no está perfilando, no está optimizando. – kyoryu