Как вы храните дни таблицы в реляционной базе данных?
Обычно нет.Обычно вы сохраняете дату и извлекаете день, когда вам это нужно.Одна потенциальная проблема с этим кодом.,,
CREATE TABLE `entity_prices` (
`day` tinyint(2) DEFAULT NULL,
`price` int(11) DEFAULT NULL,
`entity_id` int(11),
PRIMARY KEY (`day`, `entity_id`),
FOREIGN KEY (`entity_id`) REFERENCES Entities(`id`)
);
.,,является то, что вы можете хранить только одну строку для каждого дня для каждой сущности.Например, вы можете сохранить это.
day price entity_id
--
1 13 27
2 14 27
3 13 27
...
25 15 27
Сохраняя строку {25, 15, 27}
, скажем, 2018-09-25, вы не можете также сохранить строку {25, 15, 27}
2018-10-25.
Кроме того, это первая строка текущих данных?Это осталось с прошлого года или 15 лет назад?Вы не можете сказать, глядя на это.Это может нарушать одну из основ реляционной теории: все данные представлены строками столбцов в таблицах.Если вы каким-то образом знаете, что первая строка является текущей, то эти данные (сведения о возрасте первой строки) поступают из вне базы данных.
Кроме того, сегодня 25-е число.Вы не можете вставить строку на сегодня для entity_id 27;Вы получите дубликат первичного ключа.Вместо этого вы должны либо обновить строку для 25-го числа, либо удалить ее перед вставкой.В обоих случаях теряют данные для строки {25, 15, 27}
.
Независимо от того, зависит ли что-либо из этого от приложения, но это имеет значение гораздо чаще, чем нет.
Есливы сохраняете дату вместо дня, вы можете всегда вставить одну строку для entity_id 27 на сегодня.Вы всегда знаете, представляет ли строка данные за текущий день, месяц или год.Вы всегда можете извлечь день, когда вам это нужно.(extract (day from date <your date column>) where <your date column> between '2018-09-01' and '2018-09-30'
).И нет существенного снижения производительности, если у вас есть dbms, который может создавать индексы для выражений, или если вы регулярно удаляете старые строки.
Предлагаемая структура в MySQL (скопированная выше) также страдает от других проблем.Столбец «день», когда он объявлен как подписанный tinyint, может хранить значения от -128 до 127. Большинство из этих значений недопустимы, но допустимые значения вообще трудно применить в MySQL (MySQL не применяет ограничения CHECK), и по существу невозможно, когда вы храните «день», не сохраняя при этом месяц.Вместо этого сохранение даты решает подобные проблемы.
В столбце «цена» есть похожие проблемы - то, что называется ценой, никогда не должно быть отрицательным.Но без поддержки ограничений CHECK разработчик базы данных остается в поиске обходных путей - внешних ключей, триггеров и т. Д.