2014-10-23 2 views
2
CREATE TABLE operating_period (
    id SERIAL NOT NULL PRIMARY KEY, 
    during TSTZRANGE NOT NULL, 
    -- other meta fields 
); 

Требования: 1. Ни один рабочий период не могут перекрываться друг с другомNon-перекрытие, непрерывные диапазоны временных меток (tstzrange) для открытия часов

Вопрос:

  1. Как добавить ограничение чтобы убедиться, что в часах работы нет перекрытия?
  2. С точки зрения скорости запроса, мне лучше с двумя столбцами (start_at, end_at) или является индексом GIST быстро для tstzrange?
  3. В схеме схема, tstzrange обычно используется? Или мне лучше с двумя столбцами?

ответ

5

Ответ на вопрос 1. ясно. Для того, чтобы убедиться, что это использование не перекрывать exclusion constraint:

CREATE TABLE operating_period (
    id serial PRIMARY KEY    -- PK is NOT NULL automatically 
,during tstzrange NOT NULL 
,EXCLUDE USING gist (during WITH &&) -- no overlap 
); 

Это реализуется с индексом GIST на during, который поддерживает множество типов запросов автоматически. Относящиеся ответ:

Ответы на 2. и 3. не ясно, потому что это действительно зависит от многих вещей. Оба имеют свои плюсы и минусы. В часы работы я, скорее всего, поеду с типами диапазонов в текущих версиях Postgres. Я бы также обеспечил ограничение [) границ для всех записей, чтобы все было просто. Подробности в first linked answer.

Если вы должны пойти с (start_at, end_at), вы будете заинтересованы в OVERLAPS оператора:

В любом случае, руководство здесь есть спросить один вопрос на вопрос, не весь список ...

Смежные вопросы