gpt4 book ai didi

javascript - 在 PostgreSQL 中 COPY/INSERT ON CASCADE 的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-01 17:17:48 24 4
gpt4 key购买 nike

我想知道在 PostgreSQL 中执行相关元素的“级联复制/插入”的最佳方法是什么。

我做了一个简单的例子来说明我的用例:

数据库定义

三个实体:Version、Element、ElementEffect。

  • 一个版本有很多元素。
  • 一个元素属于一个版本。
  • 一个元素有很多元素效果。
  • 一个 Effect 属于一个 Element。

enter image description here

问题

假设我们有 1 个版本,数据库中有 1 个元素和 1 个效果。

enter image description here

对于我的用例,我需要能够创建一个新版本来复制先前版本的所有元素和元素效果并更新其中的一些。

例如,如果创建了一个新版本:版本 2:

  • 数据库应将存在元素复制到引用新版本的新元素中。
  • 新元素应创建引用新元素的新元素效果。

enter image description here

新版本来了。新版本具有与之前版本相同的元素和效果,并且有一个变化:元素效果文本从 null 更改为“loremp ipsum”。

我们需要做的操作是:

  1. 为与版本相关的所有元素及其关系创建一个副本 —> Element > ElementEffect

  2. 根据新版本的变化对新的复制元素进行数据更新。

问题

  1. 在使用/不使用 Sequelize ORM 和 Node.js 的情况下,在 PostgreSQL 中实现必要条件 1 的最佳方法是什么?
  2. PostgreSQL 是否具有使这成为可能的任何内置功能?
  3. 我应该在数据库级别解决这个问题(可能使用 psql 规则和触发器)还是在代码级别使用 Node 脚本进行查询和交易?

解决方案要求

  • 我正在使用 Sequelize 作为由 Node.js 管理的 ORM 在 PostgreSQL 上构建它,所以如果我可以使用 Sequelize 构建它会更好。

  • 我的用例比示例复杂得多。我有超过 15 个实体,包括多对多关系,因此解决方案需要随着时间的推移进行扩展。意思是,我不想在每次添加新实体或修改现有实体时都对此进行测试。

最佳答案

我想到的最好的想法是在 psql 中创建存储过程,例如make_new_version(my_table, oldid, newid) 并且此过程必须复制表 my_table 中具有旧 ID 的行,并将 oldid 替换为 newid。此函数还需要从新插入的行返回 id,以便再次调用相同的函数来复制下一个实体的行。

当您测试并确认此存储过程时,您可以从另一个过程(几乎)调用它而无需测试。

这样你就可以解决数据库层的问题。

关于javascript - 在 PostgreSQL 中 COPY/INSERT ON CASCADE 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60989616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com