Ensuite, si une adresse concerne une et une seule personne et qu'une personne peut avoir zéro (ou une) à plusieurs adresses, alors, la bonne façon d'identifier l'adresse est de l'identifier
relativement à la personne. Ca signifie que la PK de l'adresse utilisera, dans cet ordre, la PK de la personne, puis un chrono adresse. Le chrono adresse seul n'est pas unique, c'est le couple PK personne + chrono adresse qui garantit l'unicité. Comme une personne peut avoir un nombre limité d'adresses, une colonne de type tinyint suffira largement pour le chrono.
L'avantage est que, en définissant la PK comme index cluster (ce qui est synonyme pour MySQL), toutes les adresses d'une même personne seront rangées de façon contiguë, d'où une recherche optimisée.
Ce qui donne le DDL suivant :
1 2 3 4 5 6 7 8 9 10 11
| CREATE TABLE adresse (
personne_id int(11) NOT NULL,
adresse_id tinyint NOT NULL,
ad1 varchar(38) CHARACTER SET utf8 NOT NULL,
ad2 varchar(38) CHARACTER SET utf8 NOT NULL,
ad3 varchar(38) CHARACTER SET utf8 NOT NULL,
ad4 varchar(38) CHARACTER SET utf8 NOT NULL,
ad5 varchar(38) CHARACTER SET utf8 NOT NULL,
codpost char(5) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (personne_id, adresse_id),
FOREIGN KEY(personne_id) REFERENCES personne(personne_id) |
Notez la suppression des quotes inversées inutiles et pénibles à l'usage (elles ne sont nécessaires que si des noms d'objets sont des mots réservés SQL, ce qui n'est pas recommandé)
Même raisonnement concernant les dossiers si un dossier ne concerne qu'une et une seule personne
Partager