Actualmente, tenemos una base de datos y una aplicación existentes que es completamente funcional. No tengo la capacidad de cambiar la arquitectura en este momento. Hoy, cada tabla en la base de datos tiene un campo "IsDeleted" NOT NULL BIT con un valor predeterminado de '0'. Cuando la aplicación "elimina" datos, simplemente actualiza el indicador IsDeleted a 1.
Lo que me cuesta entender es cómo deben estructurarse los índices en cada una de las tablas. En este momento, cada consulta / join / etc siempre implementa la verificación IsDeleted. Es un estándar que nuestros desarrolladores deben seguir. Dicho esto, estoy tratando de determinar si todos mis índices de claves primarias agrupadas en cada una de las tablas deben modificarse para incluir la clave primaria Y el campo BIT IsDeleted. Además, desde CADA consulta / unión / etc. debe implementar la verificación IsDeleted, ¿es una suposición apropiada que CADA índice SOLO (no agrupado también) debe incluir el campo IsDeleted como el primer campo del índice?
Otra pregunta que tengo es sobre los índices filtrados. Entiendo que podría poner filtros en los índices como "WHERE IsDeleted = 0" para reducir el tamaño de los índices. Sin embargo, dado que cada unión / consulta tendrá que implementar la verificación IsDeleted, ¿eso evitaría que se use el índice filtrado (dado que la columna IsDeleted se usa en join / query)?
Recuerde, no tengo la capacidad de cambiar el enfoque IsDeleted.
IsDeleted
columna, independientemente del almacenamiento físico, probablemente tendría sentido exponer los datos a través de dos vistas (opcionalmente en diferentes esquemas), resolviendo el problema de parametrización y cometiendo errores al acceder a datos que no deberían haber sido Accedido menos probable. El acceso a los datos base solo es relevante para los casos excepcionales en los que los datos eliminados y no eliminados deben combinarse de alguna manera, y cuando las filas realmente deben cambiarse a "eliminadas".