L’intégrité des données fait référence à la validité, la cohérence et l’exactitude des données dans une base de données. On ne saurait trop insister sur le fait que le niveau de précision des informations extraites de la base de données est directement proportionnel au niveau d’intégrité des données imposé dans la base de données.
L’intégrité des données est l’un des aspects les plus importants du processus de conception de bases de données, et il ne doit pas être sous-estimé, négligé ou même partiellement négligé. Faire l’une de ces erreurs entraînerait un risque élevé d’erreurs indétectables
Il existe trois types d’intégrité des données et sont les suivants :
- Intégrité de l’entité
- Intégrité référentielle
- Intégrité du domaine
Intégrité de l’entité :
Il s’agit de “l’intégrité au niveau de la table” qui garantit que le champ qui identifie chaque enregistrement dans la table est unique et ne manque jamais sa valeur.
L’intégrité d’entité nécessite la spécification d’une clé primaire (PK – Primary Key) pour chaque table.
Remarques clés sur la clé primaire :
- Chaque table peut avoir zéro ou une clé primaire.
- La clé primaire ne doit pas être Null et si la clé primaire est une clé composite, assurez-vous que chaque composant ne doit pas être Null.
- Chaque clé primaire explicitement définie pour une table doit être associée à un index unique correspondant.
- Si vous ne créez pas d’index unique pour une clé primaire, une clé incomplète est définie pour la table, rendant la table inaccessible.
Contrainte unique:
Une contrainte unique est similaire à une contrainte de clé primaire qui applique également des valeurs uniques sur un individu ou un groupe de colonnes. Chaque table peut avoir zéro, une ou plusieurs contraintes uniques composées chacune d’une ou plusieurs colonnes. Les valeurs stockées dans la colonne unique ou la combinaison de colonnes doivent être uniques dans la table. La colonne de contrainte unique ne doit pas être Null.
Un index unique doit être créé sur les colonnes de la contrainte unique pour garantir l’unicité. La seule différence entre la contrainte de clé primaire et la contrainte unique est qu’une table ne peut avoir qu’une seule contrainte de clé primaire, mais peut avoir plusieurs contraintes uniques.
Index unique :
En plus de créer un index unique dans la colonne de clé primaire ou la colonne de contrainte unique (ce qui est obligatoire), vous pouvez créer autant d’index uniques que nécessaire sur toutes les autres colonnes de la table pour garantir l’unicité.
Le tableau suivant montre la différence entre l’index unique sur la colonne de contrainte de clé primaire/unique et une autre colonne autre que la colonne de contrainte primaire/unique.
Clé primaire ou colonne de contrainte unique | Colonne autre que la contrainte primaire/unique mais définie avec un index unique |
---|---|
Une table ne peut contenir qu’une seule contrainte de clé primaire et plusieurs contraintes uniques | Une table peut contenir plusieurs index uniques |
Impossible d’autoriser les valeurs NULL | Peut autoriser les valeurs NULL |
Prend en charge l’intégrité référentielle | Ne peut pas prendre en charge l’intégrité référentielle |
Intégrité référentielle :
Il s’agit d’une « intégrité au niveau de la relation » qui garantit que la relation entre une paire de tables est saine et qu’il y a une synchronisation entre les deux tables chaque fois que des données sont saisies, mises à jour ou supprimées.
L’intégrité référentielle est obtenue grâce à la clé étrangère.
Clé étrangère ( Foreign Key ) :
Une clé étrangère (FK – Foreign Key) est une colonne ou une combinaison de colonnes utilisée pour établir et appliquer un lien entre les données de deux tables.
Un lien est créé entre deux tables en ajoutant la ou les colonnes contenant les valeurs de clé primaire d’une table à l’autre table. Cette colonne devient une clé étrangère dans la deuxième table.
La table avec la clé primaire est appelée table parent et la table avec la clé étrangère est appelée table dépendante (ou table enfant ).
L’intégrité référentielle (RI) signifie que chaque ligne d’une table dépendante doit avoir une clé étrangère égale à une clé primaire dans la table parent.
Règles assurant l’RI :
Insert :
Lors de l’insertion d’une ligne avec une clé étrangère dans la table dépendante, DB2 vérifie les valeurs de la colonne de clé étrangère par rapport aux valeurs de la colonne de clé primaire dans la table parent. S’il existe une colonne de clé primaire correspondante, l’insertion est autorisée. S’il n’y a pas de colonne de clé primaire correspondante, l’insertion n’aura pas lieu.
Une nouvelle ligne peut être insérée dans la table parent tant que la valeur de clé primaire de la nouvelle ligne est unique.
Update :
Lors de la mise à jour des valeurs de clé étrangère dans la table dépendante, DB2 vérifie s’il existe ou non une clé primaire correspondante dans la table parent. S’il existe une clé primaire correspondante, la mise à jour est autorisée. S’il n’y a pas de clé primaire correspondante, la mise à jour n’est pas autorisée.
La clé primaire de la table parent ne peut pas être mise à jour si des lignes des tables dépendantes y font référence.
Delete :
La suppression d’une ligne avec une clé étrangère dans la table dépendante est autorisée.
Lors de la suppression d’une ligne avec une clé primaire dans la table parent, DB2 effectue l’une des actions suivantes comme indiqué lors de la définition de la table.
RESTRICT:
Interdit la suppression de la ligne de clé primaire si des clés étrangères se rapportent à cette ligne.
CASCADE:
Permet la suppression de la ligne de clé primaire et supprime également les lignes de clé étrangère qui s’y rapportent.
SET TO NULL:
Autorise la suppression de la ligne de clé primaire et, au lieu de supprimer toutes les lignes de clé étrangère associées, définit les colonnes de clé étrangère sur NULL.
Opération | Tableau enfant | Tableau parent |
---|---|---|
Insert | Autorisé si la valeur de la clé étrangère correspond à la valeur de la clé primaire de la table parent | Autorisé tant que la valeur de la clé primaire est unique |
Update | Autorisé si la valeur de la clé étrangère correspond à la valeur de la clé primaire de la table parent | Autorisé s’il n’y a pas de références de clé étrangère dans les tables enfants |
Delete | Autorisé | Selon l’action spécifiée lors de la définition de la table Restrict: non autorisé s’il existe des références de clé étrangère Cascade : autorisé et supprime les références de clé étrangère, le cas échéant, dans les tables enfants SET TO NULL : autorisé et une valeur Null sera définie dans les références de clé étrangère des tables enfants |
Intégrité du domaine :
Il s’agit de “l’intégrité au niveau du champ” qui garantit que la structure de chaque champ est saine, que les valeurs de chaque champ sont valides, cohérentes et précises, et que les champs du même type (tels que les champs Ville) sont définis de manière cohérente dans toute la base de données.
L’intégrité du domaine est appliquée à l’aide de :
- Type de données et longueur
- Les valeurs par défaut
- Valeurs NULL
- Vérifier la contrainte
Type de données et longueur :
En spécifiant le type de données et la longueur maximale de chaque colonne lors de la création d’une table, le SGBD s’assurera automatiquement que seul le type de données correct avec la longueur maximale autorisée est stocké dans cette colonne.
Les valeurs par défaut:
Lorsque des colonnes sont créées dans des tables, on peut leur attribuer une valeur par défaut qui sera utilisée lors de l’insertion ou du chargement des données qui ne fournissent pas de valeur explicite pour cette colonne. Chaque colonne ne peut avoir qu’une seule valeur par défaut. L’utilisateur peut fournir une valeur par défaut pour une colonne. S’il n’y a pas de valeur par défaut spécifique à l’utilisateur, DB2 attribue la valeur par défaut en fonction du type de données de cette colonne.
Type de données | COBOL PIC | COBOL USAGE | Par Défaut | Description |
---|---|---|---|---|
CHAR (n) | PIC X(n) | DISPLAY | Blancs | Données de caractères de longueur fixe (EBCDIC) |
VARCHAR (n) | PIC X(n) | DISPLAY | Vide / NULL | Données de caractères de longueur variable |
SMALLINT | PIC S9(4) | COMP ou COMP-4 | 0 | Entier de faible étendue |
INTEGER | PIC S9(9) | COMP ou COMP-4 | 0 | Entier habituel |
DECIMAL (p,s) | PIC S9(p)V9(s) | COMP-3 | 0 | Données d’un nombre décimal p : nb de décimal avant la virgule s : nb de décimal après la virgule |
DATE | PIC X(10) | DISPLAY | Date Actuelle | Date (aaaa-mm-jj) |
TIME | PIC X(8) | DISPLAY | Heure Actuelle | Heure (hh.mm.ss) |
TIMESTAMP | PIC X(26) | DISPLAY | Timestamp Actuelle | Date et Heure avec les microsecondes (aaaa-mm-jj-hh.mm.ss.mmmmmm) |
GRAPHIC | PIC G(n) | DISPLAY-1 | Blancs | Chaîne de caractères à deux octets de longueur fixe |
VARGRAPHIC | PIC G(n) | DISPLAY-1 | Vide / NULL | Chaîne de caractères à deux octets de longueur variable avec indicateur de longueur de chaîne à 2 octets |
FLOAT (n) | N/A | COMP-1 ou COMP-2 | 0 | Virgule flottante dans une simple ou double précision |
Valeurs NULL :
Certaines colonnes ne peuvent pas avoir une valeur significative dans chaque ligne. DB2 utilise un indicateur de valeur spécial, la valeur nulle, pour représenter une valeur inconnue ou manquante. Une valeur nulle est une valeur spéciale que DB2 interprète comme signifiant qu’aucune donnée n’est présente.
Si vous ne spécifiez rien d’autre, DB2 autorise n’importe quelle colonne à contenir des valeurs NULL. Les utilisateurs peuvent créer des lignes dans le tableau sans fournir de valeur pour la colonne.
L’utilisation de la clause NOT NULL vous permet d’interdire les valeurs NULL dans la colonne. Les clés primaires doivent être définies comme NOT NULL.
Voyons un exemple pour bien comprendre :
Identifiant Produit | Description Produit | Catégorie | Prix | Stock | Valeur Totale |
---|---|---|---|---|---|
001 | A | Sport | 70.00 | ||
002 | B | 5.00 | 20 | 100.00 | |
003 | C | Sport | 6.00 | 100 | 600.00 |
004 | D | Composants | 23.50 | 16 | 376.00 |
005 | E | Outils | 300.00 | ||
006 | F | 7.45 | 1 | 7.45 |
Si une valeur nulle est utilisée dans une expression mathématique, cette expression sera évaluée à Null. Dans la figure Produits, la Valeur Totale est dérivée de l’expression mathématique “[Prix] * [Stock].”
Notez cependant que la valeur du champ Valeur Totale est manquante là où la valeur Stock est Null, ce qui entraîne également une valeur nulle pour le champ Valeur Totale. C’est logiquement, si le nombre est inconnu, la valeur sera nécessairement inconnue.
De plus, une grave erreur non détectée se produit si toutes les valeurs du champ Valeur Totale sont ensuite additionnées : un total inexact. La seule façon d’obtenir un total précis est de fournir une valeur pour les entrées dans le champ Stock qui sont actuellement nulles.
Les fonctions d’agrégation telles que COUNT, SUM, AVG, MAX et MIN ne gèrent pas NULL de la même manière que les fonctions et opérateurs ordinaires. Au lieu de renvoyer NULL, ils ne prennent en compte que les champs non NULL lors du calcul du résultat.
Par exemple , Sum(Stock ) renvoie la valeur 137 (20+10+16+1). Si les six lignes avaient été additionnées, le résultat aurait été NULL.
Il existe une exception à cette règle : COUNT(*) renvoie le nombre de toutes les lignes, même les lignes dont les champs sont NULL. Mais COUNT(Name) se comporte comme les autres fonctions d’agrégation en ce sens qu’il ne compte que les lignes où le champ spécifié n’est pas NULL. COUNT(*) et COUNT(Name) ne renvoient jamais NULL. S’il n’y a pas de lignes dans la sortie, les deux fonctions renvoient 0. COUNT(Name) renvoie également 0 si tous les champs Name de la sortie sont NULL.
La figure suivante montre les résultats d’une requête récapitulative qui compte le nombre total d’occurrences de chaque catégorie dans la table PRODUITS présentée ci-dessus. La valeur du nombre total d’occurrences dans la requête récapitulative est le résultat de l’expression de la fonction “Count([Total Occurrences]).” Notez que la requête récapitulative affiche 0 occurrences d’une catégorie non spécifiée, ce qui implique qu’une catégorie a été attribuée à chaque produit. Ces informations sont clairement inexactes car il y a deux produits dans la table PRODUITS qui n’ont pas été assignés à une catégorie.
Catégorie | Total Occurrences |
---|---|
0 | |
Sport | 2 |
Outils | 1 |
Composants | 1 |
Vérifier la contrainte :
Une contrainte de vérification est une règle qui spécifie les valeurs autorisées dans une ou plusieurs colonnes de chaque ligne d’une table. La contrainte de vérification applique les règles métier directement dans la base de données sans nécessiter de logique d’application supplémentaire. Cela peut être défini lors de la définition de la colonne.