Можно ли создать внешний ключ для указания на неуникальный столбец в таблице версий диапазона дат в PostgreSQL? - PullRequest
0 голосов
/ 03 октября 2018

Я хотел бы сделать две вещи в PostgresSQL:

  • строки версий в таблице по диапазону дат
  • обеспечить целостность таблицы путем настройки внешних ключей одного столбца

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

Подробный пример:

Мне нужно версия содержимоготаблица на основе диапазона дат (поэтому в любой конкретный момент времени для уникального индекса (customId, validFrom, validUntil) есть только одна строка (перекрывающихся диапазонов нет). но важно, чтобы ни один изэти столбцы уникальны сами по себе.

Используя этот метод, я могу запросить мою таблицу и получить действительный объект для любого момента времени, но я не мог понять, как связать эту таблицу с помощью клавиши customIdв другую таблицу, чтобы обеспечить целостность таблицы.

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

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

Пример по данным:

таблица a :

  • id (PK)
  • custom_id (уникальный в любой момент времени через вышеуказанный составной уникальный индекс)
  • valid_from (отметка времени, сохраняющая начало действия a )
  • valid_until(отметка времени, сохраняющая конец срока действия a )

таблица b :

  • id (PK)
  • a__custom_id (уникально в любой отдельный момент времени)
  • valid_from (отметка времени, в которой хранится начало действия b )
  • valid_until (отметка времени, сохраняющая конец срока действия b )

Я хотел бы вставить только те строки в таблицу b , которые

  • b.a__custom_id существует в a.custom_id
  • b.a_custom_id, b.valid_from, b.valid_until является уникальным

1 Ответ

0 голосов
/ 04 октября 2018

Вы не можете легко иметь как внешние ключи, так и исторические данные.

Одним из способов будет использование диапазона допустимости как части первичного ключа, но тогда вам придется обновлять много строк всякий раз, когда вы изменяете запись вссылочная таблица.

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

Таблица истории будет иметь ограничение исключения для первичного ключа и временного диапазона.

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