【发布时间】:2021-02-14 03:18:46
【问题描述】:
我将 Postgresql 13 / express.js 与 node-postgres 一起用于测试项目。我在 Postgresql 中有一个表,其中包含一个列,其中包含评估表的一系列问题(我将其设为 JSON,因为可以编辑问题以包含更多或更少的问题,动态表单内容)。
有了这个想法,我做了两张表:EvalForm和DefaultForm
EvalForm 拥有id (PK, INT), job_id, form_type (INT), form_questions (JSONB), and form_answers (JSONB)。
DefaultForm 拥有id (PK, INT) and form_questions(JSONB)。
逻辑是form_type 值将对应于将基于其id 复制的form_questions。 (例如form_type = 1,那么它将从DefaultForm 表中复制id = 1 的form_questions。
我希望能够复制整个 JSONB 数组并将其插入到另一个表中。我已经阅读了有关 jsonb_build_object 和 jsonb_agg() 的信息,但我不确定如何将它们用于我的用例。
提前感谢您的帮助!
这是我目前正在处理的查询,只是缺少如何获取 JSONB,因为我无法将类型记录转换为 JSONB。
const type = await pool.query('SELECT job_type FROM jobs WHERE id = $1', [
req.params.id
]);
const sqlString = 'WITH questions AS (
SELECT form_questions
FROM DefaultForm WHERE id = $2
INSERT INTO EvalForm (
job_id, form_type, form_questions)
SELECT $1, $2, questions::jsonb
FROM questions';
const sqlValues = [req.params.id, type.rows[0].job_type
];
【问题讨论】:
-
你为什么要复制这些问题(而不是仅仅引用它们)?
-
@Bergie 因为 DefaultForm 可以更改/更新,并且在将来引用它们会导致不一致(例如,目前 DefaultForm 中有 6 个问题,这使得它需要在 EvalForm 中有 6 个答案。将来,如果用户决定更改问题、减少或增加问题数量,则 EvalForm 行将自行更新为新的 DefaultForm,这是我想避免的。)
标签: postgresql