una tabla de elementos que contendrá (potencialmente) decenas de millones de registros.
En realidad, eso no es mucho, dado lo que SQL Server puede manejar de manera eficiente. Por supuesto, recuerdo uno de mis trabajos anteriores en el que una de las tablas más grandes (un sistema de instancia única) tenía 2 millones de filas y eso era lo máximo con lo que había tratado. Luego, el siguiente trabajo tuvo 17 instancias de producción con algunas tablas con cientos de millones de filas, y todas se agregaron a un Data Warehouse con múltiples tablas de hechos con más de mil millones de filas. No me malinterpreten, no me estoy burlando de decenas de millones de filas, solo estoy enfatizando que con un buen modelo de datos y una indexación adecuada (y mantenimiento del índice), SQL Server puede manejar mucho .
Hasta el 50% de los artículos pueden estar "no aprobados" en un momento dado.
Hmm Eso no suena bien. La tasa de "aprobar" entradas será la mitad de la tasa de obtener nuevas entradas? Por cada 2 nuevas entradas, ¿solo 1 será "aprobado"? En su ejemplo de 2 millones de filas, y 1 millón cada una para "aprobado" y "no aprobado", unos años más tarde con otros 10 millones de entradas, ¿espera 6 millones cada una para "aprobado" y "no aprobado"? ¿O es que el millón de "no aprobado" permanecerá algo constante, de modo que con 10 millones de nuevas entradas, habrá 11 millones de "aprobado" y todavía 1 millón de "no aprobado"?
Los registros pueden ser "aprobados", pero no al revés.
Eso es cierto hoy , pero las cosas cambian con el tiempo y, por lo tanto, siempre existe la posibilidad de que la empresa decida permitir "no aprobar", o tal vez algún otro estado, como "archivado", etc.
Entonces, veamos las opciones:
Bandera (o posiblemente incluso TINYINT
"estado")
- Ligeramente más lento para consultas de cada estado
- Más flexible con el tiempo / fácil de incorporar un cambio como un tercer estado (por ejemplo, "Archivado") con solo un nuevo valor de estado de búsqueda. No hay una nueva tabla (necesariamente), algún código nuevo, solo un código actualizado.
- Menos trabajo (es decir, código, pruebas, etc.) y menos espacio para errores al actualizar una sola
TINYINT
columna
- Menos complicado = menores costos de mantenimiento a lo largo del tiempo, menor tiempo de capacitación para que los nuevos empleados descubran
- (posiblemente) Impacto menor en el Registro de transacciones cuando se actualiza una tabla
- Solo necesito una tabla de búsqueda para "RecordStatus" y FK entre las dos tablas.
Dos tablas separadas (una para "aprobado", una para "no aprobado")
- Ligeramente más rápido para consultas de cada estado
- Menos flexible con el tiempo / más difícil incorporar un cambio como un tercer estado (por ejemplo, "Archivado"); El nuevo estado probablemente requeriría otra tabla, y definitivamente un código nuevo y actualizado.
- Más trabajo (es decir, código, pruebas, etc.) y más espacio para errores al mover registros de la tabla "No aprobada" a la tabla "Aprobada"
- Más complicado = mayores costos de mantenimiento a lo largo del tiempo, mayor tiempo de capacitación para que los nuevos empleados descubran
- (posiblemente) Mayor impacto en el Registro de transacciones cuando se elimina una tabla y se inserta una
- No debe preocuparse por la " renovación de la ID del artículo ": la tabla no
IDENTITY
aprobada tiene una columna de ID que es una columna, y la tabla aprobada tiene una columna de ID que no es una IDENTITY
(ya que no se necesita allí). Por lo tanto, los valores de ID permanecen consistentes a medida que el registro se mueve entre tablas.
Personalmente, me inclinaría hacia la mesa individual con StatusID
columna para empezar. Usar dos tablas parece una optimización demasiado complicada y prematura. Ese tipo de optimización puede discutirse si / cuando el número de registros está en varios cientos de millones y la indexación no proporciona ninguna ganancia de rendimiento.