SkYlEsS
Elite
Malgré cela, je ne comprends pas bien quand utiliser PRIMARY KEY, INDEX et UNIQUE INDEX ... Quelqu'un pourrait m'expliquer les différences (avec exemples si possible) et les utilités de chacun ?Dans les chapitres précédents nous avons introduit une nouvelle notion sans la décrire précisement. En effet, à chaque élément de la table catégories nous avons associé un champ id, non null,qui identifie de façon unique une catégorie et qui nous sert de référence pour établir des liens avec d'autres tables (Cf. table films). C'est ce que l'on appelle une clé primaire. On pourra à la création de la table définir un champ comme étant une clé primaire par la requête
CREATE TABLE categories (id int4 NOT NULL AUTO_INCREMENT, categorie varchar(64), PRIMARY KEY(id));
Pourquoi préciser qu'une clé est primaire?
Comme il s'agit d'un champ qui sert de référence, la base de données est susceptible d'être souvent solicitée pour retrouver l'enregistrement de la table correspondant à l'identifiant id donné. Cette recherche doit donc être la plus rapide possible. La base de données est alors informée qu'elle doit chercher à optimiser cette recherche en introduisant ce que l'on appelle un index.
Index
Comme indiqué ci dessus, un index sert à optimiser les recherches. Car si le moteur de la base de données passe en revue chaque enregistrement pour retrouver celui correspondant à certains critères cela prendra enormément de temps si par malheur la requête porte sur des enregistrements se trouvant en fin de table. Pour éviter cela, il est possible en quelque sorte d'établir des parcelles dans cette table. Pour par exemple être capable de dire que les champs ayant un id entre 0 et 1000 se trouvent dans le 1er quart de la base, ceux entre 1001 et 1500 dans le 2nd quart, ceux entre 1501 et 3000 dans le 3ème quart et enfin ceux entre 3001 et 3500 dans le dernier quart. (REM: L'enregistrement ayant l'identifiant 300 n'est pas nécessairement le 300ème enregistrement puisque certains enregistrements ont pu être supprimés). Dans ce cas, la recherche systèmatique ne portera alors que sur un quart de la table (réduisant ainsi par quatre les temps de recherche des éléments en fin de table). Toutefois, la création et l'utilisation de cet index à un coût (cela prends du temps). Il n'est donc pas concevable de l'appliquer à tous les champs, c'est pourquoi le concepteur de la base doit choisir judicieusement et préciser quels doivent être les champs devant bénéficier de cet indexage. Les clés primaires sont les premiers candidats tout désignés mais d'autres champs souvent utilisés dans des clauses WHERE peuvent eux aussi légitement en être bénéficiaire. Seul un champ défini comme "NOT NULL" peut être indéxé (c'est du moins vrai pour MySQL)
CREATE TABLE matable (id int4, nom varchar(64) NOT NULL, INDEX (nom));
Remarques:
1. Contrairement à PRIMARY KEY, INDEX n'implique pas l'unicité du champs. Pour le rendre unique il faut utiliser UNIQUE INDEX.
2. L'algorithme d'indexage présenté ici, n'est qu'une vulgarisation du principe d'indexage, il ne reflète que très peu la réalité mais permet de prendre conscience de la problématique.
Merci
Edit : et pour quel type de champ opter si je veux enregistrer une date complète ? (Jour, mois, année, heure, minute voire seconde)