cours v1

Transcription

cours v1
Bases de données : étude d'un moteur de Blog
Présentation de la démarche
Ce cours est pour des élèves de BTS IRIS. L'objectif final est de pouvoir lire une structure de base
de données pour pouvoir en extraire des informations par des requêtes.
On va étudier le moteur de blog Dotclear (v1.2.7) qui fonctionne avec PHP et MySQL
téléchargeable ici.
Pour cela, on va faire une analyse à priori de la base de données nécessaire pour une telle
application :
• définition du cahier des charges (point de vue utilisateur)
• schéma conceptuel
• schéma logique relationnel
Ensuite, nous étudierons à posteriori la base de données de Dotclear et analyserons les différences
avec notre schéma logique.
Cahier des charges
Ce cahier des charges est à définir collectivement au cours d'un TD.
Un blog est un type de site web composé d'articles (posts) accessibles chacun séparément par une
URL (Unique Ressource Location).
Chaque post a un titre, une date d'édition, une date de publication, un auteur, un corps. Les articles
sont référencés dans des catégories (il faudra étudier le besoin d'avoir une ou plusieurs catégories
par article, cela interviendra dans les différents schémas). Le clic sur une catégorie permet de lister
tous les articles de cette catégorie.
Plusieurs personnes peuvent publier sur le même blog avec des permissions différentes
(administrateur, rédacteur), L'identification d'un utilisateur se fera par login et mot de passe.
Tout lecteur peut réagir à un article en ajoutant un commentaire (composé de titre, date, auteur,
corps, adresse du site de l'auteur, mail de l'auteur).
Un lecteur intéressé par un article de votre blog peut le citer sur son blog et indiquer ce lien sur
votre blog (comme ça les autres lecteurs peuvent aller voir les sites qui parlent de ce post) : c'est un
trackback (composé de titre, date, auteur, corps, URL de l'article distant).
Enfin, on souhaite pouvoir avoir sur notre blog une liste de liens vers les sites que l'on aime et que
l'on veut faire partager à nos lecteurs (ça s'appelle un blogroll).
Quelques questions n'ont pas encore de réponses :
Faut-il gérer plusieurs blogs dans la même base de données ?
Plusieurs personnes (enregistrées) peuvent-elle contribuer au même article ? (= un article peut-il
avoir plusieurs auteurs ?)
Un article peut-il appartenir à plusieurs catégories ?
Il faudra étudier attentivement ces questions lors de la conception de nos schémas.
Schéma conceptuel
Vocabulaire
Ce schéma met en relation les différentes entités identifiées. Il est indépendant de tout système
informatique et prévu pour traduire le cahier des charges dans un formalisme graphique
compréhensible par le client et le développeur.
Une entité est définie comme un objet clairement identifiable qui peut être concret (livre, personne,
…) ou abstrait (compte en banque). Elle est décrite par des attributs (caractéristiques ou propriétés)
parmi lesquelles on définit un identifiant composé d'un ou plusieurs attributs (qui lèvera toute
ambiguïté sur les différents enregistrements) par exemple, un numéro INSEE identifie de manière
unique une personne française.
Une relation représente les liens présents entre les différentes entités. Les relations n'ont pas
d'existence propre. Une relation peut concerner une ou plusieurs entités (s'il n'y a qu'une entité, la
relation est dite réflexive par exemple la relation Mariage sur une table Personne est réflexive). Le
nombre d'entité entrant dans une relation s'appelle la dimension de cette relation. (une relation de
dimension deux est binaire, de dimension 3 est ternaire, …)
On appelle cardinalité le nombre de participation d'une entité à une relation.
Si l'on considère la relation entre une facture et un produit, les différentes cardinalités correspondent
au cas suivant :
1 – 1 : On ne peut indiquer qu'un produit par facture (pas très pratique), on ne peut plus facturer le
produit après la première facture (toujours pas pratique)
1 – N : On peut avoir plusieurs lignes par facture, mais on est toujours limiter à une facture par
produit ou inversement
M – N : On a plusieurs lignes par facture et un produit peut être facturé plusieurs fois.
Démarche pour construire un schéma conceptuel
Déterminer la liste des entités
Pour toutes les entités, définir la liste des attributs puis déterminer l'identifiant
Déterminer les relations entre les entités
Pour chaque relation, définir les attributs propres à la relation (date, prix, … par exemple),
vérifier la dimension et définir la cardinalité.
e) Valider le schéma auprès des utilisateurs
C'est cette démarche que nous allons suivre pour construire notre schéma. Nous auto-validerons
notre schéma puisque nous sommes les utilisateurs de blogs…
Sauf exception, un schéma conceptuel ne doit pas d'information redondante (par exemple, attributs
calculables à partir d'autres attributs dans la base, transitivité, …).
a)
b)
c)
d)
Un même cahier des charges peut conduire à plusieurs schémas conceptuels différents.
Application pour le blog
Dans un premier temps, on répond NON aux 3 questions qui n'ont pas de réponse.
Liste des entités
Post, categorie, lien, utilisateur, commentaire, trackback
Liste des attributs des entités
A partir du cahier des charges, voici un premier jet de liste des entités :
post (titre, date_edit, date_pub, corps, auteur, categorie)
categorie (nom, URL)
lien (nom, URL)
utilisateur (login, mdp, permission)
commentaire (titre, date, auteur, corps, URL_site, mail_auteur)
trackback (titre, date, auteur, corps, URL_distant)
Quels sont les identifiants possibles ? Pour chaque entité, il va falloir rajouter un attribut qui
contiendra un entier qu'il faudra incrémenter à chaque enregistrement et qui assurera l'unicité des
enregistrements.
On peut considérer que le nom du lien peut être utilisé comme identifiant, (on ne rajoute pas
d'attribut à cette entité)
La liste attributs des entités est donc comme suit :
post (id_post, titre, date_edit, date_pub, corps, auteur, categorie)
categorie (id_cat, nom, URL)
lien (nom, URL)
utilisateur (id_user, login, mdp, permission)
commentaire (id_comm, titre, date, auteur, corps, URL_site, mail_auteur)
trackback (id_tb, titre, date, auteur, corps, URL_dist)
Une question se pose : l'auteur et la catégorie d'un post sont-ils des attributs du post ou des relation
entre les entités ?
Les relations entre entités
lien
categorie
post
0-N
id_cat nom
URL
appartient à
1-1
1-1
utilisateur
id_user
login mdp
permission
nom URL
id_post
titre
date_edit
date_pub
corps
auteur
categorie
0-N
cite
0-N
écrit
1-1
trackback
réagit à
0-N
id_tb titre
date corps
auteur
URL_dist
1-1
commentaire
id_comm titre
date corps
auteur
URL_site
mail_auteur
On constate que la table lien n'est en relation avec aucune autre table (ce qui n'est pas étonnant
puisque c'est un module indépendant de notre blog)
Les noms des relations sont discutables, l'essentiel est dans le repérage de ces relations ainsi que des
attributs qui en font parti.
On, constate que l'attribut categorie de post correspond plus à la relation appartient à qu'à l'entité.
De même, l'attribut auteur correspond à la relation écrit. (l'auteur d'un post est l'utilisateur qui l'a
écrit). On peut aussi se poser des questions sur la date d'un post, commentaire ou trackback,
dépend-elle de l'entité ou de la relation ? On aurait même pu définir la date comme une entité
indépendante. Vous avez ci-après les représentations de la relation réagit à pour ces deux cas de
figure.
post
id_post
titre
date_edit
date_pub
corps
réagit à
date
commentaire
post
id_comm titre
corps auteur
URL_site
mail_auteur
id_post
titre
date_edit
date_pub
corps
réagit à
date
commentaire
id_comm
titre corps
auteur
URL_site
mail_auteur
Ces deux schémas sont envisageables, j'ai choisi de laisser la date comme un attribut des entités,
cela peut être discutable, mais ne change pas grand chose pour la suite des opérations.
Il nous faut donc revoir notre liste des attributs des entités comme suit :
post (id_post, titre, date_edit, date_pub, corps)
categorie (id_cat, nom, URL)
lien (nom, URL)
utilisateur (id_user, login, mdp, permission)
commentaire (id_comm, titre, date, auteur, corps, URL_site, mail_auteur)
trackback (id_tb, titre, date, auteur, corps, URL_dist)
relations : attributs, dimensions, cardinalités
Toutes les relations sont dépourvues d'attribut propre.
cite : relie trackback à post, elle est binaire et de cardinalité 1 – N, un post peut avoir plusieurs
trackbacks.
réagit à : relie commentaire à post, elle est binaire et de cardinalité 1 – N, un post peut avoir
plusieurs commentaires.
appartient à : relie post à categorie, elle est binaire et de cardinalité 1 – N, une categorie peut
contenir plusieurs posts. Elle devient de cardinalité M – N, si l'on souhaite qu'un post puisse
appartenir à plusieurs catégories.
écrit : relie post à utilisateur, elle est binaire et de cardinalité 1 – N, un utilisateur peut écrire
plusieurs posts. Elle devient de cardinalité M – N, si l'on souhaite qu'un post puisse avoir plusieurs
auteurs.
Schéma logique relationnel
Pour l'instant, on a fait un schéma joli, intéressant, qui permet de bien comprendre les interactions
entité–relation. Cela n'est pas encore un schéma logique de base de données. Le schéma logique va
nous définir les tables que nous allons trouver dans notre base.
Passage du schéma conceptuel au schéma relationnel
Les règles simples pour passer du schéma conceptuel au schéma logique sont les suivantes.
Entités
Une entité est traduite en une table dont :
• le nom est le nom de l'entité,
• les colonnes sont les attributs de l'entité,
• la clé est l'identifiant de l'entité.
On passe donc de (entité, attribut, identifiant) à (table, colonne, clé primaire).
Si une table n'a qu'une colonne, elle est supprimée (la colonne de vient un attribut d'une des entités
avec lesquelles elle est en relation).
Relations
Une relation de cardinalité M – N est traduite par une table dont :
• le nom est le nom de la relation,
• les clés primaires des entités qui participent à la relation sont reportées comme colonnes de
la table,
• les attributs spécifiques de la relation sont les autres colonnes de la table.
Une relation de cardinalité 1 – N est traduite par :
• Un report de clé de la table côté N dans la table côté 1. (on rajoute une (ou plusieurs)
colonne(s) dans la table côté 1 correspondant à la clé primaire de la table côté N).
• Une table spécifique lorsque la relation a des attributs propres. La clé de la tables est
l'identifiant de l'entité côté 1.
Une relation de cardinalité 1 – 1 est généralement traduite par une fusion des tables qu'elle relie
(quand c'est une bijection). Dans certains cas particuliers, on peut préférer avoir une table pour la
relation ou faire un report de colonne comme pour les autres cardinalités.