nom de table dynamique dans requete

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : nom de table dynamique dans requete

Re: nom de table dynamique dans requete

par ouckileou » 03 sept. 2009, 13:28

J'ai survolé mais je crois que zeus a déjà répondu non ? Pas de tables avec des données redondantes.

Donc ce que je ferais, c'est faire comme il a dit :

- une table "utilisateurs", avec les données communes et un discriminant sur le type d'utilisateur
- 3 autres tables avec une clé étrangère vers "utilisateurs" et qui contiennent les données particulières à chaque type.

Re: nom de table dynamique dans requete

par Invité » 03 sept. 2009, 11:30

Je peux comprendre que personne n'aie envie de plonger dans ce bazar compliqué.
je reviens tout de même sur un point simple qui a été soulevé et que je n'ai pas tout à fait compris:

j'ai par exemple 3 types d'utilisateurs : admin, editor, reader

Ces utilisateurs ont de nombreux types de données en commun: nom, adresse, téléphone, fax, email...
Mais aussi quelques champs différents: expertise (éditor uniquement), raison sociale (reader uniquement), niveau (admin uniquement).

Faut-il mettre tous les users et tous ces champs dans une même table?
=> dans ce cas les champs qui ne concernent pas un user auront la valeur null

Ou alors mettre tous les champs communs dans la table users, et utiliser des tables de "mapping" pour les champs différents?
Ou a lors y a til une autre méthode qui permet de mieux assurer la qualité de la modélisation?

Merci pour vos réponses.

Re: nom de table dynamique dans requete

par Invité » 02 sept. 2009, 08:42

Tout d'abord merci à tous pour vos conseils.

Alors voilà: dans mon modèle réel, j'ai types 3 d'utilisateurs, se trouvant dans 3 tables différentes:
CREATE TABLE `jos_abonnes` (
  `id` int(10) NOT NULL auto_increment,
  `userId` int(10) NOT NULL,
  `profil` int(10) NOT NULL,
  `societeId` int(10) NOT NULL,
  `prenom` varchar(255) NOT NULL,
  `adresse` text NOT NULL,
  `cp` int(5) NOT NULL,
  `ville` varchar(255) NOT NULL,
  `tel` varchar(10) NOT NULL,
  `fax` varchar(10) NOT NULL,
  `published` tinyint(1) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

CREATE TABLE `jos_agences` (
  `id` int(10) NOT NULL auto_increment,
  `userId` int(10) NOT NULL,
  `profil` int(10) NOT NULL,
  `adresse` text NOT NULL,
  `cp` int(5) NOT NULL,
  `ville` varchar(255) NOT NULL,
  `tel` varchar(10) NOT NULL,
  `fax` varchar(10) NOT NULL,
  `published` tinyint(1) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE `jos_prestataires` (
  `id` int(10) NOT NULL auto_increment,
  `userId` int(10) NOT NULL,
  `profil` int(10) NOT NULL,
  `agenceId` int(10) NOT NULL,
  `socprestationId` int(10) NOT NULL,
  `expertise` varchar(255) NOT NULL,
  `prenom` varchar(255) NOT NULL,
  `adresse` text NOT NULL,
  `cp` int(5) NOT NULL,
  `ville` varchar(255) NOT NULL,
  `tel` varchar(10) NOT NULL,
  `fax` varchar(10) NOT NULL,
  `published` tinyint(1) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


Chaque table d'utilisateur a un champ 'userId' qui renvoie vers un id dans la table jos_users
CREATE TABLE `jos_users` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL default '',
  `username` varchar(150) NOT NULL default '',
  `email` varchar(100) NOT NULL default '',
  `password` varchar(100) NOT NULL default '',
  `usertype` varchar(25) NOT NULL default '',
  `block` tinyint(4) NOT NULL default '0',
  `sendEmail` tinyint(4) default '0',
  `gid` tinyint(3) unsigned NOT NULL default '1',
  `registerDate` datetime NOT NULL default '0000-00-00 00:00:00',
  `lastvisitDate` datetime NOT NULL default '0000-00-00 00:00:00',
  `activation` varchar(100) NOT NULL default '',
  `params` text NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `usertype` (`usertype`),
  KEY `idx_name` (`name`),
  KEY `gid_block` (`gid`,`block`),
  KEY `username` (`username`),
  KEY `email` (`email`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=64 ;

Il faut savoir que je ne peux pas modifier cette table users car elle fait partie d'une application plus large qui serait chamboulée. Je ne peux qu'organiser mes autres tables en fonction de cette table jos_users existante.

Ma question: sachant que chaque type d'utilisateur a des champs communs et des champs différents par rapport aux autres profils utilisateurs, quelle serait l'organisation optimale des données pour ne pas souffrir plus tard. Notamment, je galère déjà car quand je veux récupérer des données sur un utilisateur, impossible de dire dans la requete sql dans quelle table il faut aller.

Merci à tous pour votre aide.

Re: nom de table dynamique dans requete

par zeus » 01 sept. 2009, 21:07

Si dans ma requete select users, le champ 'profil' a pour valeur 'admin', puis-je dans la meme requete aller chercher des éléments dans la table admin?
non.
Quand tu exécutes une requête SQL, le SGBD (mysql dans ton cas) analyse la syntaxe, la valide en, entre autres, s'assurant que les noms des tables existent, puis l'exécutes et récupère les résultats.
Dans le cas d'une jointure simple, par exemple, ça ne pose pas de soucis puisque le SGBD remonte les données dans la 1ère table, puis dans la seconde, et fait la jointure sur ce résultat (en très simplifié, c'est ça)

Dans ton cas, il faudrait que le SGBD analyse une partie de la requête, l'exécute, modifie son corps et exécute la fin. Et ça, c'est strictement impossible.

Il doit bien exister une solution, en faisant une jointure forcée sur les 3 tables, et en croisant les résultats, mais je t'encourage fortement en reconsidérer ton modèle pour que les 3 tables admin, editor et user soient une unique table "profil" avec un champ "statut" qui contient 'admin', 'editor' ou 'user'.
En gros, pour savoir si tu t'es planté dans ta conception, regarde la structure de tes tables. Si elles sont strictement identiques, c'est que tu t'es trompé.

Re: nom de table dynamique dans requete

par furiouslol » 01 sept. 2009, 20:14

Salut

Montre nous tes tables telles qu'elles sont actuellement

Re: nom de table dynamique dans requete

par dunbar » 01 sept. 2009, 19:03

.
Est-ce vraiment un pb de conception?
Oui

Re: nom de table dynamique dans requete

par Invité » 01 sept. 2009, 18:55

Comprend tu l'exemple donner plus haut :?:
merci, je vais étudier ça...mais si j'ai un pb de conception, je préfère arranger ça dès maintenant pour ne pas faire de nuits blanches quand l'appli deviendra complexe.
Est-ce vraiment un pb de conception?

J'aurais bien voulu mettre tous mes users dans une seule table mais ils n'ont pas les mêmes champs.
Pour 'admin', 'user' et 'editor', certains champs sont communs mais d'autres sont différents.

Que suis-je sensé faire dans ce cas là?

Re: nom de table dynamique dans requete

par dunbar » 01 sept. 2009, 18:15

Comprend tu l'exemple donner plus haut :?:

Re: nom de table dynamique dans requete

par Invité » 01 sept. 2009, 18:06

Si dans ma requete select users, le champ 'profil' a pour valeur 'admin', puis-je dans la meme requete aller chercher des éléments dans la table admin?

Sachant que le champ profil peut prendre les valeurs 'admin', 'user' ou 'editor', il faudrait que dans la requete, un nom de table dépende de la valeur d'un champ.
C'est pour ça que je parle de nom de table dynamique
je ne sais pas si c'est plus clair?

Re: nom de table dynamique dans requete

par zeus » 01 sept. 2009, 18:05

Bonjour,

Tout d'abord, quand je lis
Les créateurs sont de 3 types 'admin', 'editor', 'user'
J'ai 3 autres tables 'admin', 'editor', 'user' contenant l'info sur les créateurs (id, nom,...)
Je te confirme que oui, c'est
[...]un pb de conception des tables...
parce que, comme tu le dit au début, tu as des créateurs qui ont un type, donc une seule table, pas 3.

Sinon, je ne pense pas que tu puisses faire ça en une seule requête. Tout simplement parce qu'il faut aller chercher des données dans une table pour savoir dans quelle autre table aller voir.
Du coup, tu vas devoir faire une requête pour récupérer le type du créateur, puis une requête pour récupérer les informations du créateur.

Comme quoi, une mauvaise modélisation peut poser pas mal de soucis ;)

Re: nom de table dynamique dans requete

par dunbar » 01 sept. 2009, 18:03

Et bin l'idée reste la même
$Sql_news = "SELECT news, id FROM news";//--> récupération des news.


            $Resultat_news = mysql_query($Sql_news) or die('Erreur SQL !'.$Sql_news.'<br>'.mysql_error());

			while ($row = mysql_fetch_assoc($Resultat_profil))
			                 {
			           //-->Tu crée un Tableau qui reprend les différente id et leur table associée
			           $Table = array('id_admin' => 'admin',
			                          'id_editor' => 'editor',
			                          'id_user' => 'user');

			           $Table[$row['profil']];

			              $Sql_profil = "SELECT * FROM '".$Table[$row['profil']]."'"; //-->Récup des données du users
                          $Resultat_profil = mysql_query($Sql_profil) or die('Erreur SQL !'.$Sql_profil.'<br>'.mysql_error());
                          
                          $data_users = mysql_fetch_array($Resultat_profil);

			         }
Donc tu récupére les new et l'id, comme l'id correspond au users tu sélectionne une table suivant l'user.
Bon j'ai fait ça en 5 minutes c'est horrible mais cela dois fonctionner il y moyen de faire mieux, mais tu a une piste, (comme refaire tes tables) :wink:

Re: nom de table dynamique dans requete

par Invité » 01 sept. 2009, 18:01

Je reformule encore:

est-il possible dans une requete select, de créer dynamiquement le nom d'une table a partir de la VALEUR d'un enregistrement?

Re: nom de table dynamique dans requete

par Invité » 01 sept. 2009, 17:44

ben actuellement j'ai l'id du créateur dans la table news...

Re: nom de table dynamique dans requete

par dunbar » 01 sept. 2009, 17:31

Dans la table new il y à bien un champ qui te permet de savoir qui la déposer :?:
Parce que sans cela moi je voie pas comment savoir que telle ou telle new appartient a telle ou telle users 8-|

Re: nom de table dynamique dans requete

par Invité » 01 sept. 2009, 17:18

je vais poser ma question plus simplement.

J'ai une table 'news' contenant des news, et l'id du créateur.
Les créateurs sont de 3 types 'admin', 'editor', 'user'
J'ai 3 autres tables 'admin', 'editor', 'user' contenant l'info sur les créateurs (id, nom,...)

Comment faire pour afficher le nom du créateur dans la liste des news?
La difficulté: il existe un enregistrement admin avec id = 1, un enregistrement editor avec, id = 1 et un enregistrement user avec, id = 1

Comment savoir si l'id de créateur de la news est un admin, un editor ou un user?

Je crois que c'est un pb de conception des tables...