Подтвердить что ты не робот

Многочисленные соединения Postgres

Это postgres db. Я пытаюсь вытащить имена породы собак (Cane Corso, Labrador и т.д.) Из таблицы породы, чтобы отобразить на основе внешних ключей, расположенных на столе для животных. Моя проблема заключается в том, что таблица животных имеет два внешних ключа к этой таблице одного породы, и я продолжаю получать ошибки с моим запросом. Имя первой породы будет возвращаться на основе левого соединения, но второе я не могу получить имя для отображения, поскольку у меня уже есть левое соединение. Ниже приведен упрощенный план того, что я пытаюсь сделать:

breed table (ID, BreedName)
animal table (ID, breedID, breed2ID)

SELECT animal.ID, breed.BreedName FROM animal LEFT JOIN breed ON animal.breedID=breed.ID WHERE animal.ID='7';

Что мне нужно сделать, так это получить BreedName, чтобы присоединиться к animal.breed2ID, с которым я терплю неудачу. Я мог бы легко жестко закодировать имена породы и отображать их в приложении, но это не способствует изменениям, добавлениям или удалениям имен породы в базе данных.

4b9b3361

Ответ 1

просто выполните другое соединение в той же таблице:

SELECT animal.ID, breed1.BreedName as BreedName1, breed2.BreadName as BreadName2 
FROM animal 
   LEFT JOIN breed as breed1 ON animal.breedID=breed1.ID 
   LEFT JOIN breed as breed2 ON animal.breedID=breed2.ID 
WHERE animal.ID='7';

Ответ 2

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

Когда вы видите повторяющиеся типы свойств на сущности, в вашем случае breedID и breed2ID вы обычно должны чувствовать запах чего-то гнилого во всех случаях, кроме очень редких случаев.

В идеальном дизайне вы сделаете следующее.

1. Держи свою породу как есть.

2.Выберите животное, похожее на животное (animal_id, animal_name).

3. Добавьте новый стол animal_breed. Это будет выглядеть как animal_breed (animal_breed_id, animal_id, breed_id). Поскольку animal_bread_id является pk и уникальным ключом (animal_id, breed_id) с внешними ключами, указывающими на соответствующие таблицы.

Эта конструкция позволяет данному животному взять один или несколько типов породы, не имея необходимости возиться с вашим запросом, чтобы вернуть несколько пород назад. Ваш нынешний дизайн становится кошмаром каждый раз, когда у вас есть животное с дополнительной породой. У этого есть потенциал, чтобы убить производительность и сделать обслуживание кошмаром, и, помимо всего прочего, это не просто дизайн базы данных.