Лучший способ справиться с этим, минимизируя объем данных для сохранения и сохранения гибкости, - это использовать диапазоны даты и времени. Для праздничного тарифа вы можете оставить два столбца тарифа (обычный / праздничный) или вести отдельные записи с флагом, указывающим, является ли цена обычным днем или праздничным днем.
У вас есть выбор, как представлять эту информацию. Вы можете представить его с помощью столбцов даты и времени, настроенных на произвольную начальную дату. Это было бы просто с точки зрения столбцов, но это могло бы быть запутанным в использовании. Другой способ заключается в использовании двух столбцов: Day_of_Week (tiny int) и Time (datetime без даты или только времени, если ваша СУБД поддерживает это).
Я бы порекомендовал второй вариант. Таким образом, ваш стол может выглядеть так:
PRICE (
id int identity
, product_id int
, day_of_week int
, start_time time
, end_time time
, regular_price money
, holiday_price money
)
Конечно, вы захотите добавить ограничения первичного и внешнего ключа ...