Помощь по схеме базы данных. Вложенность
Не не могу разобраться, как правильно сохранять вложенность заготовок при создании Блюда. То есть у меня есть блюдо Салат. Пользователь добавляет ингредиенты. 3 заготовки (родительские). У одной заготовки есть тройная вложенность, т.е. дети и предки. Я не пойму как в базе данных эти заготовки разместить, чтобы видна была эта вложенность. К примеру есть 3 родителя, но один из этих родителей может быть ребенком у одной из заготовок. Я уже подумал разделить таблицы. Блюдо-продукты и Блюдо-заготовки-дети_заготовки-продукты. Но не получается правильно сохранить вложенность. Такой сценарий. Пользователь создает новое Блюдо «Салат». Добавляет в состав блюда продукт «укроп» 100 грамм. Добавляет в состав блюда Заготовки «зажарка», вес которой равняется 200 грамм, «зелень» 100 грамм и «соус» 100 грамм. Но пользователю нужно в данное блюдо добавить Заготовку «соус», с весом 150 грамм (увеличивает на 50 грамм). Он меняет вес заготовки. При этом изменяется вес продуктов и заготовок, которые входят в указанную Заготовку «соус». Изменения веса Заготовки «соус» на 50 грамм, привели к изменению веса входящих в нее заготовок Зажарка, Зелень и Соус и продуктов. Нужно учесть, что заготовка Соус входит в состав иных блюд и у этой заготовки с продуктами вес иной. То есть изменения веса ингредиентов, не должны влиять на остальные блюда.
Не могу понять как схему правильно выстроить, чтобы эту вложенность можно было доставать. Сейчас на проекте есть таблицы dishes, dishes_composition, preparations, preparations_products, products. Помогите братья!
Ответы (1 шт):
В первом приближении можно вот так:
Ингредиент "Кастрюля" введен просто для обозначения корневого элемента рецепта. Количество того или иного ингредиента будут высчитываться по Вами задаваемой логике при вставке или изменении позиции. Из таблицы "Рецепт" можно убрать "ИД рецепта", ссылаясь на ИД корневого элемента из таблицы "Блюдо", но тогда будет сложнее выбирать записи, принадлежащие рецепту, тут некая "избыточность во благо", так сказать - одним простым запросом можно будет посчитать расход продуктов на всё блюдо, не надо будет ходить по дереву. Наименования в таблице "Рецепт" просто для наглядности.