Mysql
 sql >> Base de données >  >> RDS >> Mysql

Clé étrangère pour plusieurs tables et colonnes ?

Vous n'êtes pas obligé d'inclure le nom de l'élément dans les deux tables. C'est ce qu'on appelle une solution dénormalisée. Vous ne devriez l'avoir que dans la table des éléments et ne vous référer qu'à l'id, puis si vous avez besoin du nom, vous pouvez également le joindre en fonction de la clé primaire (id). Sinon, c'est tout à fait OK dans mon avis.

CREATE TABLE user(
  id INT(11) NOT NULL AUTO_INCREMENT,
  username VARCHAR(50) NOT NULL,
  password VARCHAR(20) NOT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE items(
  i_id INT(11) NOT NULL AUTO_INCREMENT,
  name TINYTEXT NOT NULL,
  price DECIMAL(8,2) NOT NULL,
  PRIMARY KEY (i_id)
);

CREATE TABLE user_purchase(
  i_id INT(11) NOT NULL,
  name TINYTEXT NOT NULL,
  id INT(11) NOT NULL,
  FOREIGN KEY (i_id) REFERENCES items(i_id),
  FOREIGN KEY (id) REFERENCES user(id)
);

Parfois, lorsque les performances sont critiques, vous devez utiliser des tables dénormalisées. Cela peut être beaucoup plus rapide.

La normalisation est importante pour éviter différentes anomalies. Si vous avez des tables dans une forme normale de haut niveau, vos tables ne seront pas redondantes et n'auront pas ces anomalies. Par exemple, si vous avez quelque chose de stocké à plusieurs endroits, vous devez veiller à ce que toutes les données redondantes soient à jour. Cela vous donne une chance de le faire de manière incorrecte et de finir par avoir différentes anomalies.

Dans votre situation, avoir une clé étrangère vous aide à conserver l'intégrité des données, mais sans clé étrangère pour le nom, vous seriez en mesure d'avoir des articles avec des noms dans les achats qui ne sont pas présents dans la table des articles.

C'est une sorte d'anomalie.

Il en existe de nombreux types, mieux vaut les éviter le plus longtemps possible.

En savoir plus ici sur les anomalies

Dans certains cas, vous devez dénoramaliser. Stockez donc certaines données de manière redondante en raison de problèmes de performances. De cette façon, vous pouvez économiser certaines opérations de jointure qui pourraient prendre beaucoup de temps.

Les détails de la normalisation sont couverts par des rubriques de différentes formes normales :NF0, NF1, NF2, NF3 et BCNF

Formulaires normaux en détail

Pour plus de détails sur les fondements mathématiques de la décomposition sans perte en formes normales supérieures, voir "Dépendances fonctionnelles". Cela va vous aider à comprendre pourquoi vous pouvez garder les identifiants "redondants". Il s'agit pratiquement d'une redondance nécessaire, puisque vous en avez besoin pour pouvoir reconstruire ultérieurement l'ensemble de données d'origine. Cela va être la définition des différentes formes normales. Quel niveau de redondance est autorisé ?

Dépendances fonctionnelles