2016-08-23 1 views
0

L'image suivante est une partie d'une base de données de résultats des tests de logiciels que je suis la conception: designclés étrangères dans de nombreux à plusieurs relations

Ma question est liée à la table fault. Ai-je besoin d'une clé étrangère qui est liée à la table configuration dans ma table fault afin de faire une requête qui, par exemple, me renverrait des données qui sont liées aux trois tables (configuration est liée à software et fault est liée à les deux: software et configuration). Ou les relations devraient-elles être conçues différemment? Si j'avais des relations un-à-plusieurs entre les tables, MySQL Workbench créerait automatiquement des clés étrangères dans les tables nécessaires. Mais tout ceci est MySQL Workbench créé automatiquement lorsque j'utilise des relations plusieurs-à-plusieurs.

Merci d'avance.

EDIT:

I ajoutée manuellement des données via phpmyadmin. Cependant, je suis en train d'exécuter cette requête:

SELECT software_version, configuration_name, actCritical 
FROM software 
LEFT JOIN configuration_has_software ON software.software_id = configuration_has_software.software_id 
LEFT JOIN configuration ON configuration.configuration_id = configuration_has_software.configuration_id 
LEFT JOIN software_has_fault ON fault.fault_id = software_has_fault.fault_id 
LEFT JOIN software ON software.software_id = software_has_fault.software_id; 

Je reçois une erreur:

1 066 - Non tableau unique,/alias: 'logiciel'

Suis-je sur la bonne voie droite?

EDIT2:

En fait, j'ai commencé à remettre en question ma conception. Je ne pense pas que je puisse relier des défauts spécifiques à une configuration spécifique avec cette conception car il n'y a pas de relation directe entre la configuration et la faute. Devrais-je le concevoir différemment?

+0

Lorsque vous avez des relations indirectes comme celle-ci, vous utilisez plusieurs jointures dans la requête pour obtenir des données connexes. – Barmar

+0

@Barmar J'ai ajouté une autre question, veuillez la vérifier si vous avez le temps – ilari100

+0

Lorsqu'une table apparaît dans plusieurs clauses FROM ou JOIN, vous devez leur donner des alias pour pouvoir les distinguer. – Barmar

Répondre

1

Pour corriger votre erreur, essayez ceci: Vous joignez deux fois le logiciel de la table, mais vous ne rejoignez pas la table des défauts.

SELECT software_version, configuration_name, actCritical 
FROM software 
LEFT JOIN configuration_has_software 
     ON software.software_id = configuration_has_software.software_id 
LEFT JOIN configuration 
     ON configuration.configuration_id = configuration_has_software.configuration_id 
LEFT JOIN software_has_fault 
     ON software.software_id = software_has_fault.software_id 
LEFT JOIN fault 
     ON software_has_fault.fault_id = fault.fault_id ; 

Je suppose que vous avez utilisé LEFT JOIN pour obtenir les logiciels répertoriés, même s'il n'y a pas de configuration (ou) défaut existe pour les logiciels (si ce n'est pas le cas, vous pouvez remplacer par INNER JOIN)

+0

Cela fonctionne, merci! J'ai parcouru ma requête SELECT plusieurs fois en essayant différentes approches et je n'ai pas trouvé d'erreur. Je suppose que je suis devenu aveugle à ma propre écriture :). Je suppose que ce même type d'approche peut être utilisé lorsque vous faites INSERT sur les mêmes tables? – ilari100

+0

Insertion dans toutes les tables à la fois? Nan. Voir ces messages [MySQL inserts] (http://stackoverflow.com/questions/5178697/mysql-insert-into-multiple-tables-database-normalization), [MySQL insère 2] (http://stackoverflow.com/questions/3860280/sql-insert-into-multiple-tables-dans-une-requête) – ramu

1

NON! Cela casserait 3NF. Si vous ne savez pas ce que c'est et/ou pourquoi vous avez probablement besoin d'étudier un peu plus sur les relations dans l'ER (modèle entité-relation). C'est un vaste sujet complexe que je ne peux pas expliquer ici. Mais il y a beaucoup de documentation sur Internet.