-- 药物管理相关表创建脚本 -- 创建时间: 2025-01-15 -- 说明: 包含药物信息表和服药记录表 -- ========================================== -- 1. 药物信息表 (t_medications) -- ========================================== CREATE TABLE IF NOT EXISTS `t_medications` ( `id` varchar(50) NOT NULL COMMENT '药物唯一标识', `user_id` varchar(50) NOT NULL COMMENT '用户ID', `name` varchar(100) NOT NULL COMMENT '药物名称', `photo_url` varchar(255) DEFAULT NULL COMMENT '药物照片URL', `form` varchar(20) NOT NULL COMMENT '药物剂型:capsule/pill/injection/spray/drop/syrup/other', `dosage_value` decimal(10,2) NOT NULL COMMENT '剂量数值', `dosage_unit` varchar(20) NOT NULL COMMENT '剂量单位(片、粒、毫升等)', `times_per_day` int NOT NULL COMMENT '每日服用次数', `medication_times` json NOT NULL COMMENT '服药时间列表,格式:["08:00", "20:00"]', `repeat_pattern` varchar(20) NOT NULL DEFAULT 'daily' COMMENT '重复模式:daily/weekly/custom', `start_date` datetime NOT NULL COMMENT '开始日期(UTC时间)', `end_date` datetime DEFAULT NULL COMMENT '结束日期(UTC时间,可选)', `note` text COMMENT '备注信息', `is_active` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否激活:1=激活,0=停用', `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '软删除标记:0=未删除,1=已删除', PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`), KEY `idx_is_active` (`is_active`), KEY `idx_user_active` (`user_id`, `is_active`), KEY `idx_deleted` (`deleted`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='药物信息表'; -- ========================================== -- 2. 服药记录表 (t_medication_records) -- ========================================== CREATE TABLE IF NOT EXISTS `t_medication_records` ( `id` varchar(50) NOT NULL COMMENT '记录唯一标识', `medication_id` varchar(50) NOT NULL COMMENT '关联的药物ID', `user_id` varchar(50) NOT NULL COMMENT '用户ID', `scheduled_time` datetime NOT NULL COMMENT '计划服药时间(UTC时间)', `actual_time` datetime DEFAULT NULL COMMENT '实际服药时间(UTC时间)', `status` varchar(20) NOT NULL COMMENT '服药状态:upcoming/taken/missed/skipped', `note` text COMMENT '备注', `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '软删除标记:0=未删除,1=已删除', PRIMARY KEY (`id`), KEY `idx_medication_id` (`medication_id`), KEY `idx_user_id` (`user_id`), KEY `idx_scheduled_time` (`scheduled_time`), KEY `idx_status` (`status`), KEY `idx_user_scheduled` (`user_id`, `scheduled_time`), KEY `idx_user_date_status` (`user_id`, `scheduled_time`, `status`), KEY `idx_deleted` (`deleted`), CONSTRAINT `fk_medication_records_medication` FOREIGN KEY (`medication_id`) REFERENCES `t_medications` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='服药记录表'; -- ========================================== -- 3. 索引优化说明 -- ========================================== -- idx_user_id: 用于快速查询用户的所有药物 -- idx_is_active: 用于筛选激活状态的药物 -- idx_user_active: 复合索引,优化查询用户的激活药物 -- idx_user_scheduled: 复合索引,优化按日期查询用户的服药记录 -- idx_user_date_status: 复合索引,优化统计查询 -- idx_status: 用于定时任务批量更新状态 -- ========================================== -- 4. 数据约束说明 -- ========================================== -- 1. form 字段只能是预定义的剂型枚举值 -- 2. repeat_pattern 当前只支持 'daily' -- 3. status 字段只能是 upcoming/taken/missed/skipped -- 4. medication_times 必须是有效的 JSON 数组 -- 5. 外键约束确保记录关联的药物存在 -- ========================================== -- 5. 使用示例 -- ========================================== -- 插入药物示例: -- INSERT INTO t_medications (id, user_id, name, form, dosage_value, dosage_unit, -- times_per_day, medication_times, repeat_pattern, start_date) -- VALUES ('med_001', 'user_123', 'Metformin', 'capsule', 1, '粒', -- 2, '["08:00", "20:00"]', 'daily', '2025-01-01 00:00:00'); -- 插入服药记录示例: -- INSERT INTO t_medication_records (id, medication_id, user_id, scheduled_time, status) -- VALUES ('record_001', 'med_001', 'user_123', '2025-01-15 08:00:00', 'upcoming');