Хранение списка сущностей над объединенными таблицами - PullRequest
0 голосов
/ 07 мая 2018

Backgroud

По сути, я хочу хранить что-то вроде:

{
  id : 1, 
  name : 'john', 
  favorite_pets : ['cat', 'dog'], 
  favorite_colors : ['red', 'white', 'green']
}

В реляционной базе данных с тремя таблицами:

Стол основной:

id name
1  John

Таблица fav_pets:

id pet
1  cat
1  dog

Таблица fav_colors:

id pet
1  red
1  white
1  green

Задача

Я хочу запрос SQL, который возвращает это:

id  name  pet  color
1   john  cat  red
1   john  dog  white
1   john  null green

Проблема в том, что если я сделаю:

select * from main 
outer join fav_pets on main.id=pet.id 
outer join fav_colors on main.id=fav_colors.id;

Будет возвращен набор результатов с 6 строками:

id  name  pet  color
1   john  cat  red
1   john  cat  white
1   john  cat  green
1   john  dog  red
1   john  dog  white
1   john  dog  green

Можно ли выполнить загрузку объекта без повторения строк в одном запросе SQL?

1 Ответ

0 голосов
/ 07 мая 2018

Вы в настоящее время присоединяетесь в отличие от сущностей по первичному ключу. Вам нужно присоединиться по внешним ключам. Если у Джона могут быть любимые домашние животные и любимые цвета, то в главной таблице должны быть столбцы для fav_pet_id и fav_color_id, которые имеют внешние ключи для fav_pet.id и fav_color.id. Вам также нужно изменить имя столбца в fav_colors с pet на color. После внесения этих изменений ваш запрос должен выглядеть следующим образом:

select main.name, fav_pets.pet, fav_colors.color 
from main 
left outer join fav_pets on main.pet_id=pet.id 
left outer join fav_colors on main.color_id=fav_colors.id;

Читайте о нормализации таблицы, первичных ключах и внешних ключах. Начните по этой ссылке, чтобы начать https://www.w3schools.com/sql/sql_create_db.asp.

...