SQL Adjacency List or Materialized Path? Проектирование схемы SQL
Условная логика (на фото схема таблиц):
- есть заготовка "зелень" весом 100 грамм. Она состоит из продуктов "укроп" и "петрушка" - по 50 грамм;
- есть заготовка "соус" весом 160 грамм. Она состоит из продуктов "картошка", "укроп" и "петрушка" - 100, 30 и 30 грамм соответственно;
- создаем заготовку "зажарка". Она состоит из продукта "говядина" 100 грамм и заготовки "зелень". В составе "зажарки" заготовка "зелень" поменяла вес (вместо 100 грамм теперь весит 40 грамм), то есть у последний поменялся вес продуктов ("укроп" и "петрушка" весят по 20 грамм). Хорошо, этот момент записали в таблицу;
- создаем заготовку "бульон". В состав данной заготовки входит "зажарка", но ее вес изменен пользователем (вместо 120 грамм теперь весит 300 грамм). Соответственно в составе "бульона" у ингредиентов "зажарки" поменялся вес - говядина весит 215 грамм и заготовка "зелень" весит 85 грамм ("укроп" и "петрушка" - по 42.5 грамм).
Вопрос как построить такую схему базы данных, чтобы можно было сохранять вложенность "бульон"->"зажарка"->"зелень"-> и так далее (любая вложенность) с учетом изменения веса вложенных ингредиентов? Изменение веса вложенной заготовки и ее продуктов не должно влиять на родительские заготовки. То есть при осуществление выборки, к примеру заготовки "бульон", нужно сразу получить вес "зажарки", вес входящей в нее продукта, а также (важно!) вес заготовки "зелень" и ее продуктов ("укроп" и "петрушка"). Для этого должен создаваться отдельный набор ингредиентов в составе заготовки.
Дайте пожалуйста совет, как мне настроить создание вложенных сущностей с набором ингредиентов с учетом изменений весов. Куда копать?
Если, к примеру, 1 вложенность я смог побороть "зажарка"->"зелень" (с продуктами), то вложенность "бульон"->"зажарка"->"зелень" (продукты) или более глубока вложенность не получается. Сложность в том, что нужно делать копии состава вложенной заготовки. Может столбец с JSON данными сделать и туда всю вложенность впихивать?