【发布时间】:2021-12-11 05:44:38
【问题描述】:
在sequelize.js中,是否可以通过另一个表将一个表关联到自身?
我正在尝试创建一个基本的图形模型。我有两个相关的表:Node 和 Edge。我希望通过Edge 构建从Node 到自身的多对多关系。
示例:有一个名为“Dave”的Node,一个带有predicate“Loves”的Edge,以及另一个名为“Sarah”的Node。
在Node 表中,id 是主键。在Edge 表中,字段subject_node_id 和direct_object_node_id 应指向节点id。
这是我想要做的快速而肮脏的ERD:
这是迄今为止我最好的尝试。以下代码可以创建表列,但未按预期创建行。 create 方法可能完全错误;比如应该有办法设置predicate,但是不知道放在哪里:
const { Sequelize } = require("sequelize");
(async () => {
try {
const db = await new Sequelize({
dialect: "sqlite",
storage: "./db/db.db",
});
const Node = await db.define("node", {
name: {
type: Sequelize.STRING,
},
});
const Edge = await db.define("edge", {
subject_node_id: {
type: Sequelize.INTEGER,
},
predicate: {
type: Sequelize.STRING,
},
direct_object_node_id: {
type: Sequelize.INTEGER,
},
});
await Node.sync({ force: true });
await Edge.sync({ force: true });
await Node.belongsToMany(Node, {
through: "Edge",
as: "subjects",
foreignKey: "id",
otherKey: "subject_node_id"
});
await Node.belongsToMany(Node, {
through: "Edge",
as: "direct_objects",
foreignKey: "id",
otherKey: "direct_object_node_id"
});
await Node.create(
{
name: "Dave",
// Loves ??
subjects: [{
name: "Sarah"
}]
},
);
console.log("created");
} catch (error) {
console.error(error);
}
})();
我确实找到了this SO thread,但接受的答案并没有完全到达那里。有什么额外的想法吗?谢谢。
【问题讨论】:
标签: node.js sqlite sequelize.js graph-theory entity-relationship