IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modélisation Discussion :

Gérer l'héritage des données dans une base Access [Tutoriel]


Sujet :

Modélisation

  1. #1
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut Gérer l'héritage des données dans une base Access
    Bonjour,

    Je vous propose un nouveau tutoriel concernant la notion d'héritage des données au sein des tables Access.

    Plusieurs questions reviennent fréquemment sur ce forum et j'espère en avoir fait une bonne synthèse.

    http://warin.developpez.com/tutoriel...onnees-access/

    En termes de modélisation, une question qui revient sur les forums des différents SGBD-R est la suivante :


    Comment conserver la notion d'héritage lors du passage du modèle conceptuel au modèle relationnel ?


    Il n'existe pas de règle pouvant répondre à coup sûr à la problématique. Merise a bien défini des méthodes pour transformer par exemple un identifiant en clé primaire, ou bien encore une association avec des cardinalités maximales à N en une table, mais rien à ce sujet. La raison est simple : tout dépend de la structure des entités concernées par l'héritage, du volume de données mis en jeu, des requêtes attendues, des compétences du moteur, etc.


    A travers ce document, je vous propose d'étudier les différentes possibilités (elles sont au nombre de trois) en détaillant les raisons qui pourraient favoriser un tel choix plutôt qu'un autre et les incidences sur le reste du développement et plus particulièrement les requêtes.
    pour vos éventuelles remarques

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 603
    Points
    56 603
    Billets dans le blog
    40
    Par défaut
    bonsoir,

    merci pour cette synthèse qui donne un nouvel éclairage sur la généralisation/spécialisation d’entités-type sous Access.
    Je n’ai pas manqué (entre autres) la contrainte CHECK du paragraphe VI-C. Spécialisation sur le modèle du MCD qui va enfin m’assurer de manière infaillible l’intégrité de mes données pour un héritage(XT) de mes contacts.

    Le hasard faisant bien les choses, le lecteur pourra compléter l’analyse grâce au post de cette discussion toute fraiche ici: Héritage ou pas héritage ? sur un cas particulier d’héritage où les entités filles sont associées (Tiens ! voilà une suggestion pour un éventuel futur complément/mise à jour de l’article)

    En tout cas, « chapeau bas » pour la qualité de tes synthèses. J’en redemande.

  3. #3
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 603
    Points
    56 603
    Billets dans le blog
    40
    Par défaut
    Bonsoir,

    J’ai un problème d’héritage.

    Dans le cas d’un héritage XT, j’ai donc implanté les contraintes sur les deux tables tblSalarié et tblIndépendant (http://warin.developpez.com/tutoriel...-access/#LVI-C )

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE tblSalarie ADD CONSTRAINT Unicite CHECK …
     
    ALTER TABLE tblIndependant ADD CONSTRAINT Unicite CHECK
    Une fois les contraintes mises en place, les insertions marchent nickel et prennent bien en compte la contrainte XT, MAIS (il y a toujours un MAIS) :

    Si je supprime par exemple toutes les lignes de tblSalarie puis ensuite je commence par supprimer toutes les lignes de tblIndependant, ça coince : impossible de supprimer la dernière ligne (violation de la contrainte « Unicite »).
    Ce qui est logique puisque lorsque les deux tables tblSalarie et tblIndependant sont vides, la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT count(*) FROM tblSalarie… + SELECT count(*) FROM tblIndependant…
    retourne 0 et viole donc la contrainte « unicite ».

    C’est un peu embêtant tout ça, non ? Comment pourrait-on prendre en compte ce cas particulier ?

  4. #4
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Salut

    Euh, dans un modèle XT, tu ne peux pas avoir les tables independants et salariés vide, sinon, cela veut dire que tu as des intervenant qui ne sont ni independant, ni salarié. Tu ne couvres donc plus la totalité.

    Il faut supprimer les intervenants en cascade, mais il se peut là aussi que la contrainte gène à voir

  5. #5
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 603
    Points
    56 603
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par Tofalu Voir le message
    Euh, dans un modèle XT, tu ne peux pas avoir les tables independants et salariés vide...
    Oui pardon, j’avais pris un raccourci car la suppression en cascade à partir de la table mère tblIntervenant ne résout rien : Impossible de supprimer le dernier intervenant pour la même raison.

    Faut-il se résoudre à écrire un code qui supprime la règle de validation juste avant de supprimer le dernier intervenant ? (Certes, ce n’est pas très compliqué mais le phénomène est tout de même à prendre en compte).

  6. #6
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    En fait, je ne comprend pas pourquoi ça le fait sur le dernier intervenant et pas sur les autres. Si ça pose soucis sur le dernier, ça devrait le poser pour tous. Tu es sûr que tu n'as pas fait une boulette quelque part ?

    Tu as essayé au sein d'une transaction ?

    Si le moteur considère la suppression en cascade comme non atomique, c-à-d composé des suppressions successives alors, pourquoi il ne signale rien quand on supprime un autre enregistrement que le dernier. A un moment donné, celui-ci aussi se retrouve être ni salarié ni indépendant.

  7. #7
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Salut,

    Bon ben au sein d'une transaction c'est pareil, la suppression est assez aléatoire et je me demande si on va réussir à gérer cette notion de totalité. Peut être faudrait-il mieux remplacer le =1 par <=1. Mais bon, on perd une notion de l'héritage (quoique de toute façon à la création de l'intervenant, rien dans le système ne peut garantir qu'il va évoluer en salarié ou en indépendant).

  8. #8
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 603
    Points
    56 603
    Billets dans le blog
    40
    Par défaut
    Re,

    Il semblerait que le problème soit réglé en écrivant :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ALTER TABLE tblSalarie ADD CONSTRAINT Unicite CHECK (
    ( SELECT COUNT(*)=0 FROM tblIndependant WHERE tblIndependant.ID=tblSalarie.ID))
     
    ALTER TABLE tblIndependant ADD CONSTRAINT Unicite2 CHECK (
    ( SELECT COUNT(*)=0 FROM tblSalarie WHERE tblSalarie.ID=tblIndependant.ID))

    En fait quand tu écris:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE tblSalarie ADD CONSTRAINT Unicite CHECK ( 
    ( SELECT Count(*) FROM tblSalarie T1…
    Un début d’explication serait qu’on ne sait pas trop dans quel état est la copie tblSalarie T1, non ?

    Mystère…

  9. #9
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Ouais, en fait je me suis fait la même reflexion et je voulais tester ce que tu as mis mais je sais plus pourquoi je suis parti sur une autre piste ... infructueuse

    L'idée serait donc de tester seulement si la donnée existe bien dans la table "concurrente". Mais finalement, on en revient à ce que je disais, on perd la totalité c-à-d le =1 et non =0

    Si on met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE tblSalarie ADD CONSTRAINT Unicite CHECK (
    ( SELECT COUNT(*) FROM tblIndependant WHERE tblIndependant.ID=tblSalarie.ID)=0)
    ça irait aussi ?

    Je préferais, c'est plus propre, tu trouves pas ?

    Un début d’explication serait qu’on ne sait pas trop dans quel état est la copie tblSalarie T1, non ?
    Oui, je crois aussi.

    Ce qui est curieux, c'est qu'à plusieurs reprises tout à l'heure ça marchait... puis aprés plus rien, puis aprés, ça marche puis ... Donc si la piste que tu as donné semble fiable autant la préférer.

  10. #10
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 603
    Points
    56 603
    Billets dans le blog
    40
    Par défaut
    Re,
    Citation Envoyé par Tofalu Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE tblSalarie ADD CONSTRAINT Unicite CHECK (
    ( SELECT COUNT(*) FROM tblIndependant WHERE tblIndependant.ID=tblSalarie.ID)=0)
    ça irait aussi ?
    Je préferais, c'est plus propre, tu trouves pas ?
    Oui et ça marche aussi.

    En fait, la contrainte CHECK étant une contrainte liée à une table, on ne devrait pas pouvoir consulter la table pendant sa propre mise à jour.

    J’ai lu quelque part que certains SGBD (pas Access) permettaient les assertions comme :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE ASSERTION unicite CHECK 
    (NOT EXISTS (SELECT tblSalarie.ID FROM tblSalarie S INNER JOIN tblIndependant  I
    ON S.ID = I.ID))

    Alors sur le même modèle j’ai essayé :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ALTER Table Salarie ADD CONSTRAINT Unicite CHECK 
    (NOT EXISTS (SELECT Salarie.ID FROM Salarie S INNER JOIN Independant I
    ON S.ID = I.ID))
     
    ALTER Table Independant ADD CONSTRAINT Unicite2 CHECK 
    (NOT EXISTS (SELECT Independant.ID FROM Independant I INNER JOIN Salarie S
     ON S.ID = I.ID))
    Et ben ça marche quand même??!! Comprends pô pourquoi ça marche, mais ça marche nickel.

    Pas claire cette histoire, y m’reste des aspirines si tu veux.

  11. #11
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    En fait, la contrainte CHECK étant une contrainte liée à une table, on ne devrait pas pouvoir consulter la table pendant sa propre mise à jour.
    Ben pourtant ça marche à l'update et à l'insert, y a que le delete qui semble poser parfois problème.

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Héritage
    Bonjour,

    j'ai étudié avec beaucoup d'intérêts le tutoriel concernant
    l'implantation de l'héritage sous Access.

    Ma Question est la suivante:
    Je constate que l'on peut créer un Intervenant seul, i.e.
    sans pour autant créer un Salarié ou un Indépendant.
    Est-il possible de modéliser ceci :
    Un intervenant n'existe que si Salarié ou Intervenant existe.
    (un peu l'équivalent en Java d'une classe Abstract que je ne peux
    instancier)

    Autrement dit, à partir du formulaire de saisie d'un Intervenant
    forcer la saisie des données de Salarié (ou de l'indépendant).
    Si ces données ne sont pas saisies, alors annuler la saisie de
    l'Intervenant.

    Est-il possible de faire ceci proprement et efficacement sous Access.
    (sans recourir à des delete...)

    En espérant avoir été clair,
    Merci de votre contribution.

  13. #13
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 12
    Points : 12
    Points
    12
    Par défaut Héritage dans une base de donnée ... répliquée
    Bonjour et encore bravo pour ce super document qui m'a aidé dans la conception d'une base de données utilisant des Personnes (morale et physique)

    Mais j'ai une petite question... si ma base est répliquée en plusieurs bases comment se passe la mise à jour de l'ID lors de la synchronisation ? Ne risque t-on pas d'avoir des doublons ?

Discussions similaires

  1. Insertion des données dans une base access 2007
    Par guy_antoine_mav dans le forum Accès aux données
    Réponses: 2
    Dernier message: 11/11/2009, 22h34
  2. [ODBC] insérer des données dans une base access
    Par makfly2301 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 16/06/2008, 15h19
  3. Enregistrer des données dans une base de donnée
    Par fabienlege dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 18/04/2007, 17h34
  4. [VB6]problème d'insertion des donneés dans une base d'Access2003
    Par lanbok dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 27/05/2006, 13h17
  5. [MySQL] Modifier des données dans une base de donnée
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 26/01/2006, 10h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo