Identifiants
MĂȘme avec un schĂ©ma bien normalisĂ©, il peut y avoir des scenarii dans lesquels il est impossible de choisir la clĂ© primaire qui est un super-key.
Nous avons déjà vu l'exemple :
etudiant_id | cours_id |
---|---|
1 | SGBDR |
1 | Backend |
2 | Angular |
3 | Backend |
3 | Angular |
cours_id | prix |
---|---|
SGBDR | 1000 |
Backend | 1500 |
Angular | 2000 |
Dans lâexemple, les cours sont identifiĂ©s par leur nom en français, mais si on devait utiliser un systĂšme localisĂ© (traduit), le nom du cours nâest plus une super-key.
Un autre exemple, dans le cas dâun Ă©tudiant, il nây a pas de set dâattributs qui identifie chaque Ă©tudiant, puisquâil y a toujours la possibilitĂ© que 2 Ă©tudiants partagent les mĂȘmes attributs (nom de famille, prĂ©nom, date de naissance, etc).
Nous désignons alors un identifiant. Mais lequel ?
Une chose est certaine : le ID doit ĂȘtre une super-key et donc avoir des mĂȘmes caractĂ©ristiques :
ĂȘtre unique sur toutes les lignes de la table
identifier une seule ligne de la table
ID type auto-increment
Une option fournie par beaucoup de SGBDR est l'identifiant de type entier qui s'incrémente automatiquement avec chaque insert into
. Le SGBDR prend note de la progression de ce compteur, assurant alors son unicité.
On utilise le mot auto_increment
:
Ce type de clé a plusieurs avantages :
Facile Ă lire
Un Ă©tudiant nâa quâĂ retenir son numĂ©ro pour accĂ©der aux services
Optimal pour la construction des indexes
En revanche, il y a aussi plusieurs désavantages :
Facile Ă espionner : Si on connait le numĂ©ro dâun Ă©tudiant, par exemple, 55, on saurait immĂ©diatement quâil y a un Ă©tudiant 54 et 56
On peut dĂ©terminer la quantitĂ© (minimale) dâentitĂ©s dans la table juste par son ID. Ex. nombre de commandes passĂ©s
Risque dâerreurs en insertion en parallĂšle. Imaginons que 2 processus essaie dâinsĂ©rer une ligne en mĂȘme temps. Comment la valeur sâincrĂ©mente ?
Difficile à gérer les doubles dans les systÚmes distribués : s'il a plusieurs data-centers, chacun gÚre son identifiant, le risque de doublon est élevé !
Exercice
Insérer quelques lignes à la table dessus.
Qu'est-ce que vous observez ?
Supprimer la derniĂšre ligne, et en ajoutez une nouvelle. Qu'est-ce que vous observez ?
ID type UUID
Un UUID (Universal Unique Identifier) est un numĂ©ro alĂ©atoire gĂ©nĂ©rĂ© (par un algorithme) selon un set de variables qui sont plus ou moins garanties dâĂȘtre uniques :
La date, heure, secondes, millisecondes
Lâadresse mac de lâordinateur
La tempĂ©rature de lâordinateur au moment de la gĂ©nĂ©ration
... et un ensemble de facteurs similaires
L'objectif ultime est de pouvoir, Ă tout moment, gĂ©nĂ©rer une valeur qui est garantie (ou au moins aura une trĂšs trĂšs haute probabilitĂ©) d'ĂȘtre unique au monde. Bien Ă©videmment, ceci est une tĂąche presque impossible. Mais, ce qui suffit pour notre plateforme, est que la valeur soit unique, juste dans le domaine de notre table, qui est beaucoup plus faisable !
Dans notre SGBDR, on peut récupérer une valeur type UUID avec une fonction :
On peut appeler cette fonction comme default pour notre identifiant :
Les UUIDS ont des avantages et désavantages aussi.
Avantages :
unicité et (presque) garanti
difficile Ă espionner
facilite des SGBDR distribués
DĂ©savantages :
difficile à lire (donc pas approprié pour donner aux utilisateurs, comme numéro d'étudiant par exemple)
plus de place nécessaire pour le stockage
plus lent pour les recherches
Triggers
Un déclencheur est une sorte de fonction qui est appelée systématiquement avant ou aprÚs une action (insert
, update
, delete
) sur une ligne.
Ils peuvent ĂȘtre donc trĂšs utiles pour faire un prĂ©traitement de nos donnĂ©es, ou bien des post-traitements, pour, par exemple, dĂ©clencher des mises Ă jour secondaires.
Par exemple, dans le cas de gĂ©nĂ©ration de UUIDon pourra intercepter la requĂȘte insert
, et en modifiant les valeurs :
Ici, on précise before insert on customer
: avant d'insérer une nouvelle ligne à la table customer. On procÚde à générer un uuid
pour la nouvelle ligne.
C'est ainsi qu'on assure de toujours générer en interne nos UUID.
Je vous laisse comme exercice une exploration plus profonde : https://www.mariadbtutorial.com/mariadb-triggers/mariadb-create-trigger/
DerniĂšre mise Ă jour