2010-03-06 8 views
5

Estoy creando una nueva tabla en SQL Server 2005 que necesita 2 campos: DateTime y MyValue (Int32). El campo DateTime será único, por lo que estableceré una restricción única en él.Clave principal de SQL Server en el campo de fecha y hora

¿Qué estructura de la mesa es mejor y por qué?

MyIndex (PK, int)
MiFecha (fecha y hora) (IX_UniqueKey)
MyValue (int)

o

MiFecha (PK, fecha y hora)
MyValue (int)

Mi sensación es que no quiero un PK artificial (MyIndex) en esta tabla porque es innecesario y porque las fechas serán únicas. Las usaré para acceder a cualquier registro. Sin embargo, puede ser que sea más eficiente tener un PK artificial ...

+0

Personalmente, no utilizaría MyDate, MyIndex, MyValue, etc. ¿Qué significa el prefijo "Mi"?¿Por qué no EventDate o EventDateTime, y [Value] o EventValue? Además, si los valores de fecha serán únicos, supondré que la resolución es la hora o el día. Si es así, entonces es mejor utilizar SMALLDATETIME que DATETIME. –

+2

@ Aaron Bertrand, creo que esto fue solo un ejemplo, y el DATETIME puede ser el segundo/milisegundo. –

+0

Correcto: este es un resumen de lo que será la tabla real. – Guy

Respuesta

9

Cuando diga que las fechas serán únicas, ¿quiere decir que piensa que serán únicas, o su exclusividad está garantizada por la declaración del problema? En mi experiencia, algunas cosas resultan ser mucho menos únicas de lo que uno imagina (los números de la seguridad social de EE. UU. Son un ejemplo).

Si los valores de fecha no se garantizan como exclusivos, debe agregar la clave entera.

Si los valores de fecha son únicos, ¿cambian? Si cambian, ¿están referenciados por otras tablas? Si ambas respuestas son "sí", probablemente debas agregar la clave entera.

Si los valores de fecha son únicos y no cambian o no se mencionan, puede usarlos para la clave. Los DATETIMEs regulares tienen 8 bytes y los valores INTEGER estándar son 4 bytes, lo que podría tener un efecto menor en la indexación. Si los valores de fecha son solo fechas, o solo exactas al minuto o menos, y en el rango más restringido permitido por el tipo, puede usar SMALLDATETIME y obtener esos valores de índice hasta 4 bytes.

+0

El campo de fecha es único en la medida en que almacena información por día. Por ejemplo, visitantes diarios a un parque nacional. Por lo tanto, solo habrá un registro por cada día en la historia que mida el número de visitantes en ese día. A su punto smalldatetime suena como un mejor tipo de datos para ese campo porque el tiempo es irrelevante. – Guy

1

No, su intuición es correcta. Mientras nadie pueda deslizar dos (o supongo que más) eventos simultáneos en usted dada la resolución disponible de su proceso de recopilación de datos, usted es Hunky Dory.

1

Si tiene la garantía de que las fechas siempre serán únicas (piense en la resolución del componente de tiempo), entonces la creación de la clave primaria en la columna de fecha y hora es una buena opción.

Si solo va a insertar cada vez más fechas y horas, la creación del índice agrupado en la columna de clave principal también es una buena opción.

2

Si el valor DATETIME será poblada por la base de datos IE:

INSERT INTO your_table 
    (mydate, myvalue) 
VALUES 
    (GETDATE(), 1234) 

... entonces sí, por lo que la columna de la mydate la clave principal es la solución ideal. Si la fecha es proporcionado por la aplicación IE:

INSERT INTO your_table 
    (mydate, myvalue) 
VALUES 
    (@my_date_value, 1234) 

... @my_date_value suponiendo que no está siendo suministrado por la base de datos - no, no es lo ideal. No se puede garantizar que una fecha distinta de la base de datos sea precisa en función de la inserción.

Cuestiones relacionadas