gpt4 book ai didi

javascript - Sequelize 关联 : How to update parent model when creating child?

转载 作者:行者123 更新时间:2023-12-04 14:53:49 27 4
gpt4 key购买 nike

看来我误解了 sequelize .hasMany().belongsTo() 关联以及如何在服务中使用它们。我有两个模型:

const User = db.sequelize.define("user", {
uid: { /*...*/ },
createdQuestions: {
type: db.DataTypes.ARRAY(db.DataTypes.UUID),
unique: true,
allowNull: true,
},
});
const Question = db.sequelize.define("question", {
qid: { /*...*/ },
uid: {
type: db.DataTypes.TEXT,
},
});

鉴于一个用户可以有很多问题,每个问题只属于一个用户,我有以下关联:

User.hasMany(Question, {
sourceKey: "createdQuestions",
foreignKey: "uid",
constraints: false,
});
Question.belongsTo(User, {
foreignKey: "uid",
targetKey: "createdQuestions",
constraints: false,
});

我想要实现的是:在创建问题对象后,qid 应该驻留在 "createdQuestions" 下的用户对象中 - 就像 uid 驻留在 uid 下的问题对象中。我认为 sequelize 关联会为我做的是保存个人调用和更新用户对象。有对应的方法吗?到目前为止我所拥有的是:

const create_question = async (question_data) => {
const question = { /*... question body containing uid and so forth*/ };

return new Promise((resolve, rejected) => {
Question.sync({ alter: true }).then(
async () =>
await db.sequelize
.transaction(async (t) => {
const created_question = await Question.create(question, {
transaction: t,
});
})
.then(() => resolve())
.catch((e) => rejected(e))
);
});
};

然而,这只会创建一个问题对象,不会更新用户。我在这里缺少什么?

最佳答案

在 SQL 中建模一对多关系

SQL 与 NoSQL

在 SQL 中,与 NoSQL 中的情况相反,每个属性都有固定的数据类型和固定的位数限制。这在创建新表时由 SQL 命令体现:

CREATE TABLE teachers (
name VARCHAR(32),
department VARCHAR(64),
age INTEGER
);

这背后的原因是允许我们通过知道每一行的长度来轻松地访问数据库中的任何属性。在我们的例子中,每一行都需要存储所需的空间:

32 字节(姓名) + 64 字节(部门) + 4 字节(年龄) = 100 字节

这是关系数据库中的一个非常强大的功能,因为它将检索数据所需的时间降至常数时间,因为我们知道每条数据在数据库中的位置内存。

一对多关系:案例研究

现在,让我们考虑一下我们有这 3 个表

enter image description here

假设我们要在类(class)教师之间创建一个一对多关系,其中一个教师可以教授多个类(class)。

enter image description here

我们可以这样想。但是,由于两个主要原因,这种模型是不可能的:

  • 这将使我们失去恒定时间检索,因为我们不再知道列表的大小
  • 我们担心分配给列表属性的空间量不足以容纳 future 的数据。假设我们分配了 10 个类(class)所需的空间,最终我们得到了一位老师教授 11 个类(class)。这将促使我们重新创建数据库以增加列大小。

另一种方式是这样的:

enter image description here

虽然这种方法可以解决列大小受限的问题,但我们不再拥有单一事实来源。相同的数据被复制并存储多次。

这就是为什么对于这种一对多关系,我们需要将教师的 ID 存储在这个类(class)表中。

这样,我们仍然可以通过运行找到一个老师可以教授的所有类(class)

SELECT *
FROM classes
WHERE teacherID = teacher_id

我们将避免前面讨论的所有问题。

关于javascript - Sequelize 关联 : How to update parent model when creating child?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68532884/

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