это правильный способ структурировать таблицы для этого типа отношений?
Да, но тогда вам не нужно иметь эффект от 1 до 4 на столе с ингредиентами.
нужно ли устанавливать внешние ключи, если я не планирую обновлять таблицы?
Да. Единственный способ получить данные, которые вам нужны, - это объединить три таблицы. Без внешних ключей (или, более конкретно, соответствующих индексов) это может плохо работать с запросами. Конечно, в целом у вас есть небольшое количество строк, но использование внешних ключей является хорошей практикой, которой нужно следовать в сценарии такого типа.
существует ли запрос, который может принимать набор имен ing_names и возвращать только
eff_names, которые пересекаются?
Я думаю, что вы ищете что-то вроде этого:
SELECT e.eff_name
FROM ingredients i
INNER JOIN ing_eff_xref ie ON ie.ing_id = i.ing_id
INNER JOIN effects e ON e.eff_id = ie.eff_id
WHERE i.ing_name = 'Abecean Longfin ';
Если вам нужно увидеть эффекты для нескольких ингредиентов, вы можете настроить выражение WHERE следующим образом:
WHERE i.ing_name IN ('Abecean Longfin ','Eye of Sabre Cat ','Bear Claws ');
Возможно, вам не понадобятся повторяющиеся эффекты, поэтому вы можете выполнить команду SELECT DISTINCT, чтобы устранить их.
Могут ли эффекты зелья складываться в Скайриме? Если они в стеке, то вы можете выполнить запрос GROUP BY с COUNT, чтобы получить суммированное значение каждого эффекта:
SELECT e.eff_name, count(*) as value
FROM ingredients i
INNER JOIN ing_eff_xref ie ON ie.ing_id = i.ing_id
INNER JOIN effects e ON e.eff_id = ie.eff_id
WHERE i.ing_name IN ('Eye of Sabre Cat ','Bear Claws ')
GROUP BY e.eff_name;
В этом запросе будут перечислены 6 эффектов со значением 1, а у «Восстановить выносливость» будет значение 2. Не уверен, работают ли зелья Skyrim таким образом или нет, но это была просто дополнительная мысль.