class: mainpage name: accueil # Semaine 2 ## Modèle relationnel ## Langage SQL ### Responsable : Laurent BRISSON --- class: chapterpage name: partie2 # Rappels de la Semaine 1 ## Le modèle relationnel --- layout: true .footer[ # Module Bases de données ## Responsable : Laurent BRISSON .cc-by-nc-sa[] ] --- .header[ # .number[Rappels] Modèle relationnel ] ## Modèle relationnel
une manière de modéliser l'information
structuré sous forme de relations
en respectant un ensemble de contraintes
## Intégrité des données
entité
domaine
référentielle
définie par l'utilisateur
# ??? Le modèle relationnel propose de modéliser l'information sous formes de relations en respectant un ensemble de contraintes. Ces contraintes ont pour objectif de préserver l'intégrité des données. La notion d'intégrité se décline suivant 3 axes qui sont présentés dans le [cours](http://formations.imt-atlantique.fr/bd_ihm/fr/intro_db/relational_model/#intégrité-des-données). L’intégrité d’entité définit une ligne comme étant une entité unique pour une table particulière. Elle garantit l’intégrité des colonnes d’identification ou de la clé primaire d’une table. L’intégrité de domaine définit un ensemble de valeurs acceptables qu’une colonne est autorisée à contenir. Cette intégrité peut inclure des contraintes et d’autres mesures limitant le format, type et nombre de données saisies. ! ATTENTION ! Le respect du type est une condition nécessaire mais non suffisante pour respecter l'intégrité de domaine. Par exemple on ne peut pas mettre un prénom dans un champ nom (pourtant il s'agit de 2 chaînes de caractères) ou un identifiant de patient à la place d'un identifiant de médecin (si on fait l'hypothèse qu'il s'agit dans les 2 cas d'un entier). L’intégrité référentielle garantit la cohérence des valeurs de clés entre les tables. Ce type de cohérence impose qu’il n’y ait aucune référence à des valeurs inexistantes et que, si la valeur d’une clé change, toutes les références qui y sont faites soient modifiées en conséquence dans l’ensemble de la base de données. ! ATTENTION ! Une clef référentielle peut être `NULL` (c'est à dire ne pas avoir de valeur) sans aller à l'encontre de l'intégrité référentielle (on peut ne rien référérer, mais si on donne une référence ce doit être quelque chose qui existe). --- .header[ # .number[Rappels] Modèle relationnel ## Entreprises et clients ]
Dans la table `Entreprise`, il est possible d'avoir plusieurs lignes avec la même valeur de l'attribut `dénomination`.
VRAI
FAUX
--- .header[ # .number[Rappels] Modèle relationnel ## Entreprises et clients ]
Dans la table `Client`, `id_client` correspond à la clé étrangère.
VRAI
FAUX
--- .header[ # .number[Rappels] Modèle relationnel ## Entreprises et clients ]
Dans la table `Client`, `ref_entreprise` peut ne pas avoir de valeur (c'est à dire avoir la valeur `NULL`).
VRAI
FAUX
--- .header[ # .number[Rappels] Modèle relationnel ## Commandes et articles ]
Dans la table `Commande`, un des attributs est redondant.
VRAI
FAUX
--- .header[ # .number[Rappels] Modèle relationnel ## Commandes et articles ]
Dans la table `Commande`, `ref_article` peut ne pas avoir de valeur (c'est à dire avoir la valeur `NULL`).
VRAI
FAUX
--- .header[ # .number[Rappels] Modèle relationnel ## Commandes et articles ]
Dans la table `Commande`, la PK est incorrecte parce qu'elle contient une clé référencielle.
VRAI
FAUX
--- layout: true --- class: chapterpage name: partie2 # Semaine 2 ## Le langage SQL --- layout: true .footer[ # Module Bases de données ## Responsable : Laurent BRISSON .cc-by-nc-sa[] ] --- .header[ # .number[Semaine 2] Organisation de l'activité ] ## Objectifs - Niveau minimal à atteindre : - **Requêtes Simples** - **Requêtes pour la création et la mise à jour** (indispensable pour le projet) - Pour ceux qui veulent faire une TAF orientée "Informatique" ou "Analyse de données" - **Requêtes avancées** ## Outils pour faire les requêtes - Code exécutable dans la page web pour l'activité **Découverte** - Notebook JupyterHub avec PostgreSQL pour les autres activités - [Accès à la base de données](https://formations.imt-atlantique.fr/bd_ihm/fr/organisation/environnement/bd/) --- .header[ # .number[Semaine 2] Activité Découverte ## Étude de cas "Bibliothèque" ]
## Remarques sur ce schéma logique - Bien différencier un livre d'un exemplaire *papier* d'un livre - Il ne peut pas gérer l'historique des emprunts ! ## Adoptez une démarche réflexive lorsque vous écrivez vos requêtes - Un message d'erreur indique que votre requête renvoit un mauvais résultat - L'absence de message d'erreur ne signifie pas pour autant que votre requête est juste d'un point de vue sémantique - Une solution : explorez les données avec des `SELECT` ... `WHERE` ??? Les messages d'erreurs permettent de détecter : - une erreur syntaxique - une erreur sémantique car le résultat n'est pas celui attendu Il est possible que, par hasard (ce qui peut être fréquent), qu'une mauvaise requête donne dans le contexte du TP le même résultat que la bonne requête. --- .header[ # .number[Semaine 2] Requêtes Simples et Avancées ## Étude de cas "Soins" ] ## Commencez par dessiner le schéma logique sur papier ! MEDECIN (
medecin_id
, rpss, nom, prenom, adresse, telephone, specialite)
PATIENT (
patient_id
, numsecu, genre, date_naissance, nom, prenom,
rattachement
,
medecin_referent
) - *rattachement* référence *PATIENT (patient_id)* - *medecin_referent* référence *MEDECIN (medecin_id)* VISITE (
medecin
,
patient
, date_visite
, prix) - *medecin* référence *MEDECIN (medecin_id)* - *patient* référence *PATIENT (patient_id)*
PRESCRIPTION (
ordonnance_id, medicament
,
medecin, patient, date_visite
, duree, posologie, modalites) - le triplet d'attributs *(medecin, patient, date_visite)* référence *VISITE (medecin, patient, date_visite)* ??? Il est **indispensable** de commencer par dessiner le schéma logique, ce qui aide énormément à l'écriture de requête correctes. - L'attribut *rattachement* de la relation *PATIENT* est renseigné quand une personne (appelée *ayant-droit*) bénéficie de l'assurance maladie, non pas en son nom propre, mais par sa relation avec une autre personne (appelée *assuré*) qui en bénéficie. Par exemple, les enfants sont rattachés à l'un de leurs parents, ce qui leur donne droit à l'assurance maladie. - L'attribut *medecin_referent* de la relation *PATIENT* désigne le médecin qu'un patient a choisi pour suivre son dossier médical. - Les attributs *duree* et *posologie* seront traités de manière très simple dans cet exemple : la durée désigne un nombre de jours de traitement et la posologie le nombre de prises par jour. - Plusieurs lignes de la relation *PRESCRIPTION* peuvent se regrouper en une ordonnance dont l'identifiant est *ordonnance_id* --- .header[ # Et maintenant ? ## Activités à venir ] ## Aujourd'hui - Posez vos questions sur l'activité [Découverte du SQL](https://formations.imt-atlantique.fr/bd_ihm/fr/sql/introduction/) - Continuez l'activité [Requêtes simples](https://formations.imt-atlantique.fr/bd_ihm/fr/sql/dml1/) - Niveau Avancé : [Requêtes avancées](https://formations.imt-atlantique.fr/bd_ihm/fr/sql/dml2/) ## Les prochaines semaines - Terminez l'activité [Requêtes simples](https://formations.imt-atlantique.fr/bd_ihm/fr/sql/dml1/) - Réalisez l'activité [Création et mise à jour](https://formations.imt-atlantique.fr/bd_ihm/fr/sql/ddl/) qui sera nécessaire pour faire le **projet** Vous devez continuer et finir ces activités les semaines à venir pour être prêt avant la **Semaine 5**.