Мне интересно, как лучше всего сделать "каскадное копирование / вставку" связанных элементов в PostgreSQL.
Я сделал простой пример, чтобы проиллюстрировать мой прецедент:
Определение базы данных
Три объекта: Version, Element, ElementEffect.
- Версия имеет много элементов.
- Элемент принадлежит к одной версии.
- Элемент имеет много эффектов элемента.
- Эффект принадлежит одному элементу.
Проблема
Допустим, у нас есть 1 версия с 1 элементом с 1 эффектом в базе данных.
В моем случае я должен иметь возможность создавать новую версию, копируя все элементы и эффекты элементов предыдущей версии, и обновлять некоторые из них.
Например, если создается новая версия: Версия 2 :
- База данных должна скопировать элемент существования в новый, ссылающийся на новую версию.
- Новый элемент должен создать новый эффект элемента, ссылающийся на новый элемент.
Пришла новая версия. Новая версия имеет те же элементы и эффекты, что и предыдущая версия, и одно изменение: текст эффекта элемента изменен с нуля на «loremp ipsum».
Необходимо выполнить следующие операции:
Создать копию для всех элементов и их взаимосвязей , относящихся к версии -> Element> ElementEffect
Обновление данных для новых элементов копирования с изменениями, внесенными в новую версию.
Вопрос
- Каков наилучший способ получения реквизита 1 в PostgreSQL с / без Sequelize ORM и Node.js?
- Есть ли у PostgreSQL встроенная функция, позволяющая сделать это возможным?
- Должен ли я решить эту проблему на уровне базы данных (, возможно, с psql правилами и триггерами ) или на уровне кода с помощью сценария узла, выполняющего запросы и транзакции?
Реквизиты решения
Я строю это на PostgreSQL, используя Sequelize в качестве ORM под управлением Node.js, поэтому, если я смогу построить это с помощью Sequelize, будет еще лучше.
Мой вариант использования намного сложнее, чем пример. У меня более 15 организаций, включая отношения «многие ко многим», поэтому решение необходимо масштабировать с течением времени. То есть я не хочу проверять это каждый раз, когда добавляю новую сущность или изменяю существующую.