Pregunta

Quiero hacer una llave compuesta (bueno, esa es la idea, pero estoy abierto a otras sugerencias) en una mesa de documentos. Que consistiría en dos columnas, año (2010, ...) y una identificación, que serían autoincremental pero debe reiniciarse cada año.

Así como estas teclas 2010-1, 2010-2, ..., 2011-1, 2011-2, ... y, preferiblemente aquellas claves debe utilizarse también para la visualización, impresión y búsqueda.

A pesar de que no creo autoincremental funcionará, debido al reajuste cada año, así que supongo que tendré que hacer incrementos de mí mismo, ¿no?

O debería simplemente hacer una columna varchar y construir cada tecla mí mismo y sólo hay que poner un único en esa columna?

Así que, ¿cuáles son mis opciones?

Por favor, también tome en consideración los futuros problemas de diseño que podría tener con un diseño elegido lo sería y por la facilidad de consulta.

ACTUALIZACIÓN:

Me estoy empezando a mirar en dejar que el constructo de aplicación la llave y proporcionarla al insertar. Sin embargo, sería necesario buscar en DB para el último documento de identidad emitido, lo que podría dar lugar a problemas en el uso de alto volumen.

¿Fue útil?

Solución

Es una buena práctica de negocios independiente con estructura de almacenamiento de datos. ¿Por qué? Porque mañana alguien se decida a la lógica de cambio de negocios:

  • uso orden del documento no entero (1-AA, 1-AB, 1-AC ...)
  • incluir año y mes para construir algunos informes mensuales
  • cualquier otro cambio ...

Y ¿qué debe hacer que?

Por lo tanto, mi solución es:

  • utilizar la clave principal (int, por ejemplo, o el tipo de datos preferida) para hacer relaciones con otras tablas en la base de datos
  • Uso de clave de negocio 1.2.3 ... como desee (tal vez un poco generador de identificador)
  • Usar fecha y hora campo para almacenar la fecha de la adición de documento, el año se puede calcular de forma dinámica.

Otros consejos

¿Por qué no añadir un id real de incremento automático? claves compuestas pueden crecer rápidamente a donde son prácticamente inútiles - sobre todo por razones de rendimiento, si alguna vez tiene que unirse en la mesa. Si a continuación, también desea conectarse documento que XYZ fue el primer documento almacenado en el 2010, todavía podría tener su Year y Order (o lo que sea) columnas, pero su clave primaria estancias agradable y limpio.

Si vas a la molestia de crear una clave de incremento automático, que lanzaba la idea de ponerlo a cero en todos los años, y sólo tiene que utilizar una columna de IDENTIDAD INT lugar.

Si desea obtener el número de secuencia del documento dentro del año, hay funciones de SQL que puede utilizar para hacer eso:

ROW_NUMBER () OVER (partición POR ... ORDER BY ...)

  

A pesar de que no creo que el trabajo de incremento automático voluntad, debido al reajuste cada año, así que supongo que tendré que hacer incrementos de mí mismo, ¿no?

Sí.

I recomendar la adición de una columna con el fin de generar el valor de puesta a cero. Una columna de identidad sería lo mejor; un DATETIME podía mantener el tiempo de la creación del registro pero las transacciones dentro de 3,33 milisegundos (0. 00 333 segundos) el uno del otro tendría la misma marca de tiempo.

De cualquier manera, se podría generar el valor id usando:

SELECT (SELECT COUNT(*)
          FROM DOCUMENTS t
         WHERE t.year = d.year
           AND t.col <= d.col) AS id,
        d.year
   FROM DOCUMENTS d

O si estás en SQL Server 2005 +, se puede usar:

 SELECT ROW_NUMBER() OVER (PARTITION BY d.year ORDER BY d.col) AS id,
        d.year
   FROM DOCUMENTS d
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top