Я использую postgres-node
, но я думаю, что это проблема для всех, у кого есть объекты javascript, у которых есть подмассивы, которые они хотят сохранить в SQL. У меня есть объекты javascript с различным количеством (любой длины) массива функций:
{
name: "Ted",
features: ['Red Hair', 'Blue Eyes']
}
поэтому, когда у меня их несколько, javascript форматирует его так:
[
{
name: "Ted",
features: ['Red Hair', 'Blue Eyes']
},
{
name: "Ann",
features: ['Brown Hair', 'Blue Eyes', 'Big Smile']
}
]
Это здорово! Но как мне вернуть это из базы данных после нормализации? Я нормализовал это в своей базе данных следующим образом:
people
Таблица
+---+------------+
|id | Name |
+---+------------+
| 1 | Ted |
| 2 | Ann |
+---+------------+
features
таблица
+---+--------------+
|id | feature_name |
+---+--------------+
| 1 | Red Hair |
| 2 | Blue Eyes |
| 3 | Brown Hair |
| 4 | Big Smile |
+---+--------------+
и people_features
соединительная таблица
+---+-----------+-------------+
|id | person_id | feature_id |
+---+-----------+-------------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 2 |
| 4 | 2 | 3 |
| 5 | 2 | 4 |
+---+-----------+-------------+
Если я сделаю соединение следующим образом:
SELECT name, feature_name
FROM people
JOIN people_features ON people_features.person_id=people.id
JOIN features ON people_features.feature_id=features.id;
Я получаю одну строку для каждого человека. Это не то, чего я хочу.
Что я получаю:
[
{
name: "Ted",
feature_name: 'Red Hair'
},
{
name: "Ted",
feature_name: 'Blue Eyes'
},
{
name: "Ann",
feature_name: 'Blue Eyes'
},
{
name: "Ann",
feature_name: 'Brown Hair'
},
{
name: "Ann",
feature_name: 'Big Smile'
}
]
Что я хочу:
[
{
name: "Ted",
features: ['Red Hair', 'Blue Eyes']
},
{
name: "Ann",
features: ['Brown Hair', 'Blue Eyes', 'Big Smile']
}
]
Это кажется ужасным! Теперь мне нужно перебрать их и объединить одинаковых людей в один объект-человек. Мой другой вариант, кажется, делает запрос для людей
SELECT id, name
FROM people;
Что вернет:
[
{
id: 1
name: "Ted"
},
{
id: 2
name: "Ann"
}
]
И тогда мне нужно выполнить цикл и сделать отдельный SQL-запрос для каждого человека?
Для каждого человека:
SELECT feature_name
FROM features
JOIN people_features ON features.id=people_features.feature_id
WHERE people_features.person_id = $1
($1 — это идентификатор человека, через который я просматриваю)
И тогда я возвращался (для Теда):
[
{ feature_name: 'Red Hair' },
{ feature_name: 'Blue Eyes' }
]
Затем мне нужно удалить их из своих объектов (чтобы просто получить строку), а затем добавить их к объекту.
Является ли один из них лучшим способом сделать это? Я чувствую, что они оба действительно неэффективны.