Как лучше всего скопировать / вставить на CASCADE в PostgreSQL? - PullRequest
2 голосов
/ 02 апреля 2020

Мне интересно, как лучше всего сделать "каскадное копирование / вставку" связанных элементов в PostgreSQL.

Я сделал простой пример, чтобы проиллюстрировать мой прецедент:

Определение базы данных

Три объекта: Version, Element, ElementEffect.

  • Версия имеет много элементов.
  • Элемент принадлежит к одной версии.
  • Элемент имеет много эффектов элемента.
  • Эффект принадлежит одному элементу.

enter image description here

Проблема

Допустим, у нас есть 1 версия с 1 элементом с 1 эффектом в базе данных.

enter image description here

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

Например, если создается новая версия: Версия 2 :

  • База данных должна скопировать элемент существования в новый, ссылающийся на новую версию.
  • Новый элемент должен создать новый эффект элемента, ссылающийся на новый элемент.

enter image description here

Пришла новая версия. Новая версия имеет те же элементы и эффекты, что и предыдущая версия, и одно изменение: текст эффекта элемента изменен с нуля на «loremp ipsum».

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

  1. Создать копию для всех элементов и их взаимосвязей , относящихся к версии -> Element> ElementEffect

  2. Обновление данных для новых элементов копирования с изменениями, внесенными в новую версию.

Вопрос

  1. Каков наилучший способ получения реквизита 1 в PostgreSQL с / без Sequelize ORM и Node.js?
  2. Есть ли у PostgreSQL встроенная функция, позволяющая сделать это возможным?
  3. Должен ли я решить эту проблему на уровне базы данных (, возможно, с psql правилами и триггерами ) или на уровне кода с помощью сценария узла, выполняющего запросы и транзакции?

Реквизиты решения

  • Я строю это на PostgreSQL, используя Sequelize в качестве ORM под управлением Node.js, поэтому, если я смогу построить это с помощью Sequelize, будет еще лучше.

  • Мой вариант использования намного сложнее, чем пример. У меня более 15 организаций, включая отношения «многие ко многим», поэтому решение необходимо масштабировать с течением времени. То есть я не хочу проверять это каждый раз, когда добавляю новую сущность или изменяю существующую.

1 Ответ

0 голосов
/ 11 апреля 2020

Лучшая идея, которая приходит мне в голову, - создать хранимую процедуру в psql, такую ​​как make_new_version (my_table, oldid, newid), и эта процедура должна скопировать строки со старым идентификатором в таблице my_table и заменить oldid на newid. эта функция также должна возвращать идентификатор из вновь вставленных строк, чтобы сделать еще один вызов той же функции для копирования строк для следующего объекта.

Когда вы тестируете и подтверждаете эту хранимую процедуру, вы можете вызвать ее из другой процедуры (почти ) без тестирования.

Таким образом вы решите проблему на уровне базы данных.

...