Прошу прощения, если мой вопрос плохо сформулирован, я объясню более подробно ниже.Вставка данных в разные ссылочные таблицы
Я пишу свой API в hapi.js, поэтому язык программирования - это javascript. версия Postgres: 9.4.7
Моя база данных имеет 3 таблицы: рейтинги
- ratings_tags
- теги
таблице "ratings_tags" содержит которые рейтинги помеченных что теги.
У меня есть api с конечной точкой /data/{id}
, где я уже могу получить один рейтинг. Запрос, который работает, но не может быть лучше, заключается в следующем:
SELECT
r.id,
r.score,
r.comment,
r.datetime,
r.type,
r.customer_id,
array_remove(array_agg(t.tag), NULL) as tags
FROM
ratings r
LEFT OUTER JOIN
ratings_tags rt
ON
r.id = rt.rating_id
LEFT OUTER JOIN
tags t
ON
rt.tag_id=t.id
WHERE
r.id = $1
GROUP BY
r.id
Я написал внешний интерфейс, так что я могу редактировать Datapoint и теперь я хочу, чтобы сохранить его снова. На данный момент я в основном забочусь о тегах, но он должен сохранить все это. То, что я думаю, что он должен делать:
- Вставьте всю информацию рейтинг обратно в таблицу
ratings
- Вставить все теги, которые в настоящее время не существует в таблице
tags
- Вставьте отношения между рейтингом и теги в таблицу
ratings_tags
, ЕСЛИ они уже существуют. - Как-то удалить отношения, которые больше не должны существовать.
Я думаю, что было бы хорошо удалить все отношения между сохраненным рейтингом и его тегами перед сохранением нового?
Я пробовал много, но я просто не могу придумать правильный запрос, который должен выполнить api, если я хочу сохранить datapoint до /data/{id}
из-за отношения к тегам.
UPDATE
Вот первые два шага, которые, кажется, работают:
# STEP 1 (values are placeholders)
INSERT INTO ratings(rating_id, score, comment, datetime, type, customer_id)
VALUES(r.id, r.score, r.comment, r.datetime, r.type, r.customer_id);
# STEP 2
CREATE OR REPLACE FUNCTION insertTagsFromArray(varchar[]) RETURNS void AS $$
DECLARE
new_tag varchar;
BEGIN
FOREACH new_tag IN ARRAY $1
LOOP
INSERT INTO tags(tag)
SELECT (new_tag)
WHERE NOT EXISTS (SELECT tag FROM tags WHERE tag = new_tag);
END LOOP;
END;
$$ LANGUAGE plpgsql;
Большое спасибо за помощь! Это определенно проще в нескольких шагах, спасибо за этот совет. Я думаю, что у меня есть первые два шага, поскольку они простые вставки, и я думал, что должен был сделать это в одном запросе, но я до сих пор не могу придумать, как сделать третий шаг. Язык программирования - это javascript, поскольку я программирую API с помощью hapi.js. Версия Postgres - 9.4.7. Я обновляю свой пост за секунду, может быть, вы можете посмотреть, правильно ли я сделал это? –
Извините, в первый раз я даже слышал о hapi.js! – e4c5
Нет проблем. Я только пытаюсь написать правильные запросы на данный момент, я буду интегрировать их в api позже. На данный момент меня интересуют только запросы. –