library-picturebook-activity/backend/docs/SCHOOL_MODULE_SCHEMA.md
2025-12-09 11:10:36 +08:00

9.1 KiB
Raw Permalink Blame History

学校模块数据库设计文档

概述

本文档描述了学校管理系统的数据库表设计,包括学校信息、年级、班级、部门、教师和学生等核心实体。

设计原则

  1. 租户隔离:所有表都通过 tenantId 关联到 Tenant 表,实现多租户数据隔离
  2. 用户统一:教师和学生都基于 User 表,通过一对一关系扩展特定信息
  3. 数据完整性:使用外键约束和级联删除保证数据一致性
  4. 审计追踪:所有表都包含创建人、修改人、创建时间、修改时间字段

表结构设计

1. 学校信息表 (School)

说明:扩展租户信息,存储学校的详细资料。与 Tenant 表一对一关系。

字段说明

  • id: 主键
  • tenantId: 租户ID唯一一对一关联Tenant
  • address: 学校地址
  • phone: 联系电话
  • principal: 校长姓名
  • established: 建校时间
  • description: 学校描述
  • logo: 学校Logo URL
  • website: 学校网站
  • creator/modifier: 创建人/修改人ID
  • createTime/modifyTime: 创建/修改时间

关系

  • 一对一关联 Tenant
  • 多对一关联 User (创建人/修改人)

2. 年级表 (Grade)

说明:管理学校的年级信息,如一年级、二年级等。

字段说明

  • id: 主键
  • tenantId: 租户ID
  • name: 年级名称(如:一年级、二年级)
  • code: 年级编码在租户内唯一grade_1, grade_2
  • level: 年级级别用于排序1, 2, 3
  • description: 年级描述
  • validState: 有效状态1-有效2-失效)
  • creator/modifier: 创建人/修改人ID
  • createTime/modifyTime: 创建/修改时间

唯一约束

  • [tenantId, code]: 租户内年级编码唯一
  • [tenantId, level]: 租户内年级级别唯一

关系

  • 多对一关联 Tenant
  • 一对多关联 Class (班级)
  • 多对一关联 User (创建人/修改人)

3. 部门表 (Department)

说明:管理学校的部门信息,支持树形结构(如:教务处 > 语文组)。

字段说明

  • id: 主键
  • tenantId: 租户ID
  • name: 部门名称
  • code: 部门编码(在租户内唯一)
  • parentId: 父部门ID支持树形结构
  • description: 部门描述
  • sort: 排序
  • validState: 有效状态1-有效2-失效)
  • creator/modifier: 创建人/修改人ID
  • createTime/modifyTime: 创建/修改时间

唯一约束

  • [tenantId, code]: 租户内部门编码唯一

关系

  • 多对一关联 Tenant
  • 自关联(树形结构):parentchildren
  • 一对多关联 Teacher (教师)
  • 多对一关联 User (创建人/修改人)

4. 班级表 (Class)

说明:管理班级信息,支持行政班级(教学班级)和兴趣班两种类型。

字段说明

  • id: 主键
  • tenantId: 租户ID
  • gradeId: 年级ID
  • name: 班级名称一年级1班、二年级2班
  • code: 班级编码(在租户内唯一)
  • type: 班级类型1-行政班级/教学班级2-兴趣班)
  • capacity: 班级容量(可选)
  • description: 班级描述
  • validState: 有效状态1-有效2-失效)
  • creator/modifier: 创建人/修改人ID
  • createTime/modifyTime: 创建/修改时间

唯一约束

  • [tenantId, code]: 租户内班级编码唯一

关系

  • 多对一关联 Tenant
  • 多对一关联 Grade (年级)
  • 一对多关联 Student (学生,仅行政班级)
  • 一对多关联 StudentInterestClass (学生兴趣班关联)
  • 多对一关联 User (创建人/修改人)

注意事项

  • students 关系仅用于行政班级type=1需要在应用层验证
  • 兴趣班通过 StudentInterestClass 表关联学生

5. 教师表 (Teacher)

说明:存储教师的详细信息,与 User 表一对一关系。

字段说明

  • id: 主键
  • userId: 用户ID唯一一对一关联User
  • tenantId: 租户ID
  • departmentId: 部门ID
  • employeeNo: 工号(在租户内唯一)
  • phone: 联系电话
  • idCard: 身份证号
  • gender: 性别1-男2-女)
  • birthDate: 出生日期
  • hireDate: 入职日期
  • subject: 任教科目(可选,如:语文、数学)
  • title: 职称(可选,如:高级教师、一级教师)
  • description: 教师描述
  • validState: 有效状态1-有效2-失效)
  • creator/modifier: 创建人/修改人ID
  • createTime/modifyTime: 创建/修改时间

唯一约束

  • userId: 用户ID唯一一对一
  • [tenantId, employeeNo]: 租户内工号唯一

关系

  • 一对一关联 User
  • 多对一关联 Tenant
  • 多对一关联 Department (部门)
  • 多对一关联 User (创建人/修改人)

6. 学生表 (Student)

说明:存储学生的详细信息,与 User 表一对一关系。

字段说明

  • id: 主键
  • userId: 用户ID唯一一对一关联User
  • tenantId: 租户ID
  • classId: 行政班级ID
  • studentNo: 学号(在租户内唯一)
  • phone: 联系电话
  • idCard: 身份证号
  • gender: 性别1-男2-女)
  • birthDate: 出生日期
  • enrollmentDate: 入学日期
  • parentName: 家长姓名
  • parentPhone: 家长电话
  • address: 家庭地址
  • description: 学生描述
  • validState: 有效状态1-有效2-失效)
  • creator/modifier: 创建人/修改人ID
  • createTime/modifyTime: 创建/修改时间

唯一约束

  • userId: 用户ID唯一一对一
  • [tenantId, studentNo]: 租户内学号唯一

关系

  • 一对一关联 User
  • 多对一关联 Tenant
  • 多对一关联 Class (行政班级)
  • 一对多关联 StudentInterestClass (兴趣班关联)
  • 多对一关联 User (创建人/修改人)

注意事项

  • classId 必须关联行政班级type=1需要在应用层验证
  • 兴趣班通过 StudentInterestClass 表关联

7. 学生兴趣班关联表 (StudentInterestClass)

说明:学生和兴趣班的多对多关联表。

字段说明

  • id: 主键
  • studentId: 学生ID
  • classId: 兴趣班IDtype=2的Class

唯一约束

  • [studentId, classId]: 学生和兴趣班组合唯一

关系

  • 多对一关联 Student
  • 多对一关联 Class (兴趣班)

注意事项

  • classId 必须关联兴趣班type=2需要在应用层验证

数据关系图

Tenant (租户/学校)
├── School (学校信息) [1:1]
├── Grade (年级) [1:N]
│   └── Class (班级) [1:N]
│       ├── Student (学生) [1:N, 仅行政班级]
│       └── StudentInterestClass [N:M, 仅兴趣班]
├── Department (部门) [1:N, 树形结构]
│   └── Teacher (教师) [1:N]
└── User (用户) [1:N]
    ├── Teacher [1:1]
    └── Student [1:1]

业务规则

  1. 学校与租户:每个租户对应一个学校,通过 School 表扩展学校信息
  2. 年级管理:年级按 level 排序,每个租户内级别唯一
  3. 班级类型
    • 行政班级type=1学生必须属于一个行政班级
    • 兴趣班type=2学生可以加入多个兴趣班
  4. 部门树形结构:部门支持多级嵌套,通过 parentId 实现
  5. 教师归属:教师必须归属于一个部门
  6. 学生归属:学生必须属于一个行政班级,可以加入多个兴趣班

数据完整性约束

  1. 级联删除

    • 删除租户时,级联删除所有相关数据
    • 删除年级时,级联删除所有班级
    • 删除用户时,级联删除教师/学生信息
    • 删除班级时,级联删除学生兴趣班关联
  2. 限制删除

    • 删除部门时如果存在教师不允许删除Restrict
    • 删除班级时如果存在学生不允许删除Restrict
  3. 唯一性约束

    • 租户内年级编码唯一
    • 租户内年级级别唯一
    • 租户内部门编码唯一
    • 租户内班级编码唯一
    • 租户内教师工号唯一
    • 租户内学生学号唯一

应用层验证建议

  1. 班级类型验证

    • 创建学生时,classId 必须关联 type=1 的班级
    • 创建学生兴趣班关联时,classId 必须关联 type=2 的班级
  2. 数据一致性

    • 教师/学生的 tenantId 必须与关联的 User.tenantId 一致
    • 班级的 tenantId 必须与关联的 Grade.tenantId 一致
  3. 业务逻辑

    • 删除部门前,需要先转移或删除该部门下的所有教师
    • 删除班级前,需要先转移或删除该班级下的所有学生

迁移建议

  1. 运行 Prisma 迁移生成 SQL

    npx prisma migrate dev --name add_school_module
    
  2. 数据初始化:

    • 为现有租户创建对应的 School 记录
    • 根据业务需求初始化年级数据
  3. 数据迁移(如需要):

    • 如果已有教师/学生数据,需要创建对应的 User 记录并关联

后续扩展建议

  1. 课程管理:可以添加课程表、课程安排等
  2. 成绩管理:可以添加成绩表、考试表等
  3. 考勤管理:可以添加考勤记录表
  4. 通知公告:可以添加通知表、公告表等