Bonsoir Dorian,
Envoyé par
dorian53
Ce sont plutôt UTILISATEUR et PERSONNE qui portent une fk vers IDENTITE.
Le concept de clé étrangère (fk) se situe au niveau relationnel, mais votre diagramme se situe à un autre niveau, c’est un diagramme de classes, selon lequel une identité est formellement soit un utilisateur, soit une personne qui n’est pas un utilisateur. Par défaut, les sous-classes sont exclusives, s’il y a chevauchement il faut le préciser :
Cela dit, il n’y a pas contradiction entre ces deux niveaux : UTILISATEUR et PERSONNE sont des sous-classes d’IDENTITE, et une dérivation sous forme tabulaire (disons SQL) donnera lieu aux tables UTILISATEUR et PERSONNE, chacune dotée d’une clé étrangère faisant référence à la table IDENTITE.
Envoyé par
dorian53
Les 5 étudiants dans UTILISATEUR (qui se connectent à la solution) correspondent aussi à 5 des 900 étudiants dans PERSONNE.
Le diagramme peut évoluer ainsi :
Un utilisateur correspond à exactement une personne, et une personne correspond parfois à un utilisateur :
Mais on peut aussi avoir la représentation suivante, selon laquelle un utilisateur est une personne spécialisée :
Et pourquoi ne pas fondre PERSONNE et IDENTITE ?
Au stade SQL, cette fusion donnerait :
CREATE TABLE PERSONNE
(
psn_id INT NOT NULL
, psn_nom VARCHAR(32) NOT NULL
, psn_prenom VARCHAR(32) NOT NULL
, psn_adr_courriel VARCHAR(64) NOT NULL
, CONSTRAINT PERSONNE_PK PRIMARY KEY (psn_id)
) ;
CREATE TABLE UTILISATEUR
(
utilisateur_id INT NOT NULL
, utilisateur_login VARCHAR(32) NOT NULL
, utilisateur_mot_de_passe VARCHAR(32) NOT NULL
, CONSTRAINT UTILISATEUR_PK PRIMARY KEY (utilisateur_id)
, CONSTRAINT UTILISATEUR_PERSONNE_FK FOREIGN KEY (utilisateur_id)
REFERENCES PERSONNE (psn_id) ON DELETE CASCADE
) ;
Un début de jeu d’essai :
INSERT INTO PERSONNE (psn_id, psn_nom, psn_prenom, psn_adr_courriel) VALUES
(1, 'Naudin', 'Fernand', 'fernandnau@flingueurs.fr')
, (2, 'Volfoni', 'Raoul', 'rvolfoni@citron.fr')
, (3, 'Volfoni', 'Paul', 'paulovolfoni@flingueurs.fr')
, (4, 'Champo', 'Maurice', 'momo@patate.fr')
, (5, 'Trancène', 'Jean', 'jeantranc@navets.fr')
, (6, 'Mavallée', 'Colette', 'cmavallee@pamplemousse.fr')
, (7, 'Mavallée', 'Berthe', 'bmavallee@pamplemousse.fr')
;
INSERT INTO UTILISATEUR (utilisateur_id, utilisateur_login, utilisateur_mot_de_passe) VALUES
(1, 'fernau', '************')
, (2, 'ravolf', '************')
, (3, 'paulo', '************')
;
Pour le confort du développeur, une vue permettant de visualiser les utilisateurs :
CREATE VIEW UTILISATEUR_V (id, nom, prenom, adr_courriel, login, mot_de_passe)
AS
SELECT psn_id, psn_nom, psn_prenom, psn_adr_courriel, utilisateur_login, utilisateur_mot_de_passe
FROM PERSONNE JOIN UTILISATEUR ON psn_id = utilisateur_id
;
Utilisation de la vue :
SELECT * FROM UTILISATEUR_V ;
Au résultat :
id nom prenom adr_courriel login mot_de_passe
-- ------- ------ -------------------------- ------ ------------
1 Naudin Fernand fernandnau@flingueurs.fr fernau ************
2 Volfoni Raoul rvolfoni@citron.fr ravolf ************
3 Volfoni Paul paulovolfoni@flingueurs.fr paulo ************
A l'occasion, vous pouvez voter pour les messages qui ont pu vous apporter une aide...
Partager