外观
核心业务表
本节覆盖除 RAG 之外的业务表。字段类型以生产 RDS catalog 为准,读写路径以 backend repository、service 和 use case 为准。
用户与档案
users
用户认证主体和基础身份资料。
| Field | Type | Nullable | Description |
|---|---|---|---|
pk_user | varchar(255) | no | 主键。 |
user_no | varchar(255) | no | 用户编号,唯一。 |
phone | varchar(20) | no | 登录手机号,唯一;正式文档不写真实值。 |
password | varchar(255) | yes | 密码哈希。 |
user_nickname | varchar(255) | yes | 昵称。 |
user_name | varchar(255) | yes | 姓名。 |
id_no | varchar(255) | yes | 证件号字段;文档和日志必须脱敏。 |
gender | varchar(10) | yes | 性别。 |
birth | date | yes | 出生日期。 |
email、address、avatar | varchar | yes | 联系与头像信息。 |
status | bool | no | 账户启用状态。 |
health_info_completed | bool | no | 建档信息完成标记。 |
create_time、update_time | timestamptz | yes | 账户创建与更新时间。 |
Relations and indexes:
| Type | Definition |
|---|---|
| PK | PRIMARY KEY (pk_user) |
| Unique | user_no、phone |
| Children | user_profiles、user_diseases、user_operations、user_health_profiles、sport_schemes、sport_logs、chat_sessions、dialogue_logs、update_logs、virtual_companion |
Read / Write:
| Path | Read | Write |
|---|---|---|
| Auth | 按 phone 或 pk_user 查询用户 | 注册、密码注册、健康信息完成状态 |
| User/Profile | 读取完整档案 | 更新基础信息、头像引用 |
| Companion/Sport/Chat | 读取用户画像上下文 | 不直接写账户主体 |
user_profiles
用户健康指标、肿瘤档案概览和评估上下文。
| Field | Type | Nullable | Description |
|---|---|---|---|
pk_user_normal | varchar(255) | no | 主键。 |
pk_user | varchar(255) | no | FK -> users.pk_user,唯一。 |
height、weight、bloodtype | integer / varchar(10) | yes | 基础健康指标。 |
sys、dia、pulse | integer | yes | 血压与脉搏。 |
age、bmi、fitness_level | integer / float8 / varchar(50) | yes | 评估和展示字段。 |
cancer_type、cancer_subtype、treatment_stage | varchar | yes | 肿瘤与治疗阶段概览。 |
has_bone_metastasis | bool | yes | 骨转移标记。 |
diagnosis_date | date | yes | 诊断日期,按业务日期处理。 |
assessment_context | json | yes | 评估上下文快照。 |
data_source | varchar(20) | yes | 数据来源。 |
created_at、updated_at | timestamptz | yes | 记录创建与更新时间。 |
Relations and indexes:
| Type | Definition |
|---|---|
| FK | FOREIGN KEY (pk_user) REFERENCES users(pk_user) |
| Unique | UNIQUE (pk_user) |
| Indexes | user_profiles_pkey、user_profiles_pk_user_key |
Read / Write:
| Path | Read | Write |
|---|---|---|
| User profile | 读取健康指标、肿瘤信息、建档完成度 | UserService.update_health_metrics |
| Chat/RAG | 读取年龄、体重、肿瘤类型、治疗阶段等上下文 | 不在 Chat 主链直接写 |
| Assessment | 读取/写入 assessment context | 提交完整评估后更新快照入口 |
user_diseases
用户疾病史,多条记录归属于同一用户。
| Field | Type | Nullable | Description |
|---|---|---|---|
pk_user_disease | varchar(255) | no | 主键。 |
pk_user | varchar(255) | no | FK -> users.pk_user。 |
disease_name | varchar(255) | no | 疾病名称。 |
disease_stage | varchar(50) | yes | 分期或阶段。 |
ifdel | bool | yes | 软删除标记。 |
Read / Write:
| Path | Read | Write |
|---|---|---|
| User profile | 完整档案读取、profile completion | 新增、更新、软删除疾病史 |
| Chat/RAG | 作为用户上下文的一部分读取 | 不直接写 |
user_operations
用户手术史,多条记录归属于同一用户。
| Field | Type | Nullable | Description |
|---|---|---|---|
pk_user_operation | varchar(255) | no | 主键。 |
pk_user | varchar(255) | no | FK -> users.pk_user。 |
oprt_disease | varchar(255) | no | 手术相关疾病。 |
oprt_stage | varchar(50) | yes | 手术阶段。 |
oprt_time | date | yes | 手术日期,按业务日期处理。 |
ifdel | bool | yes | 软删除标记。 |
Read / Write:
| Path | Read | Write |
|---|---|---|
| User profile | 完整档案读取、profile completion | 新增、更新、软删除手术史 |
| Chat/RAG | 作为用户上下文的一部分读取 | 不直接写 |
user_health_profiles
安全筛查和完整评估快照表。该表的 id/user_id 已按字符串 UUID 契约对齐,user_id 外键带 ON DELETE CASCADE。
| Field | Type | Nullable | Description |
|---|---|---|---|
id | varchar(255) | no | 主键。 |
user_id | varchar(255) | no | FK -> users.pk_user,级联删除。 |
safety_check_data | jsonb | yes | 安全筛查 canonical payload。 |
assessment_data | jsonb | yes | 完整评估 canonical payload。 |
risk_level | varchar(20) | no | 风险等级,默认 GREEN。 |
created_at、updated_at | timestamptz | yes | 快照时间。 |
Indexes:
| Index | Purpose |
|---|---|
ix_user_health_profiles_user_id | 按用户读取评估快照。 |
ix_user_health_created | 按创建时间排查或取最近记录。 |
Read / Write:
| Path | Read | Write |
|---|---|---|
| Assessment | GET /api/assessment/last 类链路读取最近评估 | POST /api/assessment/safety_check、POST /api/assessment/submit 写入快照 |
| Safety | 使用风险等级与筛查结果 | 不直接替代医生诊断 |
Chat
chat_sessions
AI 对话会话分组。
| Field | Type | Nullable | Description |
|---|---|---|---|
id | varchar(255) | no | 会话 ID。 |
user_id | varchar(255) | no | FK -> users.pk_user。 |
title | varchar(255) | yes | 会话标题。 |
created_at、updated_at | timestamptz | yes | 创建与更新时间。 |
is_deleted | bool | no | 软删除标记。 |
Indexes:
| Index | Purpose |
|---|---|
idx_chat_sessions_user_active_updated | user_id + updated_at,仅覆盖未删除会话。 |
Read / Write:
| Path | Read | Write |
|---|---|---|
| Chat history/session | 会话列表、按 ID 验证用户归属 | 新建会话、更新时间与标题、软删除 |
| Chat message | 无 session 时创建新会话 | 更新 session 更新时间 |
dialogue_logs
AI 对话记录表,保留旧 dialogue_log 文本字段,同时提供结构化字段和 RAG/safety 元数据。
| Field | Type | Nullable | Description |
|---|---|---|---|
pk_dialogue_log | varchar(255) | no | 主键。 |
pk_user | varchar(255) | no | FK -> users.pk_user。 |
session_id | varchar(255) | yes | FK -> chat_sessions.id。 |
dialogue_log | text | no | canonical 对话 payload 的兼容承载字段。 |
message_role | varchar(20) | no | user / assistant 等角色。 |
message_content | text | yes | 结构化消息内容。 |
input_type | varchar(10) | no | 输入类型,默认 text。 |
status | varchar(20) | no | 消息状态,默认 sent。 |
rag_context | jsonb | yes | RAG 来源摘要。 |
confidence | numeric(3,2) | yes | 模型置信度。 |
risk_level、safety_flags、requires_review | varchar / text / bool | yes | 安全过滤结果。 |
message_hash | varchar(64) | yes | 幂等键。 |
sync_status、local_timestamp | varchar(20) / timestamptz | no / yes | 客户端同步相关字段。 |
create_time | timestamptz | yes | 创建时间。 |
Indexes:
| Index | Purpose |
|---|---|
idx_dialogue_logs_user_created | 用户维度按时间读取历史。 |
idx_dialogue_logs_user_session_created | 用户 + session 维度读取历史。 |
idx_dialogue_logs_user_hash_created | 用户 + 幂等键回查。 |
ix_dialogue_logs_message_hash | 幂等键索引。 |
Read / Write:
| Path | Read | Write |
|---|---|---|
POST /api/chat/message | 读取当前 session 最近历史 | 写入用户消息与 AI 响应 payload |
GET /api/chat/history | 按 user/session/time 分页读取 | 不写 |
POST /api/prescription/generate | 不直接读 | 有 session 时写入处方卡片消息 |
| Safety | 通过 risk_level、safety_flags 支持排查 | 高风险输出可标记 requires_review |
dialogue_logs_archive
对话冷数据归档表,不挂用户外键,保留归档批次与原因。
| Field Group | Description |
|---|---|
| 对话快照 | pk_dialogue_log、pk_user、session_id、dialogue_log、message_role、message_content |
| RAG/safety | rag_context、confidence、risk_level、safety_flags、requires_review |
| 归档元数据 | archived_at、archive_batch_id、archive_reason |
Indexes:
| Index | Purpose |
|---|---|
idx_dialogue_logs_archive_user_created | 按用户和时间排查归档记录。 |
idx_dialogue_logs_archive_batch | 按归档批次追踪。 |
idx_dialogue_logs_archive_archived_at | 按归档时间检索。 |
运动与处方
sport_schemes
运动处方主表,处方主体以 canonical JSON payload 存在 sportscheme 字段。
| Field | Type | Nullable | Description |
|---|---|---|---|
pk_sport_scheme | varchar(255) | no | 主键。 |
pk_user | varchar(255) | no | FK -> users.pk_user。 |
sportscheme | text | no | 处方 JSON payload。 |
scheme_start、scheme_end | date | yes | 方案生效日期。 |
create_time | timestamptz | yes | 创建时间。 |
check_status | checkstatus | yes | 审核状态 enum:待审核、已审核。 |
check_result | checkresult | yes | 审核结果 enum:通过、不通过。 |
is_demo | bool | yes | Demo 处方标记。 |
Indexes:
| Index | Purpose |
|---|---|
idx_sport_schemes_user_created | 用户处方列表,按创建时间倒序。 |
idx_sport_schemes_user_end_created | 当前活跃方案查询。 |
Read / Write:
| Path | Read | Write |
|---|---|---|
POST /api/prescription/generate | 读取用户档案/RAG 后生成 | 写入新处方 |
| Sport schemes/history | 按用户读取方案列表与活跃方案 | 更新或停用方案 |
| Chat card | 读取 scheme_id 供前端跳转 | 不直接修改处方 |
sport_logs
运动执行记录,支持进行中运动、反馈提交、日历和历史查询。
| Field | Type | Nullable | Description |
|---|---|---|---|
pk_sport_log | varchar(255) | no | 主键。 |
pk_user | varchar(255) | no | FK -> users.pk_user。 |
sport_name | varchar(255) | no | 运动名称。 |
estimate_time | timestamptz | yes | 预计时间。 |
sport_start | timestamptz | no | 运动开始时间。 |
sport_end | timestamptz | yes | 运动结束时间。 |
cal | integer | no | 热量。 |
iffinish | bool | no | 完成标记。 |
sport_feedback | varchar(500) | yes | 用户反馈,当前可承载 JSON 字符串。 |
ifdel | bool | no | 软删除标记。 |
create_time | timestamptz | no | 创建时间。 |
Indexes:
| Index | Purpose |
|---|---|
idx_sport_logs_user_created_active | 用户运动记录列表。 |
idx_sport_logs_user_start_active | 日历与时间区间查询。 |
idx_sport_logs_user_unfinished_active | 当前进行中运动查询。 |
Read / Write:
| Path | Read | Write |
|---|---|---|
POST /api/sport/log | 检查是否存在进行中运动 | 创建运动记录 |
PUT /api/sport/log/{log_id} | 按 ID 读取 | 更新结束时间、热量、完成状态、反馈 |
GET /api/sport/logs/calendar | 按用户与日期范围读取 | 不写 |
GET /api/sport/history | 按用户、日期、运动类型过滤 | 不写 |
安全、陪伴、认证与审计
safety_incidents
安全事件记录。
| Field | Type | Nullable | Description |
|---|---|---|---|
pk_safety_incident | varchar(255) | no | 主键。 |
pk_user | varchar(255) | no | FK -> users.pk_user。 |
pk_dialogue_log | varchar(255) | yes | FK -> dialogue_logs.pk_dialogue_log。 |
incident_type、severity | varchar | no | 事件类型与严重级别。 |
description、action_taken | text | yes | 描述与处理动作。 |
resolved | bool | yes | 是否解决。 |
create_time、resolve_time | timestamptz | yes | 创建与解决时间。 |
virtual_companion
虚拟陪练配置,每个用户最多一条。
| Field | Type | Nullable | Description |
|---|---|---|---|
pk_virtual_companion | varchar(255) | no | 主键。 |
pk_user | varchar(255) | no | FK -> users.pk_user,唯一,级联删除。 |
gender、age_group、current_emotion | varchar(10) | no | 形象基础配置与状态。 |
health_score | integer | yes | 健康分。 |
position_config、appearance_config | json | yes | 前端位置与外观配置。 |
last_status_update、created_at、updated_at | timestamptz | yes | 状态更新时间。 |
Indexes:
| Index | Purpose |
|---|---|
virtual_companion_pk_user_key | 保证每个用户唯一配置。 |
idx_virtual_companion_user_id | 按用户读取配置。 |
idx_virtual_companion_state | 按形象状态组合检索。 |
sms_verifications
短信验证码记录。
| Field | Type | Nullable | Description |
|---|---|---|---|
pk_sms_verification | varchar(255) | no | 主键。 |
phone | varchar(20) | no | 手机号;正式文档不写真实值。 |
code | varchar(6) | no | 验证码;日志与文档不得写真实值。 |
codetype | varchar(50) | no | 验证码用途。 |
expired_time | timestamptz | no | 过期时间。 |
ifuse | bool | no | 是否已使用。 |
create_time | timestamptz | yes | 创建时间。 |
login_logs
登录审计记录。
| Field | Type | Nullable | Description |
|---|---|---|---|
pk_login_log | varchar(255) | no | 主键。 |
pk_user | varchar(255) | no | 用户 ID;生产库未声明外键。 |
login_time | timestamptz | yes | 登录时间。 |
login_ip、login_device、app_version | varchar | yes | 登录来源信息,文档不写真实样例。 |
login_method | varchar(50) | no | 登录方式。 |
ifsuccess | bool | no | 是否成功。 |
fail_reason | varchar(255) | yes | 失败原因。 |
update_logs
用户资料变更审计。
| Field | Type | Nullable | Description |
|---|---|---|---|
pk_update_log | varchar(255) | no | 主键。 |
pk_user | varchar(255) | no | FK -> users.pk_user。 |
update_name | varchar(255) | yes | 变更字段名。 |
val | varchar(255) | yes | 变更值摘要;不得写真实敏感样例。 |
create_time | timestamptz | yes | 创建时间。 |
Index: idx_update_logs_user_created,服务于用户维度按时间倒序查询。
system_configs
系统配置和 feature flag。
| Field | Type | Nullable | Description |
|---|---|---|---|
id | varchar(255) | no | 主键。 |
config_key | varchar(100) | no | 配置键,唯一。 |
config_value | jsonb | no | 配置值。 |
config_type | varchar(50) | no | 配置类型。 |
description | text | yes | 描述。 |
is_active | bool | no | 是否启用。 |
created_at、updated_at | timestamptz | no | 创建与更新时间。 |
data_migration_log
数据迁移日志。
| Field | Type | Nullable | Description |
|---|---|---|---|
id | varchar(255) | no | 主键。 |
migration_type | varchar(50) | no | 迁移类型。 |
source_description | text | no | 来源描述。 |
target_table | varchar(100) | no | 目标表。 |
records_migrated | integer | no | 迁移记录数。 |
migration_status | varchar(20) | no | 状态。 |
error_message | text | yes | 错误摘要。 |
started_at、completed_at | timestamptz | no / yes | 起止时间。 |
migration_metadata | jsonb | yes | 迁移元数据。 |
来源锚点
- ORM:
apps/backend_service/app/models/ - Production catalog: RDS
core_baseinformation_schema.columns、pg_constraint、pg_indexes - Repositories:
apps/backend_service/app/repositories/user_repository.py、dialogue_repository.py、sport_log_repository.py、sport_scheme_repository.py - Services / use cases:
apps/backend_service/app/services/user_service.py、sport_service.py、prescription_service.py、apps/backend_service/app/use_cases/ - Migrations:
apps/backend_service/alembic/versions/2b6d9f3a4c1e_align_production_schema_contracts.py、4f16c8d2a9b1_add_operational_indexes_for_sport_and_audit.py、6e18b4a7c2d3_normalize_operational_timestamps_to_timestamptz.py、7d18e9f1a2b4_convert_business_dates_to_date.py