数据模型与租户列
公开教程 · 无需登录

数据模型与租户列

班级、用户、会话、材料与知识库正文分别对应五张表。材料表与知识库正文表均携带 class_id 租户列,后续所有按班级隔离的查询都依赖该列。

1五张表与租户列

classes id · name users id · username · role class_id → classes sessions user_id → users · expires_at materials class_id(租户列,非空+索引) uploader → users title · 存储路径 knowledge_entries material_id → materials class_id(租户列,非空+索引) 正文 · 来源 租户列约定 class_id 非空且建立索引 是后续全部 隔离查询的基础
图:五张表的外键关系。红框内的两张表携带租户列 class_id,所有按班级过滤的查询均建立在该列之上。

种子数据至少应包含两个班级,且各含教师与学生账号。两个班级的材料标题必须能够区分,否则无法验证隔离效果。口令以哈希形式写入,启动时从环境变量读取明文后再计算哈希。

2各模块的数据写入边界

数据表并非所有模块都可写入。登录模块仅操作会话表;上传模块仅在教师角色校验通过后写入材料表与知识库正文表,且两表使用同一个会话班级值。

认证模块 登录:写 sessions 请求:读 sessions 再读 users 的角色与班级 会话里的班级 下游模块仅使用该值 materials.class_id 由上传模块写入,列表查询据此过滤 knowledge_entries.class_id 在同一事务中写入相同班级值
班级不是上传表单中的字段。它由认证模块从用户行读出,再由上传模块原样写入两张带租户列的数据表。