OVH Cloud OVH Cloud

Pb avec des clés primaire composées

5 réponses
Avatar
Frederix
Bonjour,
J'ai une table OPERATION comprenants les champs:
OP_DATEDEBUT du type 01/01/2004 15:30
OP_PERSONELID
OP_CHAMP1
OP_CHAMP2
ETC...

Le principe est que chaque enregistrement represente une operation (facile).
Ou cela se corse c'est qu'une operation ne peut etre réalise par une seule
personne une seule fois par jour.
En faite les champs de ma clé primaire composé devraient etre:
OP_DATEDEBUT +OP_PERSONELID
seulement pour ma clé, le format de OP_DATEDEBUT devrait etre du type
JJ/MM/AAAA et moi j'ai JJ/MM/AAAA HH:MM.

comment doit-je faire pour stocker ma date sous le format JJ/MM/AAAA HH:MM.
mais obtenir une cle primaire du type JJ/MM/AAAA.

Peut etre faut il que je revoit le probleme sous un autre angle mais je sais
pas lequel.
Je vous remercie de l'aide que vous pourrez m'apporter.

Frederic

5 réponses

Avatar
Fred BROUARD
1) mettre une clef primaire de type :
OP_ID INT NOT NULL IDENTITY PRIMARY KEY

2) placer une colonne calculée pour une date sans heure :
OP_DATE AS CONVERT(CHAR(10), OP_DATEDEBUT, 121),

3) ajouter une contrainte d'unicité sur DATE/PERS
CONSTRAINT CU_DATEPERS UNIQUE (OP_DATE, OP_PERSONELID)

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

Frederix a écrit:
Bonjour,
J'ai une table OPERATION comprenants les champs:
OP_DATEDEBUT du type 01/01/2004 15:30
OP_PERSONELID
OP_CHAMP1
OP_CHAMP2
ETC...

Le principe est que chaque enregistrement represente une operation (facile).
Ou cela se corse c'est qu'une operation ne peut etre réalise par une seule
personne une seule fois par jour.
En faite les champs de ma clé primaire composé devraient etre:
OP_DATEDEBUT +OP_PERSONELID
seulement pour ma clé, le format de OP_DATEDEBUT devrait etre du type
JJ/MM/AAAA et moi j'ai JJ/MM/AAAA HH:MM.

comment doit-je faire pour stocker ma date sous le format JJ/MM/AAAA HH:MM.
mais obtenir une cle primaire du type JJ/MM/AAAA.

Peut etre faut il que je revoit le probleme sous un autre angle mais je sais
pas lequel.
Je vous remercie de l'aide que vous pourrez m'apporter.

Frederic





--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
Jean-Nicolas BERGER
Personnellement, je ne connais pas le type "01/01/2004 15:30".
Je connais numeric, int, char, varchar, ... et surtout datetime et
smalldatetime.
Etant donné que la précision souhaitée semble être de l'ordre de la minute,
et à moins que la plage d'année soit trop large, je conseillerais un
smalldatetime.
Après, la définition d'une PK sur deux champs ne pose aucun souci.
Pour ce qui concerne la mise en forme de la date, et comme celà a (à juste
titre) été répété maintes fois dans ce forum : un SGBDR n'a pas pour
vocation de faire du cosmétique. Une date est une date, point final. On ne
stocke pas une date sous le format JJ/MM/AAAA ou AAAA-MM-JJ, mais sous le
format datetime (ou smalldatetime). Par contre, on peut en sortie l'afficher
sous le format désiré (voir pour cela l'instruction CONVERT, et notamment
les différentes possibilitées offertes au niveau du troisième paramètre.
JN.


"Frederix" a écrit dans le message de news:
%
Bonjour,
J'ai une table OPERATION comprenants les champs:
OP_DATEDEBUT du type 01/01/2004 15:30
OP_PERSONELID
OP_CHAMP1
OP_CHAMP2
ETC...

Le principe est que chaque enregistrement represente une operation
(facile).
Ou cela se corse c'est qu'une operation ne peut etre réalise par une seule
personne une seule fois par jour.
En faite les champs de ma clé primaire composé devraient etre:
OP_DATEDEBUT +OP_PERSONELID
seulement pour ma clé, le format de OP_DATEDEBUT devrait etre du type
JJ/MM/AAAA et moi j'ai JJ/MM/AAAA HH:MM.

comment doit-je faire pour stocker ma date sous le format JJ/MM/AAAA
HH:MM. mais obtenir une cle primaire du type JJ/MM/AAAA.

Peut etre faut il que je revoit le probleme sous un autre angle mais je
sais pas lequel.
Je vous remercie de l'aide que vous pourrez m'apporter.

Frederic



Avatar
Jean-Nicolas BERGER
Oula! Faudrait voir à pas trop abuser de la moquette... :-)
JN.
PS : On peut mettre pour ce genre de solutions le calcul directement dans la
contrainte, ça évite de créer une colonne supplémentaire (10 octets fois le
nombre d'enreg de la table...)

"Fred BROUARD" a écrit dans le message de news:

1) mettre une clef primaire de type :
OP_ID INT NOT NULL IDENTITY PRIMARY KEY

2) placer une colonne calculée pour une date sans heure :
OP_DATE AS CONVERT(CHAR(10), OP_DATEDEBUT, 121),

3) ajouter une contrainte d'unicité sur DATE/PERS
CONSTRAINT CU_DATEPERS UNIQUE (OP_DATE, OP_PERSONELID)

A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

Frederix a écrit:
Bonjour,
J'ai une table OPERATION comprenants les champs:
OP_DATEDEBUT du type 01/01/2004 15:30
OP_PERSONELID
OP_CHAMP1
OP_CHAMP2
ETC...

Le principe est que chaque enregistrement represente une operation
(facile).
Ou cela se corse c'est qu'une operation ne peut etre réalise par une
seule personne une seule fois par jour.
En faite les champs de ma clé primaire composé devraient etre:
OP_DATEDEBUT +OP_PERSONELID
seulement pour ma clé, le format de OP_DATEDEBUT devrait etre du type
JJ/MM/AAAA et moi j'ai JJ/MM/AAAA HH:MM.

comment doit-je faire pour stocker ma date sous le format JJ/MM/AAAA
HH:MM. mais obtenir une cle primaire du type JJ/MM/AAAA.

Peut etre faut il que je revoit le probleme sous un autre angle mais je
sais pas lequel.
Je vous remercie de l'aide que vous pourrez m'apporter.

Frederic



--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************



Avatar
Fred BROUARD
Jean-Nicolas BERGER a écrit:
Oula! Faudrait voir à pas trop abuser de la moquette... :-)
JN.
PS : On peut mettre pour ce genre de solutions le calcul directement dans la
contrainte, ça évite de créer une colonne supplémentaire (10 octets fois le
nombre d'enreg de la table...)



si tu es très riche c'est une bonne solution, car il te faudra des processeurs
hyper rapide pour faire les jointures sur 14 octets.

Alors qu'avec ma solution la jointure se fera sur 4 octets soit 32 bits, c'est à
dire le mot du processeur donc une seule passe.
Avec ta solution c'est 4 passes dans le proceesur pour chaque jointure donc 4 à
5 fois moins rapide...
C'est donc à toi de voir si tu préfère économiser 4 octets par lignes soit 4 Mo
de données si tu as un lillion de lignes, ou bien avoir des requêtes qui durent
500 % de temps en plus inutilement.

A +


--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


"Fred BROUARD" a écrit dans le message de news:


1) mettre une clef primaire de type :
OP_ID INT NOT NULL IDENTITY PRIMARY KEY

2) placer une colonne calculée pour une date sans heure :
OP_DATE AS CONVERT(CHAR(10), OP_DATEDEBUT, 121),

3) ajouter une contrainte d'unicité sur DATE/PERS
CONSTRAINT CU_DATEPERS UNIQUE (OP_DATE, OP_PERSONELID)

A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

Frederix a écrit:

Bonjour,
J'ai une table OPERATION comprenants les champs:
OP_DATEDEBUT du type 01/01/2004 15:30
OP_PERSONELID
OP_CHAMP1
OP_CHAMP2
ETC...

Le principe est que chaque enregistrement represente une operation
(facile).
Ou cela se corse c'est qu'une operation ne peut etre réalise par une
seule personne une seule fois par jour.
En faite les champs de ma clé primaire composé devraient etre:
OP_DATEDEBUT +OP_PERSONELID
seulement pour ma clé, le format de OP_DATEDEBUT devrait etre du type
JJ/MM/AAAA et moi j'ai JJ/MM/AAAA HH:MM.

comment doit-je faire pour stocker ma date sous le format JJ/MM/AAAA
HH:MM. mais obtenir une cle primaire du type JJ/MM/AAAA.

Peut etre faut il que je revoit le probleme sous un autre angle mais je
sais pas lequel.
Je vous remercie de l'aide que vous pourrez m'apporter.

Frederic



--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************








Avatar
Jean-Nicolas BERGER
C'est de toute manière toujours la même chose, on doit choisir entre faire
des calculs et mémoriser la réponse, ou bien refaire les calculs à la
demande.
Mains bon, on va pas se taper dessus pour si peu, c'était juste de mon côté
histoire de dire que la syntaxe du 2ème et 3ème points pouvait être écrite
différemment... :-)
JN.


"Fred BROUARD" a écrit dans le message de news:
%


Jean-Nicolas BERGER a écrit:
Oula! Faudrait voir à pas trop abuser de la moquette... :-)
JN.
PS : On peut mettre pour ce genre de solutions le calcul directement dans
la contrainte, ça évite de créer une colonne supplémentaire (10 octets
fois le nombre d'enreg de la table...)



si tu es très riche c'est une bonne solution, car il te faudra des
processeurs hyper rapide pour faire les jointures sur 14 octets.

Alors qu'avec ma solution la jointure se fera sur 4 octets soit 32 bits,
c'est à dire le mot du processeur donc une seule passe.
Avec ta solution c'est 4 passes dans le proceesur pour chaque jointure
donc 4 à 5 fois moins rapide...
C'est donc à toi de voir si tu préfère économiser 4 octets par lignes soit
4 Mo de données si tu as un lillion de lignes, ou bien avoir des requêtes
qui durent 500 % de temps en plus inutilement.

A +


--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


"Fred BROUARD" a écrit dans le message de
news:

1) mettre une clef primaire de type :
OP_ID INT NOT NULL IDENTITY PRIMARY KEY

2) placer une colonne calculée pour une date sans heure :
OP_DATE AS CONVERT(CHAR(10), OP_DATEDEBUT, 121),

3) ajouter une contrainte d'unicité sur DATE/PERS
CONSTRAINT CU_DATEPERS UNIQUE (OP_DATE, OP_PERSONELID)

A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

Frederix a écrit:

Bonjour,
J'ai une table OPERATION comprenants les champs:
OP_DATEDEBUT du type 01/01/2004 15:30
OP_PERSONELID
OP_CHAMP1
OP_CHAMP2
ETC...

Le principe est que chaque enregistrement represente une operation
(facile).
Ou cela se corse c'est qu'une operation ne peut etre réalise par une
seule personne une seule fois par jour.
En faite les champs de ma clé primaire composé devraient etre:
OP_DATEDEBUT +OP_PERSONELID
seulement pour ma clé, le format de OP_DATEDEBUT devrait etre du type
JJ/MM/AAAA et moi j'ai JJ/MM/AAAA HH:MM.

comment doit-je faire pour stocker ma date sous le format JJ/MM/AAAA
HH:MM. mais obtenir une cle primaire du type JJ/MM/AAAA.

Peut etre faut il que je revoit le probleme sous un autre angle mais je
sais pas lequel.
Je vous remercie de l'aide que vous pourrez m'apporter.

Frederic



--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************