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

Requêtes MySQL Discussion :

Création d'une vue avec x tables ou comment utiliser une variable comme nom de table


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2016
    Messages : 109
    Par défaut Création d'une vue avec x tables ou comment utiliser une variable comme nom de table
    Le contexte est assez simple : utiliser le résultat d'une variable comme nom d'un objet ou une table.

    J'ai un table element_nom2 qui basiquement contient :
    - une string Nom2
    - un Id element_id
    - un Id table_id

    L'idée est de permettre à X éléments de X tables d'avoir un nom 2
    Le résultat attendu est :
    - Element_ID
    - Element_Nom
    - Element_Nom2

    L'Id table_id pointe sur une table tables où on trouve tables.id et tables.nom

    Du coup avec le table.nom (tables.id = element_nom2.table_id) on sait sur quelle table on peut chercher element_id qui sera "tables.nom".element_id

    Oui mais comment réaliser cela en un seul create view sachant que le "tables.nom" est un résultat et le nom de la table de l'élément ?

    Les LEFT JOIN semblent acrobatiques...

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 815
    Billets dans le blog
    14
    Par défaut
    Vous avez là à mon avis un gros problème de modélisation de votre base de données !

    Pouvez-vous nous préciser un peu mieux le contexte réel qui vous à amené à faire des pseudo-clés étrangères multitables ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 confirmé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2016
    Messages : 109
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Vous avez là à mon avis un gros problème de modélisation de votre base de données !

    Pouvez-vous nous préciser un peu mieux le contexte réel qui vous à amené à faire des pseudo-clés étrangères multitables ?
    J'ai donné un peu de contexte, mais je suis très intéressé par votre avis pour la modélisation de ma base ... même si c'est juste pour le plaisir

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 815
    Billets dans le blog
    14
    Par défaut
    J'ai créé plusieurs tables d'éléments comme ecritures, hommes, langues, constructeurs, machines, etc....
    ...
    chaque élément n'a pas forcément un nom2
    Si j'ai bien compris, vous avez les règles de gestion suivantes :
    R1 : Une écriture peut avoir un nom_2 et un nom_2 peut être celui d'une écriture
    R2 : Un homme peut avoir un nom_2 et un nom_2 peut être celui d'un homme
    R3 : Une langue peut avoir un nom_2 et un nom_2 peut être celui d'une langue
    R4 : Un constructeur peut avoir un nom_2 et un nom_2 peut être celui d'un constructeur
    R5 : Une machine peut avoir un nom_2 et un nom_2 peut être celui d'une machine
    ...

    Ce qui donne le MCD suivant :
    ecriture -0,1----avoir----0,1- nom_2
    homme -0,1----avoir----0,1-------|
    langue -0,1----avoir----0,1--------|
    constructeur -0,1----avoir----0,1-|
    machine -0,1----avoir----0,1------|

    Comme il est dit dans mon article sur les règles de gestion, ces associations types entraîneront la création de tables associatives.

    On peut cependant opérer une simplification en considérant, d'après l'objet de votre site, que ces différents éléments sont des spécialisations d'éléments de connaissance. On aurait alors cette fois les règles de gestion suivantes (qui remplacent les précédentes) :
    R6 : Une écriture est un élément de connaissance et un élément de connaissance peut être une écriture
    R7 : Un homme est un élément de connaissance et un élément de connaissance peut être un homme
    ...

    Ce qui donne cette fois le MCD suivant :
    ecriture -(1,1)----être----0,1- element
    homme -(1,1)----être----0,1------|
    langue -(1,1)----être----0,1-------|
    constructeur-0,1----avoir----0,1--|
    machine-0,1----avoir----0,1-------|

    Ajoutons la règle suivante :
    R8 : Un élément de connaissance peut avoir un nom_2 et un nom_2 appartient à un élément de connaissance.

    Prenons-là en compte dans le MCD :
    ecriture -(1,1)----être----0,1- element -0,1----avoir----(1,1)- nom_2
    homme -(1,1)----être----0,1------|
    langue -(1,1)----être----0,1-------|
    constructeur-0,1----avoir----0,1--|
    machine-0,1----avoir----0,1-------|

    Construisons les tables :
    te_element_elm (elm_id, [colonnes communes à tous les types d'éléments])
    te_nom_2_nm2 (nm2_id_element, nm2_libelle...)
    th_ecriture_ecr (ecr_id_element, [colonnes spécifiques aux écritures])
    th_homme_hom (hom_id_element, [colonnes spécifiques aux hommes])
    th_langue_lng (lng_id_element, [colonnes spécifiques aux langues])
    th_constructeur_cns (cns_id_element, [colonnes spécifiques aux constructeurs])
    th_machine_mch (mch_id_element, [colonnes spécifiques aux machines])

    Notes :
    1) J'ai employé un nommage inspiré de celui de SQLPro.
    2) Les clés primaires sont soulignées ; les clés étrangères sont en italique.
    3) Pour avoir toutes les données relatives à un type d'élément (une écriture, un homme...), faites des vues :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE OR REPLACE VIEW v_ecriture AS
    SELECT e.elm_id AS id_ecriture,
    	-- autres colonnes communes à tous les types d'éléments
    	-- colonnes spécifiques aux écritures
    	n.nm2_libelle AS nom_2_ecriture
    FROM th_ecriture_ecr ec
    INNER JOIN te_element_elm e ON e.elm_id = ec.ecr_id_element
    	LEFT OUTER JOIN te_nom_2_nm2 n ON n.nm2_id_element = e.elm_id
    PS : J'aimerais mettre des clés étrangères mais je suis sur free.fr donc je ne peux pas
    Si free ne permet toujours pas les tables InnoBD, c'est qu'ils sont très en retard et qu'ils n'ont pas tout compris !
    Cependant, même si les vraies clés étrangères ne sont pas implémentables chez Free, vous pouvez au moins en appliquer le principe, comme je l'ai fait ci-dessus.
    Si Free n'autorise pas non plus a création des vues, comme ce ne sont que des requêtes enregistrées, elles seront dans votre programme.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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
    Membre confirmé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2016
    Messages : 109
    Par défaut
    Merci beaucoup @CinePhil j'adhère à 200 % à ce principe de structure de base.
    D'ailleurs j'aurai dû y penser tout seul car mes class PHP sont construites comme cela.

    Je vais faire migrer ma base de données dans ce sens

    Un grand merci

  6. #6
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 882
    Par défaut
    Salut à tous.

    Citation Envoyé par berthos
    Le contexte est assez simple : utiliser le résultat d'une variable comme nom d'un objet ou une table.
    En l'état actuel de MySql, votre demande n'est pas possible.
    Sauf en faisant de grosse bidouille qui va nécessité de faire des requêtes dynamiques.

    Citation Envoyé par CinePhil
    Vous avez là à mon avis un gros problème de modélisation de votre base de données !
    Ce que je confirme !

    Une base de données c'est statique comme organisation des données.
    Si maintenant, vous désirez rendre le tout variable, il faut utiliser une organisation en meta données, ce que MySql ne sait pas bien faire.

    Citation Envoyé par berthos
    Oui mais comment réaliser cela en un seul create view sachant que le "tables.nom" est un résultat et le nom de la table de l'élément ?
    Les View n'admettent pas de variables ! Donc votre approche n'est pas possible sous MySql.

    Citation Envoyé par CinePhil
    Pouvez-vous nous préciser un peu mieux le contexte réel qui vous à amené à faire des pseudo-clés étrangères multitables ?
    Je formule la même demande que CinePhil :
    Il serait bon de nous donner un jeu d'essai afin de voire comment nous serions à même de répondre à votre demande.

    @+

  7. #7
    Membre confirmé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2016
    Messages : 109
    Par défaut De l'Aleph à l'@
    Tout d'abord merci pour vos messages.
    Le contexte est juste mon site personnel du partage de la connaissance : De l'Aleph à l'@ http://aleph2at.free.fr
    Donc juste du plaisir de partager et de programmer.

    J'ai créé plusieurs tables d'éléments comme ecritures, hommes, langues, constructeurs, machines, etc....

    En lisant le très bon livre "Modélisation des bases de données" de Christian Soutou avec la collaboration de Frédéric Brouard, j'ai fait le choix (juste pour m'amuser) de déporter le champ Nom2 qui existait dans chaque table d'élément vers une table element_nom2 sur le principe que chaque élément n'a pas forcément un nom2 (string de plusieurs noms annexes ex : Acoli;Akoli;Acooli;Atscholi;Shuli;Gang;Lwoo;Lwo pour l'élément Langue Acholi)

    Voici la structure de la table element_nom2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DROP TABLE IF EXISTS `element_nom2`;
    CREATE TABLE IF NOT EXISTS `element_nom2` (
      `Id` int(11) NOT NULL auto_increment COMMENT 'Identifiant de la relation',
      `Date_Creation` datetime NOT NULL COMMENT 'Date de création',
      `Date_Modification` datetime NOT NULL COMMENT 'Date de modification',
      `Nom2` varchar(500) default NULL COMMENT 'Liste de noms2',
      `Element_Id` int(11) default NULL COMMENT 'Identifiant de l''élément',
      `Element_Table_Id` int(11) default NULL COMMENT 'Indentifiant de la table de l''élément',
      PRIMARY KEY  (`Id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='Table des noms2 d''élément' AUTO_INCREMENT=312 ;
    Donc le principe est qu'un élément e d'un table t peut avoir un nom2 qu'on trouve dans la table element_nom2

    Exemple :
    (`Id`, `Date_Creation`, `Date_Modification`, `Nom2`, `Element_Id`, `Element_Table_Id`)
    VALUES
    (2, '2018-05-02 09:56:02', '2018-05-02 09:56:25', 'Plate pairing', 569, 3)

    Dans cet exemple l'élément Id:569 de la table Id:3 a pour Nom2 : 'Plate pairing'

    L'Id Table se trouve dans la table Tables
    (`Id`, `Date_Creation`, `Date_Modification`, `Titre`, `Nom`, `Logo`, `Logo_32w`, `Class`, `Liste_Article_Id`, `Ordre`, `Couleur`)
    (3, '2015-07-26 23:13:58', '2016-10-29 07:38:10', 'Le Glossaire', 'glossaire', 'contenu/img/glossaire.png', 'glossaire_32w.png', 'voc', 0, 80, '#61FF61'),

    dont le champ Nom permet de connaître le nom de la table de l'élément donc dans l'exemple : la table glossaire on trouve l'élément 569

    (`Id`, `Nom`, `Multilingue`, `Ethymologie`, `Date_Creation`, `Date_Modification`, `Reecrit`)
    (569, 'Dual mode', 0, 0, '2010-06-09 15:06:50', '2010-06-09 15:06:50', 0)

    PS : J'aimerais mettre des clés étrangères mais je suis sur free.fr donc je ne peux pas

    bon cela n'a rien à voir avec la question mais après on trouve la relation entre l'élément et ses articles via la table articles_elements
    (`Id`, `Articles_Id`, `Elements_Id`, `Tables_Id`, `Sens`, `Date_Modification`, `Date_Creation`)

  8. #8
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 882
    Par défaut
    Salut à tous.

    Citation Envoyé par berthos
    Le contexte est juste mon site personnel du partage de la connaissance : De l'Aleph à l'@ http://aleph2at.free.fr
    En regardant l'homme dans son évolution, je constate qu'il est droit dans les premiers âges et qu'il se voute par la suite.
    Je ne sais pas si c'est fait exprès, mais on a l'impression d'une regression.

    J'ai mis un +1 à CinPhil pour son excellent travail de conceptualisation de la base de données.

    Citation Envoyé par berthos
    PS : J'aimerais mettre des clés étrangères mais je suis sur free.fr donc je ne peux pas
    Est-ce un hébergement gratuit sous forme de site ou de blog que "free.fr" met à la disposition de ses abonnés ?
    Avez-vous la possibilité de changer la version de mysql que vous utilisez ?

    Sinon, je vous conseille Alwaysdata pour un hébergement gratuit de 100 Mo.
    La dernière version de MySql utilisée est en fait la version 10.1 de MariaDB.

    Citation Envoyé par CinePhil
    Si free ne permet toujours pas les tables InnoBD, c'est qu'ils sont très en retard et qu'ils n'ont pas tout compris !
    J'avais remarqué que le moteur utilisé par Berthos, était "MyISAM" ?
    @ Berthos : quelle version MySql utilisez-vous sous free.fr ?

    Citation Envoyé par berthos
    Je vais faire migrer ma base de données dans ce sens
    Je suppose que le terme "migrer" n'est pas dans le sens que je suppose.
    Vouliez-vous dire faire évoluer votre base de données selon les recommendations de CinePhil ?
    Ou bien changer de version MySql en migrant votre base de données chez un autre hebergeur gratuit, disposant des clefs étrangères et des view ?

    @ Berthos : vous auriez pi mettre un +1 à CinepHil pour son excellente réponse !

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment créer une vue avec des paramètres (objets) ?
    Par Ryu2000 dans le forum Eclipse Platform
    Réponses: 25
    Dernier message: 12/12/2012, 13h11
  2. Comment utiliser une vue avec 2 tables
    Par Masmeta dans le forum Développement
    Réponses: 2
    Dernier message: 07/01/2011, 12h38
  3. Comment Créer une vue avec nombre de colonnes inconnu d'avance ?
    Par masterx_goldman dans le forum Développement
    Réponses: 3
    Dernier message: 21/10/2009, 17h28
  4. donner la valeur d'une variable comme nom de table
    Par cladsam dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 14/10/2005, 15h16

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