4D v16.3

Types et analyse des liens

Accueil

 
4D v16.3
Types et analyse des liens

Types et analyse des liens  


 

 

Le type de lien le plus commun et le plus utilisé est le lien entre une table 1 et une table N —  appelé lien N vers 1. Cependant vous pouvez aussi créer des liens N vers N et des liens 1 vers 1. En outre, tout lien peut être automatique ou manuel.

Un lien peut être automatique ou manuel.

Dans un lien automatique, quand un enregistrement dans une table liée est rendu courant, 4D sélectionne le ou les enregistrements correspondants. Le ou les enregistrements spécifié(s) peuvent alors être visualisés, imprimés, modifiés ou utilisés dans des recherches ou des tris. Aucune programmation n’est nécessaire.

Dans un lien manuel, vous pouvez exercer un contrôle sur le chargement en mémoire du ou des enregistrements correspondants par 4D. Pour cela, il est nécessaire d’utiliser des méthodes. Pour plus d’informations sur les méthodes qui contrôlent les tables liées, reportez-vous au manuel Langage de 4D.

Vous pouvez utiliser des liens manuels dans le cas où vous souhaitez optimiser les performances d’applications spécifiques qui n’ont pas besoin de charger tous les enregistrements correspondants en même temps. Par exemple, si votre structure comporte plus de trois tables liées, vous pouvez souhaiter contrôler avec précision le chargement des enregistrements liés. Vous pouvez aussi utiliser une relation manuelle si vous souhaitez relier deux tables avec deux liens séparés. Un seul lien automatique peut exister entre deux tables, alors que le nombre de liens manuels entre deux tables n’est pas limité.

Lorsque vous tracez un lien entre deux tables, la table contenant le champ clé primaire de la relation est appelée la Table 1 et la table contenant le champ clé d’appel de la relation est appelée la Table N. Ces tables sont appelées table 1 et table N car un enregistrement de la table 1 est relié à N enregistrements de la table N et inversement. Ce type de relation est appelé une relation de N vers 1.

Dans la relation entre les employés et les sociétés, la table [Sociétés] est la table 1 et la table [Employés] est la table N. L’enregistrement d’une société est relié à plusieurs employés (tous les employés de cette société) et plusieurs employés sont reliés à la même société (la société pour laquelle ils travaillent). Par exemple, il peut y avoir un enregistrement qui se rapporte à la société Acme dans la table [Sociétés] et plusieurs enregistrements d’employés de la société Acme dans la table [Employés].

Lorsqu’un enregistrement de la table [Employés] devient l’enregistrement courant, 4D charge l’enregistrement correspondant de la table [Sociétés]. Si certains champs de la table [Sociétés] ont été inclus, les valeurs de ces champs sont automatiquement affichées.
L’écran ci-dessous illustre comment le nom d’une société dans un enregistrement de la table [Employés] désigne un enregistrement de la table [Sociétés] et permet d’afficher des données relatives à cette société (son adresse) :

Inversement, lorsqu’un enregistrement de la table [Sociétés] devient l’enregistrement courant, 4D crée une sélection d’enregistrements dans la table [Employés] et les affiche dans le formulaire. Seuls les enregistrements affichés dans le formulaire sont chargés en mémoire.

L’écran suivant illustre comment le nom d’une société d’un enregistrement de la table [Sociétés] désigne plusieurs enregistrements de la table [Employés], de manière à ce que l’enregistrement de la société affiche une liste des employés de cette société.

La distinction entre la table 1 et la table N est spécifique à une relation particulière. Une même table peut être la table 1 dans une relation et la table N dans une autre. Dans une relation, une table ne peut comporter qu’une seule clé primaire, mais peut comporter plusieurs clés d’appel. 

Par exemple, supposons que vous décidiez d’envoyer des échantillons à toutes les personnes de la table [Employés]. Vous ajoutez une table [Affranchissements] qui contient les pays et les tarifs d’affranchissement par pays. L’utilisation de cette structure vous permet d’imprimer des étiquettes contenant les adresses de chacun des employés ainsi que le tarif d’affranchissement pour poster les paquets. L'image ci-dessous illustre l’ajout de cette table supplémentaire.

Le champ Pays de la table [Affranchissements] est sa clé primaire unique, et donc la table [Affranchissements] est la table 1. Le champ Pays de la table [Sociétés] est le champ clé d’appel dans cette relation. Comme ce champ est la clé d’appel, il peut contenir des valeurs non-uniques. En effet, un même pays peut apparaître plusieurs fois, dans le cas des entreprises situées dans le même pays. La table [Sociétés] est donc la table N pour cette relation avec la table [Affranchissements].

Une table est une table 1 ou N suivant la relation qui la lie à une autre table. La table [Sociétés] est la table N dans la relation qui la lie à la table [Affranchissements] ; en revanche elle est la table 1 dans la relation qui la lie à la table [Employés].

Les liens 1 vers 1 sont rarement utilisés car les tables qui sont liées par ce type de lien peuvent être combinées dans une table unique. Par exemple, supposons qu’une base Employés stocke des informations professionnelles sur chacun des employés dans une table [Données Employés] et des informations personnelles dans une table [Données personnelles]. Le lien entre les deux tables est un lien 1 vers 1 car à chacun des enregistrements de la table [Données Employés] correspond un enregistrement de la table [Données personnelles] et inversement. Bien que cette structure possède une organisation claire, les données de cette base pourraient être tout aussi bien organisées dans une seule table.

Les liens 1 vers 1 peuvent toutefois être utiles dans les cas suivants :

  • Votre base comporte des données de type Texte, Image ou BLOB de grande taille. Dans ce cas, l’exécution de la base peut être ralentie lorsque vous changez d’enregistrement courant, du fait du chargement en mémoire des données. En plaçant les textes, images ou BLOBs dans une autre table, vous pouvez ne charger en mémoire que les données strictement nécessaires et optimiser ainsi le fonctionnement de la base.
  • Votre base comporte un très grand nombre de champs, et vous souhaitez les dissocier en groupes logiques. Dans ce cas, des tables séparées peuvent rendre la base plus rapide et plus facile à utiliser.
  • Vous souhaitez protéger l’accès à certains champs. Si vous utilisez des tables séparées, vous pouvez assigner des privilèges et restrictions d’utilisation différents pour chaque table.

Vous pouvez souhaiter lier certains enregistrements d’une table à d’autres enregistrements d’une autre table. Ce type de lien est appelé N vers N.

Un exemple de ce type de relation pourrait être une base stockant des données sur un groupe d’étudiants et les cours auxquels ils sont inscrits. Supposons que cette base possède deux tables [Etudiants] et [Cours]. Un étudiant peut être inscrit à plusieurs cours, et de la même manière un cours peut être suivi par plusieurs étudiants. Vous souhaitez pouvoir savoir à quels cours un étudiant est supposé participer et quels sont les étudiants qui suivent un cours particulier.

Voici d’autres exemples de ce type de relation :

  • [Fournisseurs] et [Produits] : Chaque fournisseur propose différents produits et chaque produit peut avoir différents fournisseurs.
  • [Employés] et [Comptes] : Chaque employé travaille sur différents comptes et chaque compte peut être utilisé par différents employés.
  • [Films] et [Acteurs] : Chaque film réunit différents acteurs et chaque acteur peut avoir participé à différents films.

Vous pouvez utiliser 4D pour créer automatiquement des liens N vers N. Le principe consiste à créer une table intermédiaire qui est liée à d’autres tables par des liens 1 vers N. Vous pouvez alors créer des formulaires de saisie et de sortie qui manipulent toutes les données nécessaires. Cette section décrit l’utilisation des liens automatiques pour la réalisation d’un lien N vers N.

L’exemple ci-dessous représente la structure de la base évoquée plus haut, constituée de trois tables : [Etudiants], [Cours] et [Inscriptions]. La structure de cette base de données est utilisée tout au long de cette section pour illustrer le fonctionnement des liens N vers N.

La table [Etudiants] est une table 1. Elle contient un enregistrement pour chaque étudiant constitué de son nom, de son prénom et de son niveau. Son numéro d’étudiant l’identifie de manière unique.
La table [Cours] est aussi une table 1. Elle contient un enregistrement pour chaque cours, constitué du titre du cours, du sujet ainsi que du nom de l’enseignant. Le titre du cours l’identifie de manière unique
Une table intermédiaire, la table [Inscriptions], est la table N pour les deux autres tables. Elle contient des enregistrements se rapportant aux étudiants et aux cours auxquels ils sont associés. Les formulaires de cette table sont utilisés pour la saisie et l’affichage des données des deux autres tables.
L’utilisation de trois tables permet un stockage des données efficace. L’enregistrement complet d’un étudiant n’est stocké qu’une seule fois. Chaque cours possède son enregistrement qui, lui aussi, n’est stocké qu’une fois. Les enregistrements qui lient les étudiants aux cours sont stockés une fois par inscription. Toutes les combinaisons d’informations sont cependant disponibles sous toutes les formes.

L’utilisation d’une table intermédiaire, dans notre exemple la table [Inscription], a pour but de permettre l’affichage et la saisie des données des deux autres tables (un étudiant et un cours). Les enregistrements de cette table ne contiennent que les deux données qui caractérisent ce lien : le numéro de l’étudiant et le titre du cours. Voici un enregistrement de la table [Inscription] en cours de saisie.

Cet enregistrement indique que l’étudiant Gilbert Grandrieux est inscrit à un cours de Géopolitique. Il combine des informations des deux autres tables.

Un enregistrement similaire existe pour chacun des cours auxquels l’étudiant est inscrit. Seuls les champs Numéro et Titre du cours sont stockés dans la table [Inscriptions]. Chaque enregistrement définit l’inscription d’un étudiant particulier à un cours spécifique.

Note : Lorsqu’un enregistrement de la table [Inscriptions] est chargé (comme c’est le cas en création d’enregistrement), une sélection d’enregistrements est automatiquement créée dans les tables liées. La sélection est constituée des enregistrements correspondants des cours et des étudiants. Si vous ouvrez chacune des autres tables vous constaterez que seul un enregistrement est affiché.

Le formulaire de saisie pour cet enregistrement est représenté ci-dessous. Il est à noter qu’il contient des champs des tables [Etudiants] et [Cours].

Les données ne sont saisissables que dans les champs Numéro d’étudiant et Titre du cours. Quand le numéro de l’étudiant est saisi, 4D trouve les informations liées à cet étudiant dans la table [Etudiants] et les affiche dans les champs Nom, Prénom et Diplôme. De la même manière, quand le titre d’un cours est saisi, 4D trouve les informations correspondantes dans la table [Cours] et les affiche dans le formulaire de saisie.

Vous pouvez afficher des informations de ces trois tables en utilisant des sous-formulaires inclus. Vous pouvez afficher tous les cours auxquels un étudiant est inscrit dans l’enregistrement de cet étudiant. Vous pouvez aussi afficher la liste de tous les étudiants inscrits à un cours dans l’enregistrement de ce cours.

Pour afficher la liste des cours dans l’enregistrement d’un étudiant, vous utilisez un sous-formulaire. Pour plus d’informations sur la création de sous-formulaires, reportez-vous au paragraphe Créer et définir un sous-formulaire.

L’enregistrement ci-dessus appartient à la table [Etudiants]. Les informations relatives à l’enregistrement de l’étudiant sont situées en haut de cet enregistrement et les informations sur les deux cours auxquels il est inscrit sont extraites de la table [Inscriptions], dans laquelle les informations qui concernent les inscriptions sont stockées.

Il est à noter que le formulaire inclus se rapporte à la table [Inscriptions] et non pas à la table [Cours]. La table [Inscriptions] contient les enregistrements qui lient l’enregistrement de l’étudiant aux enregistrements des cours. Le formulaire contient le champ Sujet de la table [Cours]. Du fait de la relation qui existe entre les tables [Inscriptions] et [Cours], 4D peut afficher le titre du cours automatiquement.

Cet enregistrement affiche la liste des étudiants inscrits à un cours :


C’est un enregistrement de la table [Cours]. Il permet de visualiser des informations sur le cours ainsi que la liste des étudiants inscrits à ce cours. Cette information relative aux étudiants est aussi extraite de la table [Inscriptions] car cette table contient les enregistrements qui lient les étudiants aux cours auxquels ils sont inscrits.

Dans les exemples ci-dessus, vous pouvez saisir des données dans tous les champs affichés. Par exemple, pour saisir l’enregistrement d’un nouvel étudiant, placez le curseur de la souris dans le dernier enregistrement puis appuyez sur les touches Ctrl+Maj+/ (sous Windows) ou Commande+Maj+/ (sous Mac OS) pour créer un nouvel enregistrement (cette combinaison de touches par défaut peut être modifiée dans les Propriétés de la base, cf. paragraphe ). Lorsque vous saisissez un titre de cours, le reste de l’information est automatiquement saisi dans l’enregistrement.

Les liens que vous établissez dans une base de données jouent un rôle important dans le fonctionnement de la base en contrôlant le flux de données entre les différentes tables.

Si un enregistrement lié de manière automatique est chargé dans un formulaire de saisie, le ou les autres enregistrements de la table liée correspondante seront eux aussi chargés. Si le lien ne fait référence qu’à un seul enregistrement dans la table liée, cet enregistrement sera chargé. Si un lien fait référence à plusieurs enregistrements, une nouvelle sélection courante d’enregistrements sera créée pour cette table et le premier de ces enregistrements sera chargé. L’enregistrement qui est chargé est appelé enregistrement courant de la table.

Dans les exemples de ce chapitre, des liens ont été établis entre trois tables au maximum. En réalité, les liens sont souvent créés entre de nombreuses tables et sont activés les uns après les autres, comme dans une chaîne. A chaque fois qu’un lien est activé, 4D crée une sélection d’enregistrements dans la table liée et charge un enregistrement.
Cet enregistrement lié devient l’enregistrement courant pour la table et — si cette table est elle aussi liée automatiquement — 4D crée une nouvelle sélection dans la table suivante de la chaîne, etc.

Si les liens des tables n’ont pas été paramétrés correctement, la circulation des informations peut devenir désordonnée ou même corrompue. Les cas suivants illustrent des structures relationnelles pour lesquelles une attention toute particulière est requise.

Une relation circulaire est un ensemble de liens qui sont paramétrés d’une telle manière que le transfert des données forme une boucle infinie. La figure ci-dessous représente une relation circulaire dans laquelle la table [Employés] est liée à la table [Sociétés], qui elle-même est liée à la table [Courtiers], elle-même liée à la table [Employés].

 

Quand un enregistrement de la table [Employés] est chargé, 4D charge l’enregistrement correspondant de la table [Sociétés]. Cet enregistrement devient l’enregistrement courant de la table [Sociétés] qui à son tour commande le chargement de l’enregistrement lié de la table [Courtiers]. 

Si le lien était autorisé à se propager, les enregistrements liés à ce courtier (toutes les personnes assurées par ce courtier) deviendraient la sélection courante de la table [Employés] et le premier de ces enregistrements deviendrait l’enregistrement courant de cette table. Cet enregistrement courant peut différer de celui qui a initié la propagation. Dans ce cas, 4D n’a aucun moyen de savoir quel enregistrement est l’enregistrement courant.

Quand 4D rencontre ce type de relation circulaire, la propagation des liens est stoppée à la dernière table de la chaîne, le lien entre la table [Courtiers] et [Employés] n’est pas propagé.

Un conflit similaire peut survenir si plusieurs liens pointent vers la même table.
Comme il n’est pas possible d’avoir plus d’un enregistrement courant en même temps, il n’est pas possible de définir des liens automatiques grâce auxquels deux tables ou plus sont reliées à la même table.
La figure ci-dessous représente la structure d’une base de données dans laquelle deux tables sont liées à la même table.

Quand un utilisateur est en train de travailler avec un enregistrement de la table [Employés], l’enregistrement lié est chargé dans la table [Assurance] et devient l’enregistrement courant pour cette table.
Cependant, il y a aussi une relation entre la table [Enfants] et la table [Assurance]. Ceci a pour effet de charger un autre enregistrement courant dans la table [Assurance] basé sur l’enregistrement courant de la table [Enfants] (le premier enregistrement de la sélection courante de cette table). Si la compagnie d’assurance de cet enfant diffère de celle du parent, cette structure relationnelle causera des problèmes. Dans ce cas, 4D n’interrompt pas la propagation des relations. Les deux relations seront propagées mais à des instants différents.
Si vous souhaitez utiliser ce type de structure, il est nécessaire d’utiliser des liens manuels et de les contrôler à l’aides des commandes décrites dans le manuel Langage de 4D.

Un autre exemple d’une structure relationnelle qui ne peut pas être réalisée à l’aide de relations automatiques est celui d’une structure dans laquelle une table possède plus d’un lien vers une autre table. Chaque fois qu’un utilisateur modifie un des champs liés dans la table 1, l’enregistrement courant de la table N peut changer. Dans cette situation, il est impossible de savoir quel lien est activé.

Comme il ne peut y avoir qu’un seul enregistrement courant dans une table, les liens ne sont pas activés pour tous les enregistrements d’une sélection. Observons par exemple la base de facturation illustrée ci-dessous :

Quand un enregistrement de la table [Factures] est utilisé, une sélection d’enregistrements est créée dans la table [Lignes_Factures] qui contient toutes les lignes pour cette facture. Cependant seul l’enregistrement de la table [Composants] correspondant au premier enregistrement de la table [Lignes_Factures] est chargé. La sélection courante de la table [Composants] ne contient pas d’informations sur tous les objets de la facture, elle ne contient des informations que sur le premier objet de la facture.

Cependant, si vous placez la table [Lignes_Factures] dans un sous-formulaire et dans la table [Factures], 4D appelle chacune des lignes de facture visibles dans la zone du sous-formulaire, une par une, et active le lien pour chacune d’elles.

 
PROPRIÉTÉS 

Produit : 4D
Thème : Définir la structure de la base de données

 
HISTORIQUE 

 
UTILISATION DE L'ARTICLE

4D - Mode Développement ( 4D v16)
4D - Mode Développement ( 4D v16.1)
4D - Mode Développement ( 4D v16.3)