usa fecha como parte de la clave primaria

07/10/2004 - 09:38 por Mara | Informe spam
hola a todos:

queria crear una aplicacion en la que registrar eventos para una lista de
clientes

tengo los clientes con toda su informacion y un numero de identificacion
unica en una tabla

en una segunda tabla tendre el id_cliente mas los detalle de cada una de sus
eventos, por ello debo utilizar una clave primaria doble para identificar el
id_cliente-evento

nunca se produciran dos eventos el mismo dia

por ello mi pregunta, resutara optimo usar id_cliente-fecha como clave
primaria o mejor usar id_cliente-id_evento y fecha como un atributo mas ??
(id_evento tal que 1 para el primero 2 para el segundo...)

gracias por adelantado

Preguntas similare

Leer las respuestas

#6 Carlos Sacristan
07/10/2004 - 15:19 | Informe spam
No tienes que pedir permiso, Javier.

Estoy de acuerdo con los comentarios que hacéis tanto tú como Adrián en
lo que respecta a las conversiones que habría que hacer... pero creo que
serían en el cliente. Cuando le propongo a Mara lo de usar un alfanumérico
de ocho posiciones (o un entero, efectivamente) es porque muchas veces hay
errores de conversión en el manejo de fechas y de esa manera desaparecen
muchos dolores de cabeza (no porque el motor las maneje mal), pero es
evidente que si la aplicación cliente necesita de consultas del tipo como
las que propone Adrián en el punto 3, habría que pensar en usar directamente
un campo tipo fecha.

También hacía hincapié en el hecho de que si sólo necesita la fecha (y
no la hora), si el campo es DATETIME o SMALLDATETIME a la hora de buscar un
registro habría que tener en cuenta también las horas (u obviarlas usando
alguna función de fecha de las disponibles), lo cual complica (de acuerdo,
no mucho, pero lo hace) el tratamiento.

Está claro que todo depende de las necesidades de la aplicación...

Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Javier Loria" escribió en el mensaje
news:#
Hola:
Si Carlos me permite, las fechas son excelentes como parte de la


llaves
primarias y buenas candidatas para formar parte del indice clustered (por
comportamiento predeterminado las primarias son indice clustered). Es
importante porque muchas consultas se hacen por fecha, por lo que es bueno
ponerlas de primero en la llave.
Una columna SMALLDATETIME solo ocupa 4 bytes que es tan pequena como


un
entero. Si la aplicacion tuviera millones de filas y quisieras mejorar el
desemepeno podrias crear una tabla con fechas con smalldatetime y con un
numero smallint, luego usas el numero en la tabla y usas un join, esto se
hace en las tabla de hechos de las bodegas de datos, pero normalmente en


un
transaccional no se usa.


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"Mara" wrote in message
news:
> mi principal preocupacion es si no sera muy complejo con el DATETIME, me
> refiero a lento, etc...
>
> pero la idea de yyyymmdd me gusta, y supongo que el mismo rendimiento


que
1,
> 2, 3, 4...
>
>
> gracias por la explicacion
>
>
>
> "Carlos Sacristan" <csacristan ARROBA mvps.org> wrote in message
> news:u%232j8%
> > Si tienes una clave natural disponible (como pueda ser en este


caso
> > idCliente + fechaEvento), úsala. Ahora bien, si no quieres usar un


tipo
de
> > dato DATETIME (por no complicarte o porque no te interesa la hora)
puedes
> > usar un CHAR de 8 posiciones para almacenar la fecha del evento en
formato
> > ANSI (yyyymmdd).
> >
> >
> > Un saludo
> >
> > -
> > "Sólo sé que no sé nada. " (Sócrates)
> >
> > Por favor, responder únicamente al foro
> > Se agradece la inclusión de sentencias DDL
> >
> >
> > "Mara" escribió en el mensaje
> > news:
> > > hola a todos:
> > >
> > > queria crear una aplicacion en la que registrar eventos para una


lista
> de
> > > clientes
> > >
> > > tengo los clientes con toda su informacion y un numero de
identificacion
> > > unica en una tabla
> > >
> > > en una segunda tabla tendre el id_cliente mas los detalle de cada


una
de
> > sus
> > > eventos, por ello debo utilizar una clave primaria doble para
> identificar
> > el
> > > id_cliente-evento
> > >
> > > nunca se produciran dos eventos el mismo dia
> > >
> > > por ello mi pregunta, resutara optimo usar id_cliente-fecha como


clave
> > > primaria o mejor usar id_cliente-id_evento y fecha como un atributo
mas
> ??
> > > (id_evento tal que 1 para el primero 2 para el segundo...)
> > >
> > > gracias por adelantado
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#7 Mara
07/10/2004 - 15:23 | Informe spam
gracias a ambos,
"Javier Loria" wrote in message
news:%
Hola:
Si Carlos me permite, las fechas son excelentes como parte de la


llaves
primarias y buenas candidatas para formar parte del indice clustered (por
comportamiento predeterminado las primarias son indice clustered). Es
importante porque muchas consultas se hacen por fecha, por lo que es bueno
ponerlas de primero en la llave.
Una columna SMALLDATETIME solo ocupa 4 bytes que es tan pequena como


un
entero. Si la aplicacion tuviera millones de filas y quisieras mejorar el
desemepeno podrias crear una tabla con fechas con smalldatetime y con un
numero smallint, luego usas el numero en la tabla y usas un join, esto se
hace en las tabla de hechos de las bodegas de datos, pero normalmente en


un
transaccional no se usa.


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"Mara" wrote in message
news:
> mi principal preocupacion es si no sera muy complejo con el DATETIME, me
> refiero a lento, etc...
>
> pero la idea de yyyymmdd me gusta, y supongo que el mismo rendimiento


que
1,
> 2, 3, 4...
>
>
> gracias por la explicacion
>
>
>
> "Carlos Sacristan" <csacristan ARROBA mvps.org> wrote in message
> news:u%232j8%
> > Si tienes una clave natural disponible (como pueda ser en este


caso
> > idCliente + fechaEvento), úsala. Ahora bien, si no quieres usar un


tipo
de
> > dato DATETIME (por no complicarte o porque no te interesa la hora)
puedes
> > usar un CHAR de 8 posiciones para almacenar la fecha del evento en
formato
> > ANSI (yyyymmdd).
> >
> >
> > Un saludo
> >
> > -
> > "Sólo sé que no sé nada. " (Sócrates)
> >
> > Por favor, responder únicamente al foro
> > Se agradece la inclusión de sentencias DDL
> >
> >
> > "Mara" escribió en el mensaje
> > news:
> > > hola a todos:
> > >
> > > queria crear una aplicacion en la que registrar eventos para una


lista
> de
> > > clientes
> > >
> > > tengo los clientes con toda su informacion y un numero de
identificacion
> > > unica en una tabla
> > >
> > > en una segunda tabla tendre el id_cliente mas los detalle de cada


una
de
> > sus
> > > eventos, por ello debo utilizar una clave primaria doble para
> identificar
> > el
> > > id_cliente-evento
> > >
> > > nunca se produciran dos eventos el mismo dia
> > >
> > > por ello mi pregunta, resutara optimo usar id_cliente-fecha como


clave
> > > primaria o mejor usar id_cliente-id_evento y fecha como un atributo
mas
> ??
> > > (id_evento tal que 1 para el primero 2 para el segundo...)
> > >
> > > gracias por adelantado
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#8 Mara
07/10/2004 - 15:23 | Informe spam
gracias a ambos,
"Adrian D. Garcia" wrote in message
news:
Es todo contrario,
1) si utilizas un CHAR(8) luego tendras que realizar todas las


conversiones
para cuando tengas que realizar busquedas, insert, updates, etc.
2) Una columna del tipo DATETIME ocupa 8 bytes, lo mismo que un CHAR(8),
ahora, si utilizas una columna SMALLDATETIME entonces solo ocuparas 4


bytes,
con lo cual tu indice sera mucho mas eficiente.
3) Si utilizas una colunna del tipo DATETIME o SMALLDATETIME entonces
tendras todas las funciones de fechas y horas disponibles. Podras realizar
muy facilmente queries del tipo... Cual es el promedio dias entre los
eventos de un cliente? y otras parecidas.
4) Analiza el orden de la clave primaria: Que es mas importante, la fecha


o
el id del cliente? Quizas tus queries mas usados sean "Traer los eventos
para una fecha determinada o entre tal y cual fecha, en ese caso te
recomiendo que armes tu clave primaria : fecha + cliente , de esta forma


el
motor podra utilizar el indice cluster para busqueda de rangos de fechas


en
forma terriblemente eficiente ; ahora si tus queries ma usados estan
relacionados con un cliente entonces: cliente + fecha.

Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"Mara" wrote in message
news:
> mi principal preocupacion es si no sera muy complejo con el DATETIME, me
> refiero a lento, etc...
>
> pero la idea de yyyymmdd me gusta, y supongo que el mismo rendimiento


que
1,
> 2, 3, 4...
>
>
> gracias por la explicacion
>
>
>
> "Carlos Sacristan" <csacristan ARROBA mvps.org> wrote in message
> news:u%232j8%
> > Si tienes una clave natural disponible (como pueda ser en este


caso
> > idCliente + fechaEvento), úsala. Ahora bien, si no quieres usar un


tipo
de
> > dato DATETIME (por no complicarte o porque no te interesa la hora)
puedes
> > usar un CHAR de 8 posiciones para almacenar la fecha del evento en
formato
> > ANSI (yyyymmdd).
> >
> >
> > Un saludo
> >
> > -
> > "Sólo sé que no sé nada. " (Sócrates)
> >
> > Por favor, responder únicamente al foro
> > Se agradece la inclusión de sentencias DDL
> >
> >
> > "Mara" escribió en el mensaje
> > news:
> > > hola a todos:
> > >
> > > queria crear una aplicacion en la que registrar eventos para una


lista
> de
> > > clientes
> > >
> > > tengo los clientes con toda su informacion y un numero de
identificacion
> > > unica en una tabla
> > >
> > > en una segunda tabla tendre el id_cliente mas los detalle de cada


una
de
> > sus
> > > eventos, por ello debo utilizar una clave primaria doble para
> identificar
> > el
> > > id_cliente-evento
> > >
> > > nunca se produciran dos eventos el mismo dia
> > >
> > > por ello mi pregunta, resutara optimo usar id_cliente-fecha como


clave
> > > primaria o mejor usar id_cliente-id_evento y fecha como un atributo
mas
> ??
> > > (id_evento tal que 1 para el primero 2 para el segundo...)
> > >
> > > gracias por adelantado
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#9 Berta Gomez
07/10/2004 - 23:56 | Informe spam
La verdad que quien no aprende en este foro es porque no quiere..

Es sorprendente la ayuda que nos dan.

Berta

"Mara" wrote in message
news:
gracias a ambos,
"Adrian D. Garcia" wrote in message
news:
> Es todo contrario,
> 1) si utilizas un CHAR(8) luego tendras que realizar todas las
conversiones
> para cuando tengas que realizar busquedas, insert, updates, etc.
> 2) Una columna del tipo DATETIME ocupa 8 bytes, lo mismo que un CHAR(8),
> ahora, si utilizas una columna SMALLDATETIME entonces solo ocuparas 4
bytes,
> con lo cual tu indice sera mucho mas eficiente.
> 3) Si utilizas una colunna del tipo DATETIME o SMALLDATETIME entonces
> tendras todas las funciones de fechas y horas disponibles. Podras


realizar
> muy facilmente queries del tipo... Cual es el promedio dias entre los
> eventos de un cliente? y otras parecidas.
> 4) Analiza el orden de la clave primaria: Que es mas importante, la


fecha
o
> el id del cliente? Quizas tus queries mas usados sean "Traer los eventos
> para una fecha determinada o entre tal y cual fecha, en ese caso te
> recomiendo que armes tu clave primaria : fecha + cliente , de esta forma
el
> motor podra utilizar el indice cluster para busqueda de rangos de fechas
en
> forma terriblemente eficiente ; ahora si tus queries ma usados estan
> relacionados con un cliente entonces: cliente + fecha.
>
> Saludos
> Adrian D. Garcia
> MCSD
> NDSoft Consultoria y Desarrollo
>
> "Mara" wrote in message
> news:
> > mi principal preocupacion es si no sera muy complejo con el DATETIME,


me
> > refiero a lento, etc...
> >
> > pero la idea de yyyymmdd me gusta, y supongo que el mismo rendimiento
que
> 1,
> > 2, 3, 4...
> >
> >
> > gracias por la explicacion
> >
> >
> >
> > "Carlos Sacristan" <csacristan ARROBA mvps.org> wrote in message
> > news:u%232j8%
> > > Si tienes una clave natural disponible (como pueda ser en este
caso
> > > idCliente + fechaEvento), úsala. Ahora bien, si no quieres usar un
tipo
> de
> > > dato DATETIME (por no complicarte o porque no te interesa la hora)
> puedes
> > > usar un CHAR de 8 posiciones para almacenar la fecha del evento en
> formato
> > > ANSI (yyyymmdd).
> > >
> > >
> > > Un saludo
> > >
> > > -
> > > "Sólo sé que no sé nada. " (Sócrates)
> > >
> > > Por favor, responder únicamente al foro
> > > Se agradece la inclusión de sentencias DDL
> > >
> > >
> > > "Mara" escribió en el mensaje
> > > news:
> > > > hola a todos:
> > > >
> > > > queria crear una aplicacion en la que registrar eventos para una
lista
> > de
> > > > clientes
> > > >
> > > > tengo los clientes con toda su informacion y un numero de
> identificacion
> > > > unica en una tabla
> > > >
> > > > en una segunda tabla tendre el id_cliente mas los detalle de cada
una
> de
> > > sus
> > > > eventos, por ello debo utilizar una clave primaria doble para
> > identificar
> > > el
> > > > id_cliente-evento
> > > >
> > > > nunca se produciran dos eventos el mismo dia
> > > >
> > > > por ello mi pregunta, resutara optimo usar id_cliente-fecha como
clave
> > > > primaria o mejor usar id_cliente-id_evento y fecha como un


atributo
> mas
> > ??
> > > > (id_evento tal que 1 para el primero 2 para el segundo...)
> > > >
> > > > gracias por adelantado
> > > >
> > > >
> > >
> > >
> >
> >
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida