数据库模型与数据持久化
userdata.py 规定了数据在磁盘上的组织形式。它通过“用户 -> 计算记录 -> 详细结果”的三层级联架构,既保证了账号管理的安全性,又兼顾了科研数据(Params)的高柔性与仿真矩阵(Matrices)的读写性能。
🏗️ 实体关系模型 (ERD)
Section titled “🏗️ 实体关系模型 (ERD)”系统采用典型的 One-to-Many 与 One-to-One 混合关联模式。
用户权限与安全
Section titled “用户权限与安全”负责存储身份验证元数据与科研人员档案。
- 哈希保护:基于
werkzeug的 PBKDF2 算法,严禁明文存储密码。 - 级联删除:配置了
cascade="all, delete-orphan"。当用户被注销时,系统会自动清理其名下数 GB 的仿真数据,防止磁盘垃圾堆积。
输入参数持久化
Section titled “输入参数持久化”存储每一次仿真实验的“案底”。
- JSONB 优势:使用 PostgreSQL 特有的
JSONB类型存储input_params。这允许前端随模型升级增加参数(如新加入 $E_a$ 分布),而无需修改数据库 Schema。 - 时序索引:在
timestamp上建立索引,支持管理员快速检索近期的模拟任务。
矩阵存储优化
Section titled “矩阵存储优化”存放计算产生的高维数值矩阵。
- 解耦设计:将计算参数 (Record) 与结果 (Result) 分表存储。
- 性能考量:查询记录列表时,系统不会加载
CalcResult,只有在用户点击查看详情时,才会通过一对一关联加载庞大的data_rows(可能包含数万行坐标点)。
💻 关键模型分析
Section titled “💻 关键模型分析”1. 密码安全机制 (Secure Hash)
Section titled “1. 密码安全机制 (Secure Hash)”def set_password(self, password): """ @description 将明文密码转换为盐值哈希 生成的哈希值包含算法、迭代次数、盐和哈希结果,长度上限 512 位。 """ self.password_hash = generate_password_hash(password)
def check_password(self, password): """执行恒定时间比较,防止计时攻击 (Timing Attack)""" return check_password_hash(self.password_hash, password)