OVH Cloud OVH Cloud

PRIMARY vs INDEX

5 réponses
Avatar
O.L.
Bonjour,

Je viens de me poser une quesion toute bête : quelle est la différence
entre une colonne que l'on PRIMARYse et une colonne que l'on INDEX ?

J'ai l'habitude de mettre dans chaque table un champ `id` qui a une
valeur unique et AUTO_INCREMENTée. Si je veux optimiser les recherches
sur cette colonne (WHERE id=123), est ce que je dois créer une clé
primaire ou bien un index, ou bien est ce que ça a le même effet ?

J'ai regardé la doc, mais je n'ai pas trouvé de réponse claire ...

Merci d'avance pour vos conseils :)
Olivier

--
Olivier Ligny
Créateur web free-lance / www.cyber-tamtam.net

5 réponses

Avatar
Fred Brouard - SQLpro
bonjour,

ftc a écrit:
Patrick Mevzek a écrit :

Le Mon, 19 Dec 2005 18:14:36 +0100, ftc a écrit :

C'est bien pour ça que l'on parlait d'un niveau sémantique donc
conceptuel. A un moment ou un autre, il vous faut bien définir une
clé primaire quelque part dans votre système, que l'implantation soit
faite dans votre SGBDR ou dans votre application cliente, ça ne
change rien au schéma de votre base et au fait qu'il faille une clé
primaire.





Aucune obligation d'avoir des clefs primaires dans toutes les tables.




Non, si vous ne voulez rien faire de ces enregistrements là.

J'aimerais bien savoir comment vous faites pour isoler un enregistrement
si en terme de *conception* vous n'avez pas défini de clé primaire.




Votre remarque est particulièrement idiote. De nombreuses applications utilisent
des tables sans clef dans lesquelles on trouve aussi bien des lignes uniques que
doublonnées. Et c'est une pratique courrante et intéresante. Je ne vous
donnerais qu'un seul exemple : les traces !

Dans un site web, il arrive fréquemment que l'on veuille tracer l'activité d'un
internaute. Pour peu qu'il revienne et qu'en parrallèle s'éxécutent les mêmes
activités au même moment on se retrouve avec des doublons.
Cela permet d'éviter de générer des clefs auto incrémentées qui nécessite un
travail important du serveur donc de la contention, clef qui d'ailleurs
n'auraient aucune utilité, car l'exploitation des traces à plus un but
strictement statistique qu'informationnel.
En d'autres termes il est souhaitable, préférable et performant de construire
des tables sans clefs dans ce cas précis.

Ne faites donc pas l'intégrite du modèle relationnel. Restez dans la réalité de
la conception, du fonctionnel et de l'exploitation des données

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
ftc
Fred Brouard - SQLpro a écrit :
J'aimerais bien savoir comment vous faites pour isoler un
enregistrement si en terme de *conception* vous n'avez pas défini de
clé primaire.




Votre remarque est particulièrement idiote.



Je vous remercie.

De nombreuses applications
utilisent des tables sans clef dans lesquelles on trouve aussi bien des
lignes uniques que doublonnées. Et c'est une pratique courrante et
intéresante.



Que la pratique soit courante, je veux bien vous croire, qu'elle soit
intéressante est une toute autre chose.


Je ne vous donnerais qu'un seul exemple : les traces !
Dans un site web, il arrive fréquemment que l'on veuille tracer
l'activité d'un internaute. Pour peu qu'il revienne et qu'en parrallèle
s'éxécutent les mêmes activités au même moment on se retrouve avec des
doublons.
Cela permet d'éviter de générer des clefs auto incrémentées qui
nécessite un travail important du serveur donc de la contention, clef
qui d'ailleurs n'auraient aucune utilité, car l'exploitation des traces
à plus un but strictement statistique qu'informationnel.



Pourquoi vouloir générer une clé auto-incrémentée alors que
l'information d'unicité est déjà présente. Vos logs sont d'une part
reliés à un internaute et d'autre part reliés à une notion de temps. Si
vous supprimer l'un ou l'autre, vous perdez une très grande partie de
l'information.

Maintenant que vous vouliez faire une table de trace sans notion de
temps me semble être une erreur de conception car vous perdez une grande
partie des possibilité de votre système comme de faire une trace type du
parcours du visiteur ( graphe des pages et temps moyen de consultation
par exemple ).

Même dans les logiciels de statistiques, on utilise la notion d'unicité
d'un enregistrement.

Je pratique les SGBDR depuis quelques temps déjà et je n'ai rencontré de
cas ou des enregistrements devaient être doublonnés dans une table de
SGBDR que pour faire du data mining ou les données proviennent d'un
ensemble hétérogène de sources ( fichiers texte, SGBD divers, système de
log ... ). Le premier travail consite d'ailleurs en un dédoublonnage.
Mais dans ce cas, le manque d'unicité d'un enregistrement fait perdre
déjà beaucoup ( trop ) d'informations et le SGBDR n'est là que pour
faire du stockage et non de l'analyse, on l'utilise donc un peu contre
nature.

En d'autres termes il est souhaitable, préférable et performant de
construire des tables sans clefs dans ce cas précis.



On va virer le souhaitable et le préférable et garder le performant ( en
termes de ressources ) si vous permettez. Cette performance étant toute
relative puisqu'elle n'intervient que lors de l'insertion et non de la
consultation.

Si c'est pour avoir une liste de lignes doublonnées, je dirais qu'il est
souhaitable, préférable et performant d'utiliser des fichiers log ou un
SGBD non relationnel.

Bien loin de moi l'idée de vouloir faire de l'*intégrisme* du modèle
relationnel, bien au contraire, je conseillerai même bien souvent de ne
pas utiliser un SGBDR mais un outil plus adapté. Le problèmes est que
nous sommes entré dans un ère ou dès qu'une application recquiert du
stockage, on fait appel à un SGBDR quite à utiliser cet outil n'importe
comment.

L'*intégriste* est celui qui dit que son produit est le meilleur et
adapté en toutes circonstances.
Avatar
Fred Brouard - SQLpro
ftc a écrit:
Fred Brouard - SQLpro a écrit :

J'aimerais bien savoir comment vous faites pour isoler un
enregistrement si en terme de *conception* vous n'avez pas défini de
clé primaire.




Votre remarque est particulièrement idiote.




Je vous remercie.

>De nombreuses applications

utilisent des tables sans clef dans lesquelles on trouve aussi bien
des lignes uniques que doublonnées. Et c'est une pratique courrante et
intéresante.




Que la pratique soit courante, je veux bien vous croire, qu'elle soit
intéressante est une toute autre chose.


>Je ne vous donnerais qu'un seul exemple : les traces !

Dans un site web, il arrive fréquemment que l'on veuille tracer
l'activité d'un internaute. Pour peu qu'il revienne et qu'en
parrallèle s'éxécutent les mêmes activités au même moment on se
retrouve avec des doublons.
Cela permet d'éviter de générer des clefs auto incrémentées qui
nécessite un travail important du serveur donc de la contention, clef
qui d'ailleurs n'auraient aucune utilité, car l'exploitation des
traces à plus un but strictement statistique qu'informationnel.




Pourquoi vouloir générer une clé auto-incrémentée alors que
l'information d'unicité est déjà présente. Vos logs sont d'une part
reliés à un internaute et d'autre part reliés à une notion de temps. Si
vous supprimer l'un ou l'autre, vous perdez une très grande partie de
l'information.



Vous n'avez visiblement jamais travaillé avec de grandes masses d'information.
La limite actuelle de précision des horodatage est de quelques millisecondes.
D'ou de fréquent doublons pour des bases de données fortement solicités.
Vivez dans un monde réel pas celui des cours magistraux et de la pure théorie !!!



Maintenant que vous vouliez faire une table de trace sans notion de
temps me semble être une erreur de conception car vous perdez une grande
partie des possibilité de votre système comme de faire une trace type du
parcours du visiteur ( graphe des pages et temps moyen de consultation
par exemple ).

Même dans les logiciels de statistiques, on utilise la notion d'unicité
d'un enregistrement.

Je pratique les SGBDR depuis quelques temps déjà



moi seulement depuis seulement 1986

et je n'ai rencontré de
cas ou des enregistrements devaient être doublonnés dans une table de
SGBDR que pour faire du data mining ou les données proviennent d'un
ensemble hétérogène de sources ( fichiers texte, SGBD divers, système de
log ... ). Le premier travail consite d'ailleurs en un dédoublonnage.
Mais dans ce cas, le manque d'unicité d'un enregistrement fait perdre
déjà beaucoup ( trop ) d'informations et le SGBDR n'est là que pour
faire du stockage et non de l'analyse, on l'utilise donc un peu contre
nature.

En d'autres termes il est souhaitable, préférable et performant de
construire des tables sans clefs dans ce cas précis.




On va virer le souhaitable et le préférable et garder le performant ( en
termes de ressources ) si vous permettez. Cette performance étant toute
relative puisqu'elle n'intervient que lors de l'insertion et non de la
consultation.

Si c'est pour avoir une liste de lignes doublonnées, je dirais qu'il est
souhaitable, préférable et performant d'utiliser des fichiers log ou un
SGBD non relationnel.



et re retraiter tout cela dans un SGBDR.... quel temps perdu en I/O !
Ne révez pas, travaillez. Vous êtes visiblement un peu jeune dans ce métier !


Bien loin de moi l'idée de vouloir faire de l'*intégrisme* du modèle
relationnel, bien au contraire, je conseillerai même bien souvent de ne
pas utiliser un SGBDR mais un outil plus adapté. Le problèmes est que
nous sommes entré dans un ère ou dès qu'une application recquiert du
stockage, on fait appel à un SGBDR quite à utiliser cet outil n'importe
comment.

L'*intégriste* est celui qui dit que son produit est le meilleur et
adapté en toutes circonstances.





--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
ftc
Fred Brouard - SQLpro a écrit :
[SNIP]

Pas la peine de quoter comme un tordu.


Vous n'avez visiblement jamais travaillé avec de grandes masses
d'information. La limite actuelle de précision des horodatage est de
quelques millisecondes. D'ou de fréquent doublons pour des bases de
données fortement solicités.



Je ne faisais que reprendre votre exemple, mais il est vrai que dans les
logs d'un site web, le même utilsateur génére des milliers de traces
identiques par millisecondes.

Et vous omettez une chose, je ne pense pas qu'un SGBDR soit adapaté pour
faire du logging anonyme.

Si le logging n'est pas anonyme, je doute fort que vous arriviez à
générer 60000 logs identiques par minute pour un utilisateur.


Vivez dans un monde réel pas celui des cours magistraux et de la pure
théorie !!!



Il y a bien longtemps que j'ai quitté les cours magistraux.


Je pratique les SGBDR depuis quelques temps déjà




moi seulement depuis seulement 1986



Oui, et je dois en conclure quoi ?

Si c'est pour avoir une liste de lignes doublonnées, je dirais qu'il
est souhaitable, préférable et performant d'utiliser des fichiers log
ou un SGBD non relationnel.




et re retraiter tout cela dans un SGBDR.... quel temps perdu en I/O !



La je suis d'accord avec vous, quel besoin d'aller le retraiter dans un
SGBDR puisque ces données ne sont manifestement pas relationnelles ?

Vous semblez bien obnubilé par les SGBDR à vouloir leur faire faire tout
et n'importe quoi.

Si les données ne conviennent pas au contraintes des SGBDR, il ne vous
est jamais venu à l'idée que le SGBDR n'était peut être pas l'outil
adapté pour ce travail ?


Ne révez pas, travaillez. Vous êtes visiblement un peu jeune dans ce
métier !



Moins que vous ne semblez le croire.
Sachez que certaines personnes ne passent pas leur temps à exposer leur
CV avant de prendre la parole.
Avatar
Antoun
PRIMARY et INDEX sont deux concepts très différents.




c'est vrai... mais concrètement, la contrainte d'unicité inhérente à
la clé primaire est implémentée par un index.




Concrétement dans certains SGBDR ! pas dans tous les cas. Par exemple
dans le cas de séquenceurs fermés pas besoin d'index pour générer
l'unicité.



OK ! je ne connaissais pas cet exemple.