Лучшая практика для сохранения ряда дат в SQL - PullRequest
0 голосов
/ 14 октября 2019

Я переделываю некоторые старые программы, и в одной из них мне нужно сохранить повторяющиеся серии дат в базе данных. Пользователь выбирает дни в диапазоне от 1 до 31 и месяцы в диапазоне от 1 до 12 в форме PHP. Возможен несколько вариантов. Должен быть предоставлен хотя бы один из них.

Затем я буду использовать ежедневное запланированное задание, чтобы проверить, задано ли значение (день и месяц), и если да - сделать что-то.

ВСтарая система, которую я сохранил, выглядит следующим образом:

| Days | Months |

|1,2,5,13,15 | 1,2,3,4,5,6,7,8,9,10,11,12|

Затем я взорвал каждую строку в PHP-файле, запущенную запланированной задачей, и прошел итерацию по массиву. Если одна из дат действительна - сделайте что-нибудь.

Какова наилучшая практика для этого варианта использования? Я думал о некоторых решениях, таких как «сохранение всех возможных результатов дней и месяцев в виде отдельных строк в таблице сопоставления», но я не думаю, что это элегантное решение ... и оно должно быть редактируемым после реализации.

Есть предложения?

Ответы [ 3 ]

1 голос
/ 14 октября 2019

Я думаю, что вы просматриваете три таблицы.

В первой таблице записываются группы, присваивается им последовательный идентификатор группы и любые другие свойства, которые необходимо записать для группы дат в целом (запрашивающий пользовательid).

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

Третья таблица такая же, как для второй, но для месяцев.

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

Если вы ожидаете большой объем данных и \ или большое количество повторов из одних и тех же групп, то вы можете рассмотретьвозможность повторного использования групп дней и месяцев. Это будет похожий дизайн таблицы, но таблицы 2 и 3 будут иметь свои собственные идентификаторы группы, а таблица 1 будет иметь два дополнительных столбца: один для группы дней и один для группы месяцев.

0 голосов
/ 14 октября 2019

Я думаю, вы должны расширить данные в базе данных. Ясно, что вам нужна таблица groups (или что-то в этом роде) с одной строкой на группу:

create table groups (
    group_id int identity(1, 1) primary key,
    . . .  -- additional columns
);

Затем разверните даты для каждой группы для расписания:

create table groups_schedule (
    group_schedule_id int identity(1, 1) primary key,
    group_id int references groups(group_id),
    month int,
    day int
);

Это требует умножения данных в базе данных . Тем не менее, я думаю, что это более точное представление. Кроме того, это даст вам больше гибкости в будущем, поэтому вы не будете привязаны конкретно к спискам месяцев / дней. Например, у вас может быть день «25» в большинстве месяцев, но не декабрь.

0 голосов
/ 14 октября 2019

Кажется, вы можете использовать схему, подобную размеру, и прикреплять пары день-месяц к разным объектам. Предположим, сущность называется «задача».

| tasks   |            | days     |            | months   |
| ------- |            | -------- |            | -------- |
| id_task |            | id_day   |            | id_month |
| ...     | >---M:1--- | id_month | >---M:1--- | month    |
| id_day  |            | day      |

Не забудьте добавить проверочные ограничения для столбцов day (1-31) и month (1-12).

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