schema.sql 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. -- ========================================
  2. -- 数智健调系统 - 体重管理模块数据库架构
  3. -- ========================================
  4. -- 版本: 1.0
  5. -- 创建日期: 2025-10-20
  6. -- 说明: 体重管理核心表结构定义
  7. -- ========================================
  8. -- 设置字符集
  9. SET NAMES utf8mb4;
  10. SET CHARACTER SET utf8mb4;
  11. -- ========================================
  12. -- 表1: users (用户表)
  13. -- ========================================
  14. CREATE TABLE IF NOT EXISTS `users` (
  15. `id` VARCHAR(36) NOT NULL COMMENT '用户ID(UUID)',
  16. `phone` VARCHAR(20) NOT NULL COMMENT '手机号',
  17. `nickname` VARCHAR(50) NOT NULL COMMENT '昵称',
  18. `school_id` VARCHAR(36) DEFAULT NULL COMMENT '学校ID',
  19. `grade` VARCHAR(20) DEFAULT NULL COMMENT '年级',
  20. `is_under_14` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否未满14岁',
  21. `parent_phone` VARCHAR(20) DEFAULT NULL COMMENT '家长手机号',
  22. `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  23. `updated_at` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  24. `deleted_at` TIMESTAMP NULL DEFAULT NULL COMMENT '软删除时间',
  25. PRIMARY KEY (`id`),
  26. UNIQUE KEY `uk_phone` (`phone`),
  27. KEY `idx_school_id` (`school_id`),
  28. KEY `idx_deleted_at` (`deleted_at`)
  29. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
  30. -- ========================================
  31. -- 表2: weight_records (体重记录表) ⭐
  32. -- ========================================
  33. CREATE TABLE IF NOT EXISTS `weight_records` (
  34. `id` VARCHAR(36) NOT NULL COMMENT '记录ID(UUID)',
  35. `user_id` VARCHAR(36) NOT NULL COMMENT '用户ID',
  36. `record_date` DATE NOT NULL COMMENT '记录日期',
  37. `measurement_time` TIME DEFAULT NULL COMMENT '测量时间',
  38. `weight` DECIMAL(5,2) NOT NULL COMMENT '体重(kg),范围30.00-200.00',
  39. `body_fat` DECIMAL(4,2) NOT NULL COMMENT '体脂率(%),范围5.00-60.00',
  40. `muscle_mass` DECIMAL(5,2) NOT NULL COMMENT '肌肉含量(kg),范围10.00-100.00',
  41. `measurement_condition` ENUM('fasting', 'after_meal') DEFAULT NULL COMMENT '测量条件:空腹/餐后',
  42. `notes` TEXT DEFAULT NULL COMMENT '备注',
  43. `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  44. `updated_at` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  45. `deleted_at` TIMESTAMP NULL DEFAULT NULL COMMENT '软删除时间',
  46. PRIMARY KEY (`id`),
  47. KEY `idx_user_date` (`user_id`, `record_date` DESC),
  48. KEY `idx_user_created` (`user_id`, `created_at` DESC),
  49. KEY `idx_measurement_condition` (`measurement_condition`),
  50. KEY `idx_deleted_at` (`deleted_at`),
  51. CONSTRAINT `fk_weight_records_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
  52. CONSTRAINT `chk_weight` CHECK (`weight` >= 30.00 AND `weight` <= 200.00),
  53. CONSTRAINT `chk_body_fat` CHECK (`body_fat` >= 5.00 AND `body_fat` <= 60.00),
  54. CONSTRAINT `chk_muscle_mass` CHECK (`muscle_mass` >= 10.00 AND `muscle_mass` <= 100.00)
  55. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='体重记录表';
  56. -- ========================================
  57. -- 表3: weight_goals (体重目标表) ⭐
  58. -- ========================================
  59. CREATE TABLE IF NOT EXISTS `weight_goals` (
  60. `id` VARCHAR(36) NOT NULL COMMENT '目标ID(UUID)',
  61. `user_id` VARCHAR(36) NOT NULL COMMENT '用户ID',
  62. `target_weight` DECIMAL(5,2) NOT NULL COMMENT '目标体重(kg)',
  63. `target_body_fat` DECIMAL(4,2) DEFAULT NULL COMMENT '目标体脂率(%)',
  64. `target_date` DATE NOT NULL COMMENT '目标日期',
  65. `start_weight` DECIMAL(5,2) NOT NULL COMMENT '起始体重(kg)',
  66. `start_body_fat` DECIMAL(4,2) DEFAULT NULL COMMENT '起始体脂率(%)',
  67. `start_date` DATE NOT NULL COMMENT '开始日期',
  68. `weekly_target` DECIMAL(4,2) DEFAULT NULL COMMENT '每周目标减重量(kg)',
  69. `status` ENUM('active', 'completed', 'abandoned') NOT NULL DEFAULT 'active' COMMENT '状态',
  70. `completed_at` TIMESTAMP NULL DEFAULT NULL COMMENT '完成时间',
  71. `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  72. `updated_at` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  73. `deleted_at` TIMESTAMP NULL DEFAULT NULL COMMENT '软删除时间',
  74. PRIMARY KEY (`id`),
  75. KEY `idx_user_status` (`user_id`, `status`),
  76. KEY `idx_user_created` (`user_id`, `created_at` DESC),
  77. KEY `idx_deleted_at` (`deleted_at`),
  78. CONSTRAINT `fk_weight_goals_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
  79. CONSTRAINT `chk_target_date` CHECK (`target_date` > `start_date`)
  80. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='体重目标表';
  81. -- ========================================
  82. -- 表4: tags (标签表)
  83. -- ========================================
  84. CREATE TABLE IF NOT EXISTS `tags` (
  85. `id` VARCHAR(36) NOT NULL COMMENT '标签ID(UUID)',
  86. `user_id` VARCHAR(36) DEFAULT NULL COMMENT '用户ID(NULL表示系统标签)',
  87. `tag_name` VARCHAR(50) NOT NULL COMMENT '标签名称',
  88. `tag_type` ENUM('system', 'custom') NOT NULL DEFAULT 'custom' COMMENT '类型:系统/自定义',
  89. `color` VARCHAR(7) DEFAULT NULL COMMENT '颜色代码(HEX)',
  90. `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  91. PRIMARY KEY (`id`),
  92. UNIQUE KEY `uk_user_tag` (`user_id`, `tag_name`),
  93. KEY `idx_tag_type` (`tag_type`),
  94. CONSTRAINT `fk_tags_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
  95. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='标签表';
  96. -- ========================================
  97. -- 表5: weight_record_tags (体重记录-标签关联表)
  98. -- ========================================
  99. CREATE TABLE IF NOT EXISTS `weight_record_tags` (
  100. `id` VARCHAR(36) NOT NULL COMMENT '关联ID(UUID)',
  101. `weight_record_id` VARCHAR(36) NOT NULL COMMENT '体重记录ID',
  102. `tag_id` VARCHAR(36) NOT NULL COMMENT '标签ID',
  103. `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  104. PRIMARY KEY (`id`),
  105. UNIQUE KEY `uk_record_tag` (`weight_record_id`, `tag_id`),
  106. KEY `idx_tag_id` (`tag_id`),
  107. CONSTRAINT `fk_wrt_record` FOREIGN KEY (`weight_record_id`) REFERENCES `weight_records` (`id`) ON DELETE CASCADE,
  108. CONSTRAINT `fk_wrt_tag` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE
  109. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='体重记录-标签关联表';
  110. -- ========================================
  111. -- 表6: anomaly_logs (异常日志表) - 扩展表
  112. -- ========================================
  113. CREATE TABLE IF NOT EXISTS `anomaly_logs` (
  114. `id` VARCHAR(36) NOT NULL COMMENT '日志ID(UUID)',
  115. `user_id` VARCHAR(36) NOT NULL COMMENT '用户ID',
  116. `anomaly_type` ENUM('rapid_change', 'body_fat_anomaly', 'missing_data', 'extreme_value') NOT NULL COMMENT '异常类型',
  117. `severity` ENUM('info', 'warning', 'danger') NOT NULL COMMENT '严重程度',
  118. `message` TEXT NOT NULL COMMENT '提示信息',
  119. `detected_date` DATE NOT NULL COMMENT '检测日期',
  120. `related_record_ids` JSON DEFAULT NULL COMMENT '相关记录ID数组',
  121. `is_read` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否已读',
  122. `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  123. PRIMARY KEY (`id`),
  124. KEY `idx_user_date` (`user_id`, `detected_date` DESC),
  125. KEY `idx_is_read` (`is_read`),
  126. CONSTRAINT `fk_anomaly_logs_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
  127. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='异常日志表';
  128. -- ========================================
  129. -- 插入系统预设标签
  130. -- ========================================
  131. INSERT INTO `tags` (`id`, `user_id`, `tag_name`, `tag_type`, `color`) VALUES
  132. (UUID(), NULL, '开始运动', 'system', '#3b82f6'),
  133. (UUID(), NULL, '目标调整', 'system', '#f59e0b'),
  134. (UUID(), NULL, '饮食改变', 'system', '#10b981'),
  135. (UUID(), NULL, '生病', 'system', '#ef4444'),
  136. (UUID(), NULL, '假期', 'system', '#8b5cf6'),
  137. (UUID(), NULL, '压力期', 'system', '#f97316')
  138. ON DUPLICATE KEY UPDATE `tag_name` = VALUES(`tag_name`);
  139. -- ========================================
  140. -- 创建视图:用户体重统计
  141. -- ========================================
  142. CREATE OR REPLACE VIEW `v_user_weight_stats` AS
  143. SELECT
  144. u.id AS user_id,
  145. u.nickname,
  146. COUNT(wr.id) AS total_records,
  147. MIN(wr.record_date) AS first_record_date,
  148. MAX(wr.record_date) AS last_record_date,
  149. (SELECT weight FROM weight_records WHERE user_id = u.id AND deleted_at IS NULL ORDER BY record_date DESC LIMIT 1) AS current_weight,
  150. (SELECT weight FROM weight_records WHERE user_id = u.id AND deleted_at IS NULL ORDER BY record_date ASC LIMIT 1) AS initial_weight,
  151. (SELECT body_fat FROM weight_records WHERE user_id = u.id AND deleted_at IS NULL ORDER BY record_date DESC LIMIT 1) AS current_body_fat
  152. FROM users u
  153. LEFT JOIN weight_records wr ON u.id = wr.user_id AND wr.deleted_at IS NULL
  154. WHERE u.deleted_at IS NULL
  155. GROUP BY u.id, u.nickname;
  156. -- ========================================
  157. -- 表结构创建完成
  158. -- ========================================