Dans de nombreuses conceptions de bases de données relationnelles, certains champs sont référencés dans d'autres tables.
Par exemple, considérons une table utilisateur avec un nom d'utilisateur unique et une deuxième table stockant les données d'adresse.
Une disposition possible, que je dirais est l'approche courante, car j'ai observé dans la plupart des logiciels, est d'utiliser des identifiants d'incrémentation automatique comme ceci:
Table users
===========
userId int primary auto_increment
userName varchar unique
Table adressdata
==========
userId int references users.userId
adress_type varchar // for example country
address_value varchar // for example US
(you probably also want to put a unique key on (userId,adress_type))
C'est ainsi que je le faisais et comment je l'ai vu dans la plupart des cas.
Une autre façon serait:
Table users
===========
userName varchar primary
Table adressdata
==========
userName varchar references users.userName
adress_type varchar // for example country
address_value varchar // for example US
(you probably also want to put a unique key on (userName,adress_type))
Ici, nous stockons le nom d'utilisateur complet également dans la table des données d'adresse.
Pour moi, cela présente les avantages suivants:
Vous pouvez sélectionner le nom d'utilisateur immédiatement dans la table sans avoir à le joindre à une autre table. Dans cet exemple, c'est du point de vue de l'application probablement pas si pertinent, mais ce n'est qu'un exemple.
Il peut être plus facile de faire évoluer la base de données dans un environnement de réplication maître-maître, car il n'y a pas de conflits auto_increment.
Mais aussi les inconvénients:
- L'espace requis pour l'index et les données (mais le plus pertinent sera probablement l'index) sur le champ dans la deuxième table est plus élevé.
- Un changement de nom d'utilisateur devrait se propager à toutes les tables, ce qui consomme plus de ressources que de simplement le changer dans une table et laisser les ID tels quels.
À mon avis, il est beaucoup plus facile de travailler avec des champs de texte et de ne pas utiliser d'identifiants d'incrémentation, et les compromis sont minimes et dans la plupart des applications non pertinents.
Bien sûr, certains objets SONT identifiés avec un nombre incrémentiel par leur nature (par exemple, les messages du forum devraient recevoir un identifiant incrémentiel car il n'y a probablement pas d'autre champ unique comme le titre ou ainsi).
Mais avant de commencer à concevoir mes dispositions de base de données d'une manière complètement différente, je voudrais savoir s'il y a des choses auxquelles je n'ai pas pensé.
Existe-t-il des meilleures pratiques?
Y a-t-il des avantages / inconvénients auxquels je ne pensais pas et dont les effets pourraient survenir ultérieurement?
Comment concevez-vous personnellement des bases de données concernant les points ci-dessus et pourquoi?