Пишу движок для сайта с рецептами... Вот задумался о логической модели Mysql.
Есть рецепт, в нем присутствует блок, например:
Основные ингредиенты (яблоко, свекла, картофель и т.д.) ну и сам рецепт
Я вижу это так: Создаем таблицу с рецептами (где сам рецепт)
Таблица основных ингредиентов (id, название ингридиента, каллорийность)
Связующая таблица ингридиентов и рецепта (id рецепта, id ингредиента)
Правильно ли будет? Если я захочу добавить еще несколько таких блоков вроде: География кухни, способ приготовления и т.д.
И для каждого из таких блоков буду создавать таблицу с вариантами и связующую таблицу
Исходя из описания, вы верно разбили сущности на 3 таблицы.
Вам не придется создавать промежточную таблицу если рецепт будет принадлежать к одной географической кухне (отношение один -к-одному). Когда вы добавите таблицу География кухни, то просто id из этой таблицы сопоставите полю в таблице рецептов (geo_region_id)
Если же вы реализуете отошение один-ко-многим, то без промежуточной таблицы не обойтись.
ИМХО тянуть ингредиенты из таблиц - устанете заполнять рецепт. Оно конечно правильно с академической точки зрения, но с реальной даст профит пожалуй только в том, что ингредиенты будут везде называться одинаково. Зато если планируете давать пользователю заводить рецепт - как заводить новый ингредиент? А если дать это пользователю - в результате 100% получите 20 вариантов майонезов.
По-моему тут таблица для связи лишняя. Просто добавляете поле, например ingredients и в него через запятую все ингридиенты из таблицы ingredients.
если будут ещё "блоки" то просто новое поле.
Минус здесь в том, что если вы захотите сделать поиск рецептов по ингридиентам это будет дольше, нежели с таблицей связей, а плюс - проще находить сами ингридиенты.
Можно сделать "глобальную" таблицу связей, где будет хранится адишник, айдишник для связи, исходная таблица и таблица с которой связывается
Минус в том, что при поиске рецепта котрый покрывает ваши продукты в холодильнике, придется доставать все записи из таблицы. Или извращаться с Like%.
Это неправильно.