当前位置: 首页 > wzjs >正文

龙华住房和建设局网站官网镇江佳鑫网络科技有限公司

龙华住房和建设局网站官网,镇江佳鑫网络科技有限公司,安康网站定制厂家,甘肃建投土木工程建设有限公司网站一、关联模型的核心机制 1. 关联类型与组合规则 • 基础四类型: • hasOne:外键存储于目标模型(如用户档案表存储用户ID) • belongsTo:外键存储于源模型(如订单表存储用户ID) • hasMany&…

一、关联模型的核心机制

1. 关联类型与组合规则

基础四类型
hasOne:外键存储于目标模型(如用户档案表存储用户ID)
belongsTo:外键存储于源模型(如订单表存储用户ID)
hasMany:一对多关系,外键在目标模型(如用户有多篇文章)
belongsToMany:通过中间表实现多对多(如用户-角色中间表)

必须成对定义
• 单边定义会导致预加载失效。例如仅定义Foo.hasOne(Bar)时,无法通过Bar.findAll({ include: Foo })查询
• 正确组合方式:

 // 一对一User.hasOne(Profile);Profile.belongsTo(User);// 一对多User.hasMany(Post);Post.belongsTo(User);// 多对多User.belongsToMany(Role, { through: UserRole });Role.belongsToMany(User, { through: UserRole });

有关联字段的表,一定是属于 belongsTo 其他表的。

2. 高级关联配置

自定义外键与别名

User.hasMany(Comment, {foreignKey: 'authorId',  // 覆盖默认的userIdas: 'reviews'           // 通过user.getReviews()访问
});

当模型名称复数形式异常时(如Person→People),需通过as别名修正方法名

非主键关联

Ship.belongsTo(Captain, {targetKey: 'name',  // 关联船长表的name字段(需唯一约束)foreignKey: 'captainName'
});

需确保目标字段有唯一索引,否则会报错

3. 实际应用

在模型定义的时候关联模型:

在这里插入图片描述

然后再进行查询的第三个配置参数中定义 condition,来对查询结果进行关联:

在这里插入图片描述


二、孤儿记录的防护策略

孤儿记录:比如一个分类中关联了多个课程,此时将这个分类删掉,那么课程将找不到父记录,因此就成为了孤儿记录。

解决这个问题有三个方法:

  1. 设置外键约束(一般不用,在数据量大、高并发的场景下,会出现性能瓶颈)
  2. 删除分类的同时,删除该分类下的所有课程(代码层面,问题是可能发生误删除操作)
  3. 只有当没有关联该分类的课程时,才能被删掉(代码层面,推荐)
1. 外键约束级联

在定义关联时启用数据库级联删除,确保父记录删除时自动清理子记录:

// 用户删除时级联删除文章
User.hasMany(Post, {foreignKey: { allowNull: false }, // 强制外键非空onDelete: 'CASCADE' // 关键配置
});

此配置会在SQL层面生成ON DELETE CASCADE约束,彻底避免孤儿记录

2. 中间表清理(多对多关系)

使用钩子函数清理关联记录:

// 删除教师前清理关联表
Teacher.beforeDestroy(async (teacher) => {await Relation.destroy({where: { teacherId: teacher.id }});
});

特别适用于多对多关系中间表的数据维护

3. 事务保护

关键操作使用事务保证原子性:

await sequelize.transaction(async (t) => {const user = await User.findByPk(1, { transaction: t });await user.destroy({ transaction: t });// 自动触发关联的级联删除
});

防止在删除过程中断导致数据不一致


三、最佳实践建议

  1. 索引优化
    • 所有外键字段必须建立索引
    • 多对多中间表的联合索引:

    Relation.init({studentId: { type: INTEGER, primaryKey: true },teacherId: { type: INTEGER, primaryKey: true }
    }, { sequelize });
    

    通过复合主键提升查询效率

  2. 数据验证

    Post.belongsTo(User, {foreignKey: {validate: {isUserIdValid(value) {if (!validator.isUUID(value)) throw new Error('非法用户ID');}}}
    });
    
  3. 预加载优化

    User.findAll({include: [{model: Post,attributes: ['id', 'title'], // 按需加载字段where: { status: 'published' } // 过滤条件}]
    });
    

    避免N+1查询问题



文章转载自:

http://xUdAJ7gS.yjfmj.cn
http://KR7jsmAQ.yjfmj.cn
http://vhJGiCNU.yjfmj.cn
http://wvxEP8KK.yjfmj.cn
http://uy4ZvfqH.yjfmj.cn
http://K4YM3IYw.yjfmj.cn
http://KeLHmGYQ.yjfmj.cn
http://1nS87HTm.yjfmj.cn
http://M5Da4OxE.yjfmj.cn
http://uifUbcLC.yjfmj.cn
http://gra93yUm.yjfmj.cn
http://PlBKzy2t.yjfmj.cn
http://kXqZV3h6.yjfmj.cn
http://DCPckX4r.yjfmj.cn
http://NiPnZFSW.yjfmj.cn
http://8JReCiTM.yjfmj.cn
http://w59aGZp7.yjfmj.cn
http://624armfp.yjfmj.cn
http://srKYoTRj.yjfmj.cn
http://lZtvv6hK.yjfmj.cn
http://K8vtw8gm.yjfmj.cn
http://RpzG47ow.yjfmj.cn
http://1n8LCCrn.yjfmj.cn
http://zvwiYWLN.yjfmj.cn
http://9rfOWTXP.yjfmj.cn
http://s2eWbw0f.yjfmj.cn
http://lwaSnEsf.yjfmj.cn
http://NiDHsI5N.yjfmj.cn
http://ihNAxeWo.yjfmj.cn
http://Wtz41g7c.yjfmj.cn
http://www.dtcms.com/wzjs/636785.html

相关文章:

  • 网站别人能打开我打不开帮人做网站
  • 哪个网站可以做自己的网页做媛网站
  • seo网站营销公司淘宝网站的建设内容
  • 网站上的动图都怎么做的重庆是哪个省份的
  • ajax网站模板小企业做网站多少钱
  • 招聘网站怎么做seoseo任务
  • 讨债公司网站建设自己建网站需要多少钱
  • 手机建立网站天津交通网站建设
  • 北京外贸营销网站建设费用wordpress 模板 小工具
  • 网站建设与设计的论文企业网站找谁做好
  • 是否有可能一个人完成网站开发电脑做网站服务器改端口
  • 医院做网站的好处家居网站建设流程
  • asp.net开发移动网站模板下载怎么用vs做网站开发
  • 重庆教育建设有限公司网站重庆市建设工程信息网安全监督成绩查询
  • 网站服务器位于北美东莞制作网站
  • 网站排名的重要性工作总结2023年个人
  • 创什么网站吸引人如何制作个人网站
  • 怎么做刷业务网站如何在电影网站中做淘客
  • 东莞专业网站推广策划门户类网站备案
  • 潍坊网站制作保定公司腾讯云轻量应用服务器
  • 网站建设一般都需要什么资质免费卖货平台
  • 如何生成自己的网站建设工业
  • 湖南网站建设 干净磐石网络百度搜不到自己的wordpress
  • 商贸有限公司的经营范围上海网站seo
  • 地方门户网站规划金华网络推广公司
  • 网上有免费的网站吗wordpress菜单 链接
  • ps做设计想接私活在什么网站润滑油东莞网站建设
  • 织梦如何做几种语言的网站西安计算机培训机构排行榜
  • 企业网站的步骤河南做网站汉狮
  • 临清建网站网站开发前端设计