2016-08-23 4 views
0

Следующая картина является частью базы данных результатов тестирования программного обеспечения, что я проектирования: designвнешних ключей во многих-ко-многим

Мой вопрос связан с таблицей fault. Нужен ли мне внешний ключ, связанный с таблицей configuration в моей таблице fault, чтобы сделать запрос, который, например, вернет мне данные, связанные со всеми тремя таблицами (configuration связан с и fault связан с оба: software и configuration). Или должны ли отношения разрабатываться по-разному?

Если у меня были отношения «один ко многим» между таблицами, MySQL Workbench автоматически создавал внешние ключи в необходимых таблицах. Но это все MySQL Workbench автоматически создается, когда я использую отношения «многие ко многим».

Заранее спасибо.

EDIT:

Я вручную добавить некоторые данные через PHPMyAdmin. Тем не менее, я пытаюсь выполнить этот запрос:

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; 

Я получаю сообщение об ошибке:

1066 - не уникальный настольный/псевдоним: 'программное обеспечение'

я на правильном пути?

EDIT2:

На самом деле я начал сомневаться мой дизайн. Я не думаю, что я могу связать конкретные ошибки с конкретной конфигурацией с этим дизайном, поскольку между конфигурацией и ошибкой нет прямой связи. Должен ли я проектировать его по-другому?

+0

Если у вас есть косвенные отношения, подобные этому, вы используете несколько запросов в запросе для получения связанных данных. – Barmar

+0

@Barmar Я добавил еще один вопрос, пожалуйста, проверьте его, если у вас есть время – ilari100

+0

Когда таблица появляется в нескольких предложениях 'FROM' или' JOIN', вам нужно дать им псевдонимы, чтобы вы могли их отличить. – Barmar

ответ

1

Чтобы устранить эту проблему, попробуйте выполнить следующие действия: Вы присоединяетесь к программному обеспечению таблицы дважды, но не присоединяетесь к таблице сбоев.

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 ; 

Я предполагаю, что вы использовали LEFT JOIN для получения программного обеспечения, перечисленные даже если нет конфигурации (или) существует ошибка для тех программного обеспечения (если это не так, то вы можете заменить INNER JOIN)

+0

Это работает, спасибо! Я много раз просматривал свой запрос SELECT, пытаясь использовать разные подходы, и я просто не нашел ошибку. Наверное, я стал слепым к своему письму :). Думаю, такой же подход можно использовать при выполнении INSERT в одни и те же таблицы? – ilari100

+0

Вставка во все таблицы сразу? Неа. См. Эти сообщения [MySQL inserts] (http://stackoverflow.com/questions/5178697/mysql-insert-into-multiple-tables-database-normalization), [MySQL вставляет 2] (http://stackoverflow.com/questions/3860280/SQL-вставка-в-множественные столы в одном-запросе) – ramu

1

NO! Это сломает 3NF. Если вы не знаете, что это такое и/или почему вам, вероятно, нужно немного изучить отношения в ER (модель отношения сущности). Это обширная сложная тема, которую я не могу здесь объяснить. Но в Интернете есть много документации.

Смежные вопросы