Дизайн базы данных: как хранить дни месяца в таблице? - PullRequest
0 голосов
/ 25 сентября 2018

Как вы храните дни месяца в реляционной базе данных в таблице?Для проекта я должен сохранять цены в зависимости от дня месяца.Например:

Day of month   price
--------------------
Day 1          32
Day 2          50
Day 29         60
Day 30         28
Day 31         49

Можно ли использовать отдельный столбец для всех дней, хотя и немного избыточный?Например, февраль месяц никогда не имеет более 29 дней.Несколько экземпляров сущностей полагаются на цены и дни.

Для простоты я не предпочитаю использовать две дополнительные таблицы, сохраняющие месяцы и связанные дни соответственно.

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

В конце концов, это было решением моей проблемы.(спасибо Mithu CN и Филбурту)

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`)
);

Final result

Замените entity_id на имя столбца, на который вы хотите сослаться.

0 голосов
/ 25 сентября 2018

Как вы храните дни таблицы в реляционной базе данных?

Обычно нет.Обычно вы сохраняете дату и извлекаете день, когда вам это нужно.Одна потенциальная проблема с этим кодом.,,

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 разработчик базы данных остается в поиске обходных путей - внешних ключей, триггеров и т. Д.

0 голосов
/ 25 сентября 2018

Просто хочу, чтобы вы немного уточнили Если вы используете MySQL

 CREATE TABLE `pice_aganist_date` (
      `day` tinyint(4) NOT NULL,
      `price` int(11) DEFAULT NULL,
      PRIMARY KEY (`day`)
    )

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...