Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/12/2011, 13h26   #1
Invité de passage
 
Homme
Étudiant
Inscription : décembre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 3
Points : 1
Points : 1
Par défaut [Conception] Optimisation pour specialisation

Bonjour,

Je conçois une application sur MySQL workbench (qui est, en passant, un outil formidable, loin devant DBDesigner).

Soit une table "Item" qui contient des types d'objets.

Soit une table "Tool" qui est une specialisation de certains objets.
Sa cle primaire est egalement une cle etrangere correspondant a la cle primaire de Item.
Exemples : l'objet "pioche" sera dans Item et dans Tool.
L'objet "Livre" quant a lui sera uniquement dans Item.

Je me demande actuellement ce qu'il vaut mieux faire pour determiner si un Item est egalement un Tool :

1- Utiliser un champ BOOL is_tool dans Item

2- Ne rien utiliser, et chercher a chaque fois dans Tool l'existance de la cle etrangere correspondante


Je pencherai pour la premiere solution, mais j'aimerai votre avis avant de prendre cette decision.

Merci d'avance
OoDeLally est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 10h49   #2
Membre confirmé
 
Avatar de GyZmoO
 
Homme Mickaël
Ingénieur développement logiciels
Inscription : février 2006
Messages : 402
Détails du profil
Informations personnelles :
Nom : Homme Mickaël
Âge : 27
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : février 2006
Messages : 402
Points : 238
Points : 238
Envoyer un message via MSN à GyZmoO
Bonjour, bonjour !

La solution 1) ne me semble pas terrible.

Pour savoir si un Item est également un Tool, tu pourrais faire une requête du style

Code :
1
2
3
4
 
SELECT col FROM Item i
LEFT OUTER JOIN Tool t ON t.ID = i.ID
WHERE t.ID IS NULL
Avec ce genre de requête, tu auras tous les items qui n'ont pas de correspondance dans la table Tool. Tu peux faire une autre requête pour avoir uniquement les Items qui sont des Tools !
__________________
define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.
GyZmoO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 14h57   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
Bonjour,
Si tu cherches à savoir quels items ne sont pas des tools, utilise la solution de GyZmoO.
Si tu veux avoir des tools avec les attributs communs à tous les items, crée une vue :
Code :
1
2
3
4
CREATE VIEW v_tools
SELECT -- les colonnes nécessaires et pas étoile
FROM tool t
INNER JOIN item i ON i.item_id = t.item_id
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2011, 01h43   #4
Invité de passage
 
Homme
Étudiant
Inscription : décembre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 3
Points : 1
Points : 1
Citation:
Envoyé par GyZmoO Voir le message
Code :
1
2
3
4
 
SELECT col FROM Item i
LEFT OUTER JOIN Tool t ON t.ID = i.ID
WHERE t.ID IS NULL
Cette solution fonctionne assurement, mais est-elle la meilleure ?
Cela veut dire que MySQL parcourt toute la table Tool.

Dans la solution avec "is_tool", MySQL peut theriquement ecarter les Items qui ne sont pas des Tool, sans faire le parcourt de la table. Mais le fait-il ainsi ?
Cette solution presente de plus des etats sables non coherents dans la base, par exemple is_tool a false alors qu'un enregistrement existe dans Tool.
OoDeLally est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2011, 08h14   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
Tu devrais mieux préciser ton besoin.
Citation:
determiner si un Item est egalement un Tool
Cela peut vouloir dire :
1) J'ai 1 item et je veux savoir si c'est aussi un tool.
Code :
1
2
3
SELECT une_colonne_de_tool
FROM tool
WHERE tool_id_item = -- l'identifiant de l'item connu
=> Si la requête ne renvoie pas de ligne, c'est que l'item n'est pas un tool.

2) Obtenir la liste de tous les items qui sont aussi des tools :
Citation:
Envoyé par CinéPhil
Code :
1
2
3
4
CREATE VIEW v_tools
SELECT -- les colonnes nécessaires et pas étoile
FROM tool t
INNER JOIN item i ON i.item_id = t.item_id
3) Obtenir la liste des items qui ne sont pas des tools :
Citation:
Envoyé par GyZmoO
Code :
1
2
3
SELECT col FROM Item i
LEFT OUTER JOIN Tool t ON t.ID = i.ID
WHERE t.ID IS NULL
Ou encore, en principe plus efficace :
Code :
1
2
3
4
5
6
7
SELECT i.item_id
FROM item i
WHERE NOT EXISTS (
	SELECT *
	FROM tool t
	WHERE t.tool_id_item = i.item_id
)
Avec la seconde requête, en principe le parcours de tool pour chaque item s'arrête dès qu'une correspondance est trouvée alors que la jointure externe essaiera de toute façon de trouver des correspondances pour chaque ligne de item.

Tu vois que les solutions sont différentes selon le besoin alors lis la phrase en bleu de ma signature et applique son principe pour te conduire plus efficacement vers la solution.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2011, 18h47   #6
Invité de passage
 
Homme
Étudiant
Inscription : décembre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 3
Points : 1
Points : 1
Actuellement, je ne sais pas encore dans quels ratios je vais utiliser telle et telle operation. Donc je vais sans doute continuer a reflechir aux mecanismes du programmes pour ensuite trouver la solution la plus adaptee.

Merci pour vos conseils
OoDeLally est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h02.


 
 
 
 
Partenaires

Hébergement Web