Возможно, я бы выбрал столбец 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
.Если эта начальная и конечная дата охватывает более одной недели, то вы сохраняете только одну строку, а не несколько строк.