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

Langage SQL Discussion :

Modèle de données et déplacement d'enregistrements liés


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Modèle de données et déplacement d'enregistrements liés
    Bonjour à tous.
    Je travaille actuellement sur une application de gestion de projet.
    Lorsque les utilisateurs du système créent de nouveaux projets, ils insèrent des modèles (ensemble d'enregistrements stockés dans des tables liées).
    Lors de l'insertion il faudrait déplacer ces enregistrements dans les tables cibles qui ont la même structure. Le problème étant bien sur la gestion des clés et des liaisons.
    Aujourd'hui j'ai une solution mais qui me paraît un peu complexe. J'utilise des numéros de clé très élevés dans mes tables de modèles. Je réalise l'insertion et après je change les valeurs de clés. La répercussion se fait par des "on update cascade". C'est un peu lourd.

    Quelqu'un aurait-il déjà eu à gérer ce problème là?
    Merci d'avance pour vos suggestions.

    JC

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    J'ai l'impression que ton modèle de données n'est pas bon.

    Lors de l'insertion il faudrait déplacer ces enregistrements dans les tables cibles qui ont la même structure.
    En principe, il est très rare de devoir créer de nouvelles tables. Là ton appli semble le faire à chaque nouveau projet.

    Lorsque les utilisateurs du système crée de nouveaux projets ils insèrent des modèles (ensemble d'enregistrements stockés dans des tables liées)
    tu pourrais expliquer davantage ce piont, avec la structure des tables concernées et un exemple de données ?

    Ou un schéma de la base (MCD, E/R, diagramme de classes...) ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Bonjour,
    Je pense que je ne me suis pas expliqué clairement.
    Il n'y a pas de création de table. En faite je ne déplace que des enregistrements d'une table à une autre.
    Exemple :
    J'ai une table1 liée avec une table2 et j'ai des tables table3 et table 4 qui sont respectivement des copies de table1 et table2. Les tables 3 et 4 me servent à stocker des enregistrements modèles. Ainsi lorsqu'un utilisateur veut ajouter un modèle ils ne fait que déplacer les données des tables 3 et 4 vers les tables 1 et 2. Le problème est de conserver la cohésion des liaisons lorsque l'on déplace ces données.
    J'espère être plus clair cette fois.
    Merci d'avance pour vos suggestions.

    JC

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    table3 et table 4 qui sont respectivement des copies de table1 et table2
    Donc l'association entre les tables (clés étrangères qui en découlent) doit être aussi identique non ?

    Réfléchir sur des concepts et des noms abstraits est difficile. Donc bis repetita :
    avec la structure des tables concernées et un exemple de données ?
    Ce qui conforme à la charte de postage de ce forum.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Il ne sert à rien d'avoir 4 tables de même structure. Une seule suffit, et mieux vaut qu'il n'y en ais jamais qu'une seule. On est pas sous Excel !!!

    Dans votre UNIQUE table comportant à la fois les modèles et les données de production, il suffit de prévoir un attribut MODELE de type BIT pour dire si cette ligne (et non pas enregistrement, cela n'existe pas dans les BD) fait partie d'un modèle ou non. Puis pour lier les lignes modèle à des lignes de prod, il suffit de prévoir une association réflexive.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Bon voila j'ai créé rapidement des exemples sous Mysql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    CREATE TABLE `tab1` (
      `id1` int(11) NOT NULL AUTO_INCREMENT,
      `nom` varchar(30) NOT NULL,
      PRIMARY KEY (`id1`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    CREATE TABLE `tab2` (
      `id2` int(11) NOT NULL AUTO_INCREMENT,
      `id1` int(11) NOT NULL,
      `nom` varchar(30) NOT NULL,
      PRIMARY KEY (`id2`),
      KEY `id1` (`id1`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1;
     
    CREATE TABLE `tab3` (
      `id1` int(11) NOT NULL AUTO_INCREMENT,
      `nom` varchar(30) NOT NULL,
      PRIMARY KEY (`id1`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1;
     
    INSERT INTO `tab3` (`id1`, `nom`) VALUES
    (1, 'Tache1'),
    (2, 'Tache2');
     
    CREATE TABLE `tab4` (
      `id2` int(11) NOT NULL AUTO_INCREMENT,
      `id1` int(11) NOT NULL,
      `nom` varchar(30) NOT NULL,
      PRIMARY KEY (`id2`),
      KEY `id1` (`id1`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1;
     
    INSERT INTO `tab4` (`id2`, `id1`, `nom`) VALUES
    (1, 1, 'Lien_tache1'),
    (2, 1, 'Lien_tache1'),
    (3, 2, 'lien_tache2');
     
    ALTER TABLE `tab2`
      ADD CONSTRAINT `tab2_ibfk_1` FOREIGN KEY (`id1`) REFERENCES `tab1` (`id1`) ON DELETE CASCADE ON UPDATE CASCADE;
     
    ALTER TABLE `tab4`
      ADD CONSTRAINT `tab4_ibfk_1` FOREIGN KEY (`id1`) REFERENCES `tab3` (`id1`) ON DELETE CASCADE ON UPDATE CASCADE;
    Les structures sont donc bien identiques (tab1 et tab2 = tab3 et tab4). lorsque j'insère un modèle je copie les tâches de tab3 et tab4 vers tab1 et tab2.
    Cette opération sera répétée à chaque insertion de modèle. Bien entendu j'ai plusieurs modèles dans mes table tab3 et tab4. Je n'insère pas toutes les tâches d etab3 et tab4 à chaque fois.
    Voila j'espère que cette fois les choses sont plus claires.

    JC

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Un truc de ce genre peut-être ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    INSERT INTO tab1 (nom)
    SELECT nom
    FROM tab3
    WHERE condition;
     
    INSERT INTO tab2 (id1, nom)
    SELECT t1.id1, t4.nom
    FROM tab1 AS t1
    INNER JOIN tab3 As t3 ON t3.nom = t1.nom
      AND condition
      INNER JOIN tab4 AS t4 ON t4.id1 = t3.id1
    J'ai pas testé.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Merci pour ta réponse.
    Cela ne fonctionne pas en faisant la jointure sur le nom car comme je vais réaliser X insertions successives les tâches vont avoir les mêmes noms et donc l'insertion des liaisons va être exponentielles. Il faudrait que je trouve une solution pour les dissocier.
    Je vais réfléchir car cette solution est bien plus propre que le mienne. Je te tiendrai informé de mes recherches. Merci encore pour tes solutions.

    JC

  9. #9
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    Bonsoir,

    Citation Envoyé par jccanut Voir le message
    Les structures sont donc bien identiques (tab1 et tab2 = tab3 et tab4). lorsque j'insère un modèle je copie les tâches de tab3 et tab4 vers tab1 et tab2.
    Pourquoi faites vous ces copies de lignes d'une table A vers une table B de structure identique ??
    Quel est l'intérêt ? L'objectif ?

Discussions similaires

  1. Liste déroulante + enregistrements liés...
    Par Invité dans le forum ASP
    Réponses: 2
    Dernier message: 03/08/2005, 16h57
  2. [JTree] Quel modèle de données utiliser ?
    Par speedster dans le forum Composants
    Réponses: 2
    Dernier message: 11/07/2005, 20h44
  3. Calcul de données present sur des enregistrements different
    Par logistik dans le forum Langage SQL
    Réponses: 6
    Dernier message: 04/05/2005, 16h33
  4. déplacement entre enregistrement
    Par xycoco dans le forum Access
    Réponses: 4
    Dernier message: 25/10/2004, 19h29
  5. [retro-conception] Passage au modèle de données
    Par liliboc dans le forum Outils
    Réponses: 5
    Dernier message: 09/07/2004, 11h01

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