Thématiques principales

dimanche 4 février 2018

SGBD-R : Introduction

Introduction

Le développement de systèmes logiciels fait intervenir de nombreux composants et concepts.  Ces éléments sont organisés généralement a l’aide d’architectures conçues afin de répondre à différents types besoins comme capturer les concepts métier au travers d’algorithmes, ou définir des IHM afin de rendre convivial l'utilisation de l’application. A l‘opposé des IHM, dans ces architectures (que nous détaillerons dans un autre article), nous trouverons de façon quasi systématique un service de persistance des données ou base de données (SGBD).

En effet, l’utilisation de SGBD dans les systèmes logiciel actuel est devenu quasi incontournable. Leur rôle qui dépasse aujourd’hui le simple rôle de sauvegardes s'étend sur des fonctions telles que la redondance ou la gestion décentralisé des données afin de fournir des services à haute disponibilité . A la base très structuré pour des besoins de cohérence dans les systèmes de gestion de base de données relationnelles,  l'émergence du nosql a fait apparaître des type de base plus rapide et capable d'absorber et restituer de très grande quantité de données.

Les approche NoSQL sont tres interessante mais seront le propos la aussi d’un autre article, ainsi, dans celui ci je vous propose de revenir sur les SGBD-R et de parcourir leur utilisations,  leur avantage et leur inconvénients et ce qui justifie encore largement leur emplois [1].

Les SGBD-R ou systeme de gestion de bases de données relationnelles sont des outils de stockages de l’information contenant deux composants

  • un outil de gestion
  • un base de données relationnelle

Logiciel de gestion

L’outils de gestion est un outil offrant un service transactionnel d'accès aux données via un langage de requetes (SQL étant le plus commun et connu) des services de gestion des utilisateurs, des droits (en lecture et/ou écriture) , de la configuration (adresse d’acces, port de connexion, config de cache, etc.). Bien sur l’architecture du logiciel de gestion de la base de données comporte divers composants comme un catalogue système ou un gestionnaire de reprise pour la gérer les pannes et l'intégrité des données mais ces éléments peuvent variés d’une SGBDR a un autre (pour entrer dans le détails il est préférable de consulter les documentation officielle comme celle de postgres [2], Oracle [3], MySQL [4] ou SqlServer [5])

La partie logiciel de gestion n’est pas la partie la plus intéressante (enfin sauf pour les spécialistes a spécifique à ces bases), ce qu’il faut par contre en retenir est sa composante transactionnelle dont l’objectif est de garantir l'intégrité des données (en terme de concurrence d'accès, etc.) En ces termes, les transactions sont alors dites ACID :

  • Atomique : une transaction a la fois
  • Coherent: une transaction ne doit permettre la corruption de la base de donnée ou violer des contraintes d'intégrités
  • Isolation : les modifications apportées par une transaction ne sont accessible qu'après validation de la transaction
  • Durabilité : les modifications apportées aux données doivent, après validation, etre recuperable meme apres une panne.

La base de données

Caché derrière le logiciel de gestion, la partie base de données est le conteneur qui va structurer l’ensemble des informations. Pour cela, la base de donnée va s’appuyer sur le modèle relationnel qui consiste en la définition et la manipulation de Relations constituées d’Attributs. Associé aux Relations seront construits des tuples (ou enregistrement) assimilables a des instances des Relations pour lesquelles pour chaques Attributs on disposera d’une valeur. Classiquement on représente les relations, attributs et tuples par un tableau.

Ainsi par exemple on peut définir la Relation Personne constitué des Attributs Nom et Prenom pour lesquelles on va definir les tuples {Einstein, Albert} et {Turing, Alan} représenté comme suit:

Personne
Nom
Prenom

Einstein
Albert

Turing
Alan

Bien sur on aura un probleme si deux personnes ont les meme Nom et Prenom, c’est a dire les memes attributs, on va donc utiliser une clef primaire afin de permettre la différenciation. Cette clef primaire nommé id par convention, est définie comme unique (souvent auto-incrémenté), ceci est une contrainte d'intégrité

Personne
Id
Nom
Prenom

1
Einstein
Albert

2
Turing
Alan

Les contraintes d’intégrités

Des contraintes d'intégrations [6] il en existe 4 types. Nous venons d’en voir une, la contrainte structurelle, permettant un fonctionnement nominal de la base. Ensuite il est possible de définir des contraintes fonctionnelles comme une limite sur une valeur (comme un âge) permettant une capture plus fine du domaine métier que représente la base de données (nous reviendrons sur ce point plus précisément par la suite) Ensuite, il y aura des contraintes intra-relation, comme d’imposer la non nullité de l'attribut Nom dans la relation Personne. Ceci est une contrainte qui pourrait être vu comme fonctionnelle effectivement elle permet à l’enregistrement d’avoir du sens pour le domaine métier mais elle permet aussi de garantir un besoin technique (comme le calcule d’un jointure que nous verrons plus tard)

Enfin dernier type de contrainte, la contrainte inter-relation, qui va garantir une certaine coherence des données entre des relations différentes. Par exemple imaginons qu’il existe en plus de notre relation Personne, une relation adresse contenant les attributs Rue, CodePostal et Ville. Une contrainte pourrait définir que pour tout enregistrement Personne, il existe au moins une adresse connue.

Pour ce type de contrainte, il suffira par exemple de définir une clef étrangère dans la relation personne qui sera non null et dont la valeur sera la clef primaire de la relation Adresse:

Personne
IdPersonne
Nom
Prenom
IdAdresse

1
Einstein
Albert
1

2
Turing
Alan
2

Adresse
IdAdresse
Rue
CodePostal
Ville

1
xxx
59000
Lille

2
yyy
59500
Douai

Bien sur si cette façon de faire permet de répondre a la contrainte inter-relation, elle ne permet de resoudre le probleme du au moins une adresse, signifiant que potentiellement, une Personne peut avoir plusieur adresse. Ici c’est impossible.

Pour resoudre ce probleme, il va falloir inverser la logique, c’est a dire de référencer la Personne aupres des adresses ainsi on va pouvoir avoir plusieurs adresse référençant la même personne:

Personne
IdPersonne
Nom
Prenom

1
Einstein
Albert

2
Turing
Alan

Adresse
IdPersonne
IdAdresse
Rue
CodePostal
Ville

1
1
xxx
59000
Lille

2
2
yyy
59500
Douai

2
3
yyy
80000
Amiens

Bien sûr ceci ne résout pas un dernier potentiel problème qu’est : et si une adresse correspond a plusieurs personnes? (dans le cas d’une famille par exemple). Alors il est vrai que le plus évident est alors de dupliquer les adresses tout simplement comme elles auront des Id differentes mais si ils habitent au même endroit, a priori, cela ne sera pas compliqué de retrouver les enregistrements commun… Ceci est probablement l’approche la plus simple dans un cas comme celui la mais, on duplique des données et si les enregistrements ne sont pas renseigné exactement correctement, alors il y aura peut être des problèmes.

Pour resoudre ce probleme, on va créer une nouvelle relation dont la vocation sera de réifier l’association n-n que l’on cherche a creer (jusque la en fait sans le dire on examinait comment créer des associations 1-n et n-1 entre les relations Personne et Adresse) Ainsi on va créer une troisième relation que l’on nommera AssPersonneAdresse contenant juste les Id des différentes :

Personne
IdPersonne
Nom
Prenom

1
Einstein
Albert

2
Turing
Alan

Adresse
IdAdresse
Rue
CodePostal
Ville

1
xxx
59000
Lille

2
yyy
59500
Douai

3
yyy
80000
Amiens

AssPersonneAdresse
IdPersonne
IdAdresse

1
1

2
2

2
3

Par les questions que nous venons de traiter, on se rend facilement compte que créer une base de données nécessite une certaines expertise et de la méthode. Pour cela, on abordera la notion de normalisation de base de données dans un article prochain

Références

[1] https://dzone.com/articles/selecting-an-application-database?edition=305102&utm_source=Daily%20Digest&utm_medium=email&utm_campaign=dd%202017-06-16
[2] https://www.postgresql.org/
[3] https://docs.oracle.com/en/database/oracle/oracle-database/index.html
[4] https://www.mysql.com/fr/
[5] https://www.microsoft.com/fr-fr/sql-server/sql-server-2017
[6] http://www-inf.int-evry.fr/cours/BD/MSCurriculum/FRENCH/PDF/CI.pdf

Aucun commentaire:

Enregistrer un commentaire