Проблема еженедельного распределения часов в Rails и Postgresql - PullRequest
0 голосов
/ 06 июня 2019

Если у меня есть список задач с определенными диапазонами дат, и задача разбита на еженедельные часы работы (т. Е. 30 часов с 2018-12-31 до 2019-01-06 ... и т. Д., Начиная сПонедельник).

Я хотел бы выполнить следующие операции:

  1. Показать все еженедельные часы всех задач для списка пользователей
  2. Суммаеженедельные часы для пользователя для всех его заданий на неделю
  3. Когда продолжительность задания изменена, создайте / уничтожьте чанки еженедельного часа.

Будет ли эффективнеесохранить эти еженедельные записи как

  1. дата начала / дата окончания / часы,
  2. год / номер недели / часы

Сохранение даты начала / окончания, вероятно, дастбольше гибкости для таблицы, так как она потенциально может хранить не еженедельные часы выравнивания.

Сохранение номера недели означает заданный диапазон дат, создание еженедельных фрагментов так же просто, как поиск номера недели даты начала и неделиномер даты окончания и заполнения тон недели между (без преобразования в диапазоны дат).Также упрощена проверка для обновления часов на неделю, если номер недели 1-53.

Интересно, если кто-то опробовал любой из этих вариантов и может дать любые указатели на свой предпочтительный вариант.

1 Ответ

1 голос
/ 11 июня 2019

Возможно, я бы выбрал столбец daterange .

Это дает вам гибкость при использовании чанков разного размера и позволяет определить исключающее ограничение для предотвращения перекрывающихся диапазонов.

Поиск строки для данной недели по-прежнемудовольно просто с помощью оператора «содержит» @>, например, where the_column @> to_date('2019-24', 'iyyy-iw') находит строки, содержащие номер недели 24 в 2019 году.

Выражение to_date('2019-24', 'iyyy-iw') возвращает первый день (понедельник)указанная неделя.

Можно также найти все строки, которые находятся между двумя неделями, однако построение соответствующего диапазона дат выглядит немного некрасиво.Вы можете построить диапазон с первым и последним днем: daterange(to_date('2019-24', 'iyyy-iw'), to_date('2019-24', 'iyyy-iw') + 6, '[]')

Или создать диапазон с исключительным верхним диапазоном с первым днем ​​следующей недели: daterange(to_date('2019-24', 'iyyy-iw'), to_date('2019-25', 'iyyy-iw'), '[)')

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

Еще одним недостатком использования диапазонов (если вам действительно не нужна гибкость) является то, что они занимают больше места, чем два целочисленных столбца (14 байт вместо 8 или даже 4 с двумя smallint).Таким образом, если размер таблицы имеет какое-либо значение, то ваше текущее решение со столбцами год / неделя более эффективно.

" Сохранение номера недели означает заданный диапазон дат, создание еженедельных кусков так же просто, как поиск номера недели даты начала и номера недели даты окончания "

Если вы вводите начальную и конечную даты для начала (а не «номер недели»), то я бы определенно выбрал столбец daterange.Если эта начальная и конечная дата охватывает более одной недели, то вы сохраняете только одну строку, а не несколько строк.

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