2010-09-16 15 views
10

Estoy trabajando con un cliente que quiere agregar marcas de tiempo a un grupo de tablas para que puedan ordenar los registros en esas tablas cronológicamente. Todas las tablas también tienen un campo entero de incremento automático como su clave principal (id).Prácticas recomendadas de SQL: ¿puede confiar en el campo de incremento automático para ordenar filas cronológicamente?

La idea (simple): guarde la tara/almacenamiento y confíe en la clave principal para ordenar los campos cronológicamente. Claro, esto funciona, pero no estoy seguro de si este enfoque es aceptable en el diseño de bases de datos de sonido.

Pros: menos espacio de almacenamiento requerido por registro, las clases más simples VO, etc., etc.

Con: implica una característica de ese campo, una por lo demás sencilla identificador, cuya definición no implica en modo definir o garantía de que debería/funcionará como tal.

Supongamos, por el bien de mi pregunta, que las definiciones de la tabla DB están escritas en piedra. Aún así, ¿esto es aceptable en términos de mejores prácticas?

Gracias

+0

¿Cómo cree que es una alternativa, por ejemplo? El número de "secuencia" sería más "sólido" en su diseño? Creo que confiar en un autonumber es una opción bastante buena, al menos tan sólida y sólida como cualquier otro proceso "manual" que pueda implementar usted mismo. –

+0

Como nota "implica una característica". A menos que se defina, no importa qué comportamiento "siempre vea" se debe considerar accidental y sujeto a variaciones, generalmente en el peor momento posible. Lo expresé ampliamente porque el principio se aplica ampliamente y a su problema, así como a cualquier otro. – msw

+0

El auto_increment es solo un marcador referencial para el registro; el datetime admite registros retroactivos, porque el id no sería secuencial. –

Respuesta

7

Ha solicitado "mejores prácticas", en lugar de "prácticas no terribles", así que: no, no debe confiar en una clave primaria autoincrementada para establecer la cronología. Un día vas a introducir un cambio en el diseño de db y eso se romperá. Lo he visto suceder

Una columna de fecha y hora, cuyo valor por defecto es GETDATE() tiene muy poca sobrecarga (casi tanto como un entero) y (mejor aún) le indica no sólo la secuencia pero la fecha y la hora reales, que a menudo resulta ser no tiene precio. Incluso mantener un índice en la columna es relativamente barato.

En estos días, I siempre poner un CreateDate objetos de datos de columna conectados a eventos del mundo real (como la creación de cuentas).

Editado para añadir:

Si cronología exacta es crucial para su aplicación, no se puede confiar en cualquiera de incremento automático o marcas de tiempo (ya que siempre puede haber marcas de tiempo iguales, no importa cuán alta sea la resolución) Probablemente tendrá que hacer algo específico de la aplicación en su lugar.

+1

. Pero si usa SQL Server 200x 'DATETIME' data tipo, puede terminar con varias filas que tienen el mismo valor de fecha y hora idéntico (ya que su "resolución" es 3.33ms) y ya no puede distinguir el orden cronológico de eso, ya sea ..... –

+0

@marc_s: true; en realidad puede * siempre * tener marcas de tiempo simultáneas (a menos que su temporizador marque más rápido que su base de datos). Si la secuencia es tan crucial, debes construirla en un nivel más profundo. – egrunin

+0

@marc_s Use datetime2 en su columna. –

2

Puede acheive el mismo objetivo en el corto plazo por la clasificación en la columna ID. Esto sería mejor que agregar datos adicionales para lograr el mismo resultado. No creo que sea confuso para nadie mirar la tabla de datos y saber que es cronológica cuando ven que es una columna de identidad.

Sin embargo, hay algunos inconvenientes o limitaciones que veo.

  • El tipo cronológico puede ser desordenado si alguien re-semillas de la columna
  • Cronología de un período la fecha no se pueda determinar sin los datos adicionales
  • Esta configuración no le permite ordenar cronológicamente si el sistema nunca acepta datos nuevos, no cronológicos

Según la evaluación realista de estas "limitaciones", debe poder aconsejar un enfoque adecuado.

+0

Confíe en mí algún tipo de guía aparecerá y dirá que quiere cambiar la columna de Identidad a algo significativo o reiniciar los valores desde un punto de partida diferente por alguna razón tonta. Use DateTime – Roadie57

+0

@ Roadie57, pensé que la naturaleza diabólica de "el usuario" era evidente :) Estoy de acuerdo con usted, sin embargo, el OP dijo que asumía que la estructura de la base de datos era "inamovible".Sin mencionar que está trabajando para un * cliente *, no un empleador que esté dispuesto a pagar por actualizaciones "frívolas". – Brad

+0

Estaba dejando que la experiencia de la vida real se interpusiera en mi pensamiento. De hecho, alguien ha venido y dice que todos los valores de incrementos automáticos deben resembrarse para comenzar en 1008000, de modo que se pueda ejecutar un informe tonto sin filtrar nada más que columnas de id. – Roadie57

1

ID de incremento automático le dará una idea del orden que Brad señala, pero hágalo bien, si desea saber CUÁNDO se agregó algo, tenga una columna de fecha y hora. Entonces no solo puedes ordenar cronológicamente sino también aplicar filtros.

2

Además de la respuesta de egrunin, un cambio en la lógica de persistencia o procesamiento de estas filas puede hacer que las filas se inserten en la base de datos de una manera no secuencial o no determinista. Puede implementar un procesador de archivos paralelizado que arroje una fila en el DB tan pronto como el hilo termine de transformarlo, lo que puede suceder antes de que otro subproceso haya terminado de procesar una fila que ocurrió anteriormente en el archivo. El uso de un ORM para la persistencia del registro puede dar como resultado un comportamiento similar; el ORM puede simplemente mantener una "bolsa" (colección no ordenada) de gráficos de objetos en espera de persistencia, y tomarlos al azar para persistirlos al DB cuando se le dice que "descargue" el búfer de objetos.

En cualquier caso, confiando en la columna de autoincrement para decirle el orden en que los registros entraron en el sistema es malo juju. Puede o no poder decirle el orden en que registra su BASE DE DATOS; eso depende de la implementación de DB.

0

No lo hagas. Nunca debe confiar en el valor real de su columna de ID. Trátelo como una caja negra, solo útil para realizar búsquedas de claves.

Dice "se requiere menos almacenamiento por registro", pero ¿qué tan importante es eso? ¿Qué tan grandes son las filas de las que estamos hablando? Si tienes filas de 200 bytes, otros 4 bytes probablemente no importen mucho.

No optimice sin medir. Haz que funcione bien primero, y ENTONCES optimiza.

0

@MadBreaker

Hay que separar las cosas, si usted necesita saber el fin de crear un orden de columnas con incremento automático, sin embargo si quieres saber la fecha y hora en que se insertó utiliza datetime2.

El orden cronológico se puede garantizar si no se permiten actualizaciones o eliminaciones, pero si desea un control de tiempo sobre la selección, debe usar datetime2.

0

No mencionó si está ejecutando en un solo db o en clúster. Si está en clúster, tenga cuidado con las implementaciones de incremento, ya que no siempre se garantiza que las cosas saldrán en el orden que usted naturalmente pensaría. Por ejemplo, las secuencias de Oracle pueden almacenar grupos de próximos valores en caché (según su configuración) y le proporcionan un tipo de lista de 1,3,2,4,5 ...

Cuestiones relacionadas