Помогите разработать схему баз данных
MaZaHaKeR
Помогите разработать схему баз данных
Новичок, ток начал изучал сей предмет и еще не до конца понимаю всё это...
Связи вроде знаю хорошо, а как их применить на практике соображаю туго.
Есть блюда и есть продукты, используемые в приготовлении блюд. Есть калькуляция блюда – описание, сколько и каких продуктов используется для приготовления определенного количества блюд. Калькуляция может меняться с течением времени.
Необходимо создать базу данных, которая бы хранила список продуктов, блюд и калькуляцию блюд. База должна давать ответы на следующие вопросы:
- Сколько и каких продуктов нужно на приготовление определенного количества указанного блюда на указанный момент времени?
- Для приготовления каких блюд используется указанный продукт на указанный момент времени?
Ответы:
Андрей
Самый простой вариант: связь многие-ко-многим с дополнительными параметрами: таблица "блюда", таблица "продукты" и таблица связи продуктов с блюдами "блюдо_продукт"
В этом случае таблица связи содержит ключ блюда, ключ продукта, кол-во этого продукта, дату начала периода и дату конца периода.
Первоначально дата конца периода содержит, например, 9999-12-31. Для удаления продукта из блюда просто меняем дату конца периода. Для замены кол-ва продукта в существующей записи меняем дату конца периода и создаём новую запись с другим кол-вом и актуальной датой начала периода.
В этом случае запрос на получение состава борща 13.06.2015 года выглядит примерно так:
SELECT
продукты. название,
блюдо_продукт. количество
FROM продукты
INNER JOIN блюдо_продукт
ON блюдо_продукт. ключ_продукта = продукты. ключ
INNER JOIN блюда
ON блюдо_продукт. ключ_блюда = блюда. ключ
WHERE
'2015-06-13' BETWEEN блюдо_продукт. начало_периода AND блюдо_продукт. конец_периода
AND блюда. название = 'борщ'
P.S. Можно, конечно, обойтись только датой начала, но это очень сильно усложнит запросы на получение данных. Но в подобных системах запросов на получение на порядки больше, чем на изменение. Потому лучше немного усложнить логику добавления / изменения данных и упростить логику получения.
|