Хранение почасовой доступности с PostgreSQL - PullRequest
0 голосов
/ 19 сентября 2011

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

Моя идея состоит в том, чтобы сгенерировать двоичную строку, указывающую доступность для любого часа в неделю, используя «0» для недоступности и «1» для доступной.Затем я мог бы запросить двоичный столбец с целым числом для «текущего часа» с использованием побитового оператора «и».Строка будет выглядеть следующим образом:

# Open sunday at 6:00am and close at 6:00pm (repeats 0 for remainder of hours)
000000111111111111000000...

При просмотре страницы в 16:00 в воскресенье будет выполняться побитовое "и" с предыдущей строкой, а это:

# Sunday at 4:00pm (repeats 0 for remainder of hours)
000000000000000100000000

Есливозвращаемое побитовое сравнение привело к значению больше 1, запись в настоящее время доступна.

У меня два вопроса.Во-первых, какой тип данных я должен хранить значение как.Максимальное значение будет 168 бит (7 дней * 24 часа).Во-вторых, какие функции предоставляет Postgres, чтобы выполнить то, что я упомянул.Примерно так:

# String truncated for readability
WHERE some_column & $number_for_current_hour > 0

Спасибо за чтение!Любые отзывы приветствуются.

Ответы [ 2 ]

4 голосов
/ 19 сентября 2011

Возможно, вам будет лучше, если вы сохраните «Открытое время» и «Закрытое время». Это будет намного проще для разработчиков. Если у вас есть какая-то потребность в нескольких открытых периодах в течение дня, таких как места, которые открыты утром, закрыты на обед, а затем открыты снова днем, я предлагаю вам создать таблицу «времени открытия» с «Время открытия» и «Время закрытия», а также внешний ключ, ссылающийся на исходную таблицу, чтобы вы могли хранить несколько открытых периодов. Вы можете думать, что вы умны со своими битами или чем-то подобным, но на самом деле просто все усложняете. Кроме того, вы не можете приспосабливаться к вещам, происходящим в получасе или даже в более высоком разрешении. Перечитывая вопрос, я вижу, вы хотите хранить несколько дней. Если вам нужно разное время открытия для каждого дня, тогда мое второе решение будет работать хорошо. Иметь такой стол.

ID (INT), F_ID (INT), DAY_OF_WEEK (INT), OpenTime (время), CloseTime (время)

ID - это просто автоинкремент для этой таблицы, F_ID - внешний ключ к исходной таблице, день недели может быть целым числом или перечислением, представляющим день недели, OpenTime и CloseTime - поля «Time», которые могут хранить время без даты. Это должно сделать вещи намного более ясными для вас самих, и для всех, кто будет работать над кодом в будущем. Кроме того, поиск будет быстрее, так как вы можете индексировать свои поля времени. Выполнение двоичного xor эквивалентно использованию "LIKE"% word% 'для поиска строк, и его следует избегать.

0 голосов
/ 19 сентября 2011

Если бы это был MySQL, я бы посоветовал вам использовать тип данных SET, но, похоже, в PostgesSQL его нет.Вместо этого вам понадобится тип данных BIT, который работает, но не так удобно.

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