跳到主要内容

模型关联关系

模型多对多中间表

如何查找模型多对多关联关系中间表

  1. 通过模型的字段配置查找中间表对应的中间模型标识,如图所示:模型字段配置
  2. 通过中间模型标识在数据库表进行搜索,如图所示:查找中间表- 说明:表名以-preview结尾的是体验态模型多对多关联关系对应的中间表,不是以-preview结尾的表是正式态模型多对多关联关系对应的中间表。

模型多对多中间表字段说明

  • leftRecordId记录主表(左表)记录id,如下图所示:leftRecordId则记录的是有关学生表的主键_id对应的值。
  • rightRecordId记录从表(右表)记录id,如下图所示:rightRecordId则记录的是有关课程表的主键_id对应的值。中间表关联字段

三种逻辑列类型:

  1. 一对多关联

    • 描述:当前模型的一条记录关联到另一个模型的多条记录
    • 特点:物理表中不存在,通过LEFT JOIN查询获得
    • 示例:一个"班级"关联多个"学生"。在班级表中,一对多字段并不真实存在。
  2. 多对多关联

    • 描述:当前模型的多条记录关联到另一个模型的多条记录
    • 特点:物理表中不存在,通过中间表和LEFT JOIN查询获得
    • 示例:"学生"与"课程"之间的选课关系。在学生表和课程表中,多对多字段并不真实存在。
  3. 一对一反向关联

    • 描述:一对多关系的特例,通过唯一索引约束实现一对一
    • 特点:物理表中不存在,通过LEFT JOIN查询获得
    • 示例:"学生证"与"学生"的一对一关系。 在学生证表中,一对一反向关联字段并不真实存在。

模型关联关系外键约束操作说明

模型关联关系当前不支持外键操作,如果需要给模型的关联关系添加外键约束需要在控制台数据库表管理页面操作,具体操作指引如下:

一对一关系外键约束

场景示例

  • 用户 ↔ 用户资料(一个用户对应一个用户资料)
  • 学生 ↔ 学生证(一个学生对应一个学生证)

控制台图形化操作方式

  1. 通过模型找到表名和关联字段标识,如下图:
  2. 在数据库表管理页搜索相关表,添加外键。如下图:

外键约束sql创建示例

-- 用户资料表(从表)
CREATE TABLE user_profile (
_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL UNIQUE, -- 唯一约束确保一对一关系
avatar VARCHAR(255),
bio TEXT,
CONSTRAINT fk_profile_user_id FOREIGN KEY (user_id)
REFERENCES user(_id) ON DELETE CASCADE
);

关键要点

  • 在从表的外键字段上添加UNIQUE约束
  • 使用ON DELETE CASCADE确保级联删除
  • 外键字段必须NOT NULL

一对多关系外键约束

场景示例

  • 部门 ↔ 员工(一个部门有多个员工)
  • 文章 ↔ 评论(一篇文章有多个评论)

控制台图形化操作方式

  1. 通过模型找到表名和关联字段标识,如下图:
  2. 在数据库表管理页搜索相关表,添加外键。如下图:

外键约束sql创建示例

-- 员工表(多的一方)
CREATE TABLE employee (
_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
department_id INT NOT NULL,
position VARCHAR(100),
_openid VARCHAR(64),
CONSTRAINT fk_employee_department_id FOREIGN KEY (department_id)
REFERENCES department(_id) ON DELETE CASCADE
);

关键要点

  • 外键约束建立在"多"的一方
  • 外键字段通常为NOT NULL
  • 使用ON DELETE CASCADE处理级联删除

多对多关系外键约束

场景示例

  • 学生 ↔ 课程(一个学生选修多门课程,一门课程有多个学生)
  • 用户 ↔ 角色(一个用户有多个角色,一个角色分配给多个用户)

控制台图形化操作方式

  1. 通过模型的字段配置查找中间表对应的中间模型标识,如图所示:
  2. 通过中间模型标识数据库表管理页搜索相关表,如图所示:

外键约束sql创建示例

-- 中间表(关联表)
CREATE TABLE mid_55ZTLScHD (
_id INT AUTO_INCREMENT,
rightRecordId INT NOT NULL,
leftRecordId INT NOT NULL,
_openid VARCHAR(64),
PRIMARY KEY (id, rightRecordId, leftRecordId), -- 联合主键
CONSTRAINT fk_sc_student_id FOREIGN KEY (leftRecordId)
REFERENCES student(_id) ON DELETE CASCADE,
CONSTRAINT fk_sc_course_id FOREIGN KEY (rightRecordId)
REFERENCES course(_id) ON DELETE CASCADE
);

关键要点

  • 中间表包含两个外键字段
  • 使用联合主键确保关联关系的唯一性
  • 两个外键都设置级联删除

外键约束操作最佳实践

1. 模型标识与表名规则

  • 体验态表名: 模型标识 + '-preview'
  • 正式态表名: 模型标识

2. 约束命名规范

  • 使用有意义的约束名称:fk_表名_字段名
  • 保持命名一致性便于维护

3. 级联操作选择

  • CASCADE:主表记录删除时,从表关联记录也删除
  • SET NULL:主表记录删除时,从表外键字段设为NULL
  • RESTRICT:阻止删除有外键引用的主表记录
  • NO ACTION:与RESTRICT类似,但检查时机不同

4. 索引优化

  • 为外键字段创建索引提高查询性能
  • 考虑复合索引优化多字段查询

常见问题与解决方案

问题1:循环引用

场景:两个表相互引用形成循环依赖 解决方案

  • 使用SET NULL级联操作
  • 在业务逻辑中处理循环引用
  • 考虑使用软删除代替物理删除

问题2:性能问题

场景:外键约束影响大量数据操作的性能 解决方案

  • 在非高峰时段执行批量操作
  • 暂时禁用外键约束(谨慎使用)
  • 优化索引策略

问题3:数据不一致

场景:外键约束被绕过导致数据不一致 解决方案

  • 定期执行数据完整性检查
  • 使用数据库事务确保操作原子性
  • 实现业务逻辑层面的数据验证

总结

外键约束是维护数据库关联关系完整性的核心机制。通过合理设计外键约束,可以:

  1. 确保数据的一致性和有效性
  2. 简化关联数据的维护操作
  3. 提高数据查询的准确性
  4. 减少业务逻辑的复杂性

在实际应用中,应根据具体业务场景选择合适的外键约束策略,平衡数据完整性和系统性能的需求。