Mysql 什么';Sequelize.hasMany/belongsTo中foreignKey的含义是什么?
我最近正在使用Sequelize ORM 我有两张桌子。一个是Mysql 什么';Sequelize.hasMany/belongsTo中foreignKey的含义是什么?,mysql,orm,sequelize.js,rdbms,Mysql,Orm,Sequelize.js,Rdbms,我最近正在使用Sequelize ORM 我有两张桌子。一个是用户,另一个是帖子 这两个表的模式如下所示 Users { id: Integer, name: String, age: Integer } Posts { id: Integer, // refers to the id of post itself author_id: Integer, // refers to the id of the author of this post title: Str
用户
,另一个是帖子
这两个表的模式如下所示
Users {
id: Integer,
name: String,
age: Integer
}
Posts {
id: Integer, // refers to the id of post itself
author_id: Integer, // refers to the id of the author of this post
title: String,
content: String
}
我想在他们之间创建一个一对多(用户)的关联。为此,我需要在模型中指定hasMany和belongsTo
但是,我对参数foreignKey/sourceKey/targetKey的含义感到非常困惑
假设我已经用迁移定义并创建了表。在本例中,作为外键的属性的名称为author\u id
我的猜测是,在belongsTo
中,foreignKey
表示“将成为源表中foreignKey的属性的名称”
但是在hasMany
中,foreignKey
表示“即将到来的foreignKey引用的属性的名称”
因此,belongsTo
中的foreignKey
将是作者id(在表格帖子中),但中的foreignKey
有许多将是id(在表格用户中)
此外,sourceKey/targetKey到底意味着什么 嗯。。。你有一个有趣的案例在上面。。。如果您使用的是用户id而不是作者id,那么您可能不需要声明它们,因为sequelize可能会正确地假定它们。。。但是,因为您将其命名为author\u id,所以您的hasMany肯定需要知道在post表中外键的名称为author\u id。。。假设您在用户表中将id命名为“user”而不是“id”。。。。sequelize无法理解这一点,也无法推断它加入了什么,所以您可以说sourceKey=“user”和foreignKey=“author\u id”。。。为了进一步说明这一点,您可能会在数据库设计中遇到一些问题,您需要指定targetKey或otherKey是什么,因为有人将其命名为古怪的。。。因此,正如您在上文的“您的归属”中所说,作者id不知道它应该映射回“用户”进行加入,因此您可以指定foreignKey=“author\u id”和otherKey=“user”。。。这件事也花了我一段时间来思考,因为我没有设计实现graphql/sequelize的数据库。。。因此,我必须在连接中广泛使用sourceKey、targetKey和otherKey等
试着从逻辑上考虑,这样会更有意义。。。如果您的主键始终为“id”,而foreignKey始终为“tablename\u id”,那么您就不必太担心其他属性。。但是当命名不一致时,sequelize需要被告知要使用什么键,这就是为什么存在其他属性的原因。。Sequelize非常聪明,但它无法弥补糟糕的数据库设计或糟糕的联接列命名。。。希望这对你有所帮助,如果没有的话,我可以给你发很多例子。。干杯谢谢你的解释。然而,有一件事我仍然感到困惑。我看到很多例子对hasMany和belongsTo使用了相同的foreignKey名称。但是我看到文档说hasMany中的foreignKey是“目标表”中外键属性的名称,belongsTo中的foreignKey是“源表”中外键属性的名称。因为它们在不同的表中有不同的名称(例如,Users表的id和Posts表的user_id),所以它们不应该不同吗。。。hasMany外键可能是user\u id(如果存在的话),但您将其设置为author\u id。。。。您可能需要将sourceKey设置为author\u id,将foreignKey设置为if in your belongsTo