在健康管理系统中,数据是核心资产。如何高效、准确地采集和存储健康数据,直接影响系统的功能实现和用户体验。本文以 AI-HEALTH 系统为例,详细介绍健康数据的采集策略、数据模型设计、清洗预处理以及存储方案选择。


 一、数据采集策略

 1. 多维度数据采集

AI-HEALTH 系统采集的健康数据涵盖五大维度:

  • 饮食数据:食物类型、卡路里、摄入时间、食物照片
  • 运动数据:运动类型、时长、卡路里消耗、运动照片
  • 睡眠数据:入睡时间、起床时间、睡眠质量、睡眠照片
  • 体重数据:体重值、测量时间、体重变化趋势
  • 情绪数据:情绪状态、记录时间、情绪原因、情绪照片

2. 采集方式

系统支持多种数据采集方式:

  • 手动输入:用户通过表单填写详细信息
  • 照片上传:支持上传相关照片(如食物、运动场景)
  • 数据导入:支持从其他健康应用导入数据

3. 采集流程优化

为提升用户体验,系统设计了以下优化策略:

  • 批量操作:支持批量添加和删除记录
  • 快速记录:提供常用选项和快捷输入方式
  • 数据验证:实时验证数据合法性,减少错误输入

二、数据模型设计

1. 核心实体设计

系统采用 JPA 实现数据模型,核心实体包括:

用户实体(User)

@Entity
@Table(indexes = {
    @Index(name = "idx_user_username", columnList = "username")
})
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String password;
    private String email;
    
    // 个人信息字段
    private String title;
    private String gender;
    private Double height;
    private Double weight;
    private Double bodyFatPercentage;
    private String lifestyle;
    private String city;
    private String birthDate;
    private String bio;
    private String phoneNumber;
    private String qq;
    private String goal;
    private String analysisNotes;
    private String registrationDate;
    
    // 其他属性
    @Lob
    @Column(columnDefinition = "LONGTEXT")
    private String filterPreferences;
    
    // 密保问题相关
    private String securityQuestion;
    private String securityAnswer;
    
    // AI助手设置
    private String aiAssistantName;
    private String aiAssistantAvatarType;
    private String aiAssistantPersonality;
    
    // 关联关系
    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
    private UserAvatar avatar;
    
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<UserPhoto> photos;
    
    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
    private AiAssistantAvatar aiAssistantAvatar;
}

健康记录实体(以饮食记录为例)
 

@Entity
@Table(indexes = {
    @Index(name = "idx_food_record_username", columnList = "username"),
    @Index(name = "idx_food_record_record_time", columnList = "recordTime")
})
public class FoodRecord {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String mealType;
    private LocalDateTime recordTime;
    private String calories;
    private String notes;
    private boolean favorited = false;
    
    // 关联关系
    @OneToMany(mappedBy = "foodRecord", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<FoodItem> foodItems;
    
    @OneToMany(mappedBy = "foodRecord", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<FoodPhoto> photos;
}

2. 实体关系设计

系统采用以下关系设计:

  • 用户与头像/照片:一对多关系(一个用户多个头像/照片)
  • 用户与AI助手:一对一关系(一个用户一个AI助手配置)
  • 健康记录与食物项:一对多关系(一条饮食记录多个食物项)
  • 健康记录与照片:一对多关系(一条记录多张照片)
  • 健康记录与用户:通过username字段关联(非外键约束)

3. 数据模型优化

  • 索引设计:在高频查询字段上创建索引,如 `username`、`recordTime`
  • 字段类型优化:根据数据特性选择合适的字段类型,如时间使用 `LocalDateTime`
  • 级联操作:使用 JPA 级联操作简化数据管理
  • 软删除:支持软删除,保留历史数据
  • 数据关联:通过 username 字段关联用户与健康记录,简化数据查询

三、数据清洗与预处理

1. 数据验证

系统在数据采集阶段进行多层验证:

  • 前端验证:使用 Element Plus 表单验证规则
  • 后端验证:使用 Spring Validation 进行数据合法性检查
  • 业务规则验证:如卡路里范围、时间逻辑等

 2. 异常值处理

针对异常数据,系统采取以下策略:

  • 阈值过滤:设置合理的数值范围(如体重、卡路里)
  • 趋势分析:检测数据突变,提示用户确认
  • 历史对比:与历史数据对比,识别异常值
  • 自动修正:对明显错误进行自动修正或提示

3. 数据标准化

为确保数据一致性,系统进行以下标准化处理:

  • 时间格式:统一使用 `yyyy-MM-dd'T'HH:mm` 格式
  • 单位统一:如体重统一使用 kg,长度统一使用 cm
  • 分类标准化:对食物、运动类型等进行分类编码
  • 数据格式转换:如照片转换为 Base64 存储

4. 数据集成

系统支持多源数据集成:

  • 第三方数据导入:支持从 Apple Health、Google Fit 等导入数据
  • 数据格式转换:将外部数据转换为系统标准格式
  • 数据合并:合并重复记录,避免数据冗余

 四、存储方案选择

1. 关系型数据库选择

系统选择 MySQL 作为主存储方案,原因如下:

  • 结构化数据:健康记录具有明确的结构和关系
  • 事务支持:确保数据操作的原子性和一致性
  • 成熟稳定:MySQL 是成熟的关系型数据库,适合生产环境
  • 生态完善:与 Spring Boot、JPA 集成良好

2. 存储优化策略

  • 连接池配:使用 HikariCP 连接池,优化数据库连接
  • 批量操作:使用 JPA 批量操作,减少数据库交互次数
  • 缓存策略:使用 Ehcache 缓存热点数据,提升查询性能
  • 分区表:对历史数据进行分区,优化查询效率

3. 照片存储方案

系统采用数据库存储照片数据:

  • 照片实体:创建专门的照片实体(如 FoodPhoto、WorkoutPhoto)
  • Base64 存储:照片以 Base64 格式存储在数据库中
  • 关联关系:通过外键与健康记录关联
  • 数据查询:通过 JPA 查询获取照片数据

照片实体(以 FoodPhoto 为例)
 

@Entity
public class FoodPhoto {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String photoData;
    private String contentType;
    
    @ManyToOne
    @JoinColumn(name = "food_record_id")
    private FoodRecord foodRecord;
}

五、总结

健康数据的采集与存储是健康管理系统的基础,直接影响系统的功能实现和用户体验。AI-HEALTH 系统通过多维度数据采集、合理的数据模型设计、严格的数据清洗预处理以及优化的存储方案,确保了数据的准确性、完整性和安全性。

系统采用了以下关键技术:

  • JPA 数据模型:实现对象关系映射,简化数据操作
  • 索引优化:提升查询性能
  • 级联操作:简化数据管理
  • Base64 照片存储:方便照片数据的管理和查询
  • 多维度数据关联:通过 username 字段关联用户与健康记录
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐