2010-05-12 24 views
8

Un colega está agregando una máscara de bits a todas nuestras tablas de base de datos. En teoría, esto es para que podamos rastrear ciertas propiedades de cada fila en todo el sistema. Por ejemplo ...¿Es útil agregar una máscara de bits a todas las tablas en una base de datos?

  • es la fila se suministra con el sistema o añadido por el cliente una vez que han empezado a utilizar el sistema
  • se ha eliminado la fila de la tabla (eliminaciones blandos)
  • ¿Es la fila es un valor predeterminado dentro de un conjunto de filas

¿Es esta una buena idea? ¿Hay otros usos en los que este enfoque sería beneficioso?

Mi preferencia es que estas propiedades son obviamente importantes, y tener una columna dedicada para cada propiedad está justificada para hacer que lo que está pasando sea más claro para otros desarrolladores.

Respuesta

10

No realmente, no.

Solo puede almacenar bits en él, y solo tantos. Por lo tanto, me parece que está pidiendo un montón de dolores de cabeza a nivel de aplicación más adelante en el seguimiento de lo que significa cada uno y el abuso potencial más adelante porque "hey están en todas partes". ¿Cada máscara de bits en cada mesa va a usar la misma definición para cada bit? ¿Será diferente en cada mesa? ¿Qué pasa cuando te quedas sin bits? ¿Agrega otro?

Hay un montón de cosas posibles que podría hacer con él, pero se plantea la pregunta "¿por qué hacerlo de esa manera en lugar de identificar lo que vamos a utilizar esos bits para ahora y simplemente hacen columnas adecuadas? " Realmente no elude la posibilidad de que el esquema cambie de esta manera de todos modos, por lo que parece que está tratando de resolver un problema que realmente no puede "resolver" y especialmente no con máscaras de bits.

Cada una de las cosas que mencionó puede (y debe) resolverse con columnas reales en la base de datos, y esas son mucho más autodocumentadas que "el bit 5 del campo BitMaskOptions".

7

Una columna dedicada es es mejor, porque es indudablemente más obvia y menos propensa a errores. SQL Server already stores BIT columns efficiently, por lo que el rendimiento no es un problema.

El único argumento que pude ver para una máscara de bits es no tener que cambiar el esquema de base de datos cada vez que agrega una nueva marca, pero en realidad, si agrega nuevos indicadores, a menudo algo no está bien.

+1

Para amplificar este punto: los campos de bits ** están ** cambiando el esquema, de una forma totalmente invisible para el DBM, y en su mayoría invisible para sus usuarios. – msw

+0

No tiene sentido agregar una respuesta aquí, dado que Evgeny lo ha resumido muy bien.La única razón por la que se me ocurre una máscara de bits es ahorrar espacio de almacenamiento en comparación con las banderas separadas, pero en el caso de SQL Server 8, las columnas BIT se empaquetan en un solo byte de todos modos. Simplemente estarás complicando cada consulta en estos campos para obtener una ganancia ilusoria. Así que un enfático +1 a Evgeny. – Cowan

4

No, ni remotamente es una buena idea IMO. Cada columna debe representar un solo concepto y valor. Las máscaras de bits tienen todo tipo de problemas de rendimiento y mantenimiento. ¿Cómo entienden los nuevos desarrolladores qué significa cada uno de los bits? ¿Cómo se evita que alguien mezcle accidentalmente el significado del orden de los bits?

Sería mejor tener una relación de varios a varios o columnas separadas en lugar de una máscara de bits. Podrá indexar, habilitar la integridad referencial (según el enfoque), agregar fácilmente nuevos elementos y cambiar el orden de los resultados para ajustarse a diferentes informes, etc.

Cuestiones relacionadas