设计答案:患者、科室、医生、排班、号源、挂号记录和用户账号七表结构清晰,通过外键关联确保数据一致性,支持挂号业务全流程。患者表存基本信息;科室表管理科室数据;医生表关联所属科室;排班表定义医生出诊计划;号源表细化时间段与剩余号量;挂号记录表追踪每次挂号状态;用户账号表实现多角色登录。关键字段如phone、order_no等建索引提升查询效率,号源变更与挂号操作在事务中处理保证数据准确,status字段支持逻辑删除,整体结构可扩展且满足高并发场景下的预约、查询与统计需求。
设计一个医院挂号系统的MySQL数据表,需要考虑患者信息、医生信息、科室、排班、号源、挂号记录等核心模块。以下是合理的数据库结构设计,满足基本业务需求并具备扩展性。
1. 患者表(patient)
存储患者基本信息。
字段说明:
- id: 主键,自增
- name: 姓名(VARCHAR)
- gender: 性别(ENUM: ‘男’,’女’)
- phone: 手机号(唯一,用于登录或通知)
- id_card: 身份证号(唯一)
- birth_date: 出生日期
- create_time: 注册时间
2. 科室表(department)
医院的科室信息,如内科、外科等。
- id: 主键
- dept_name: 科室名称
- description: 简要描述
- tel: 科室电话
3. 医生表(doctor)
医生信息,关联科室。
- id: 主键
- name: 医生姓名
- dept_id: 所属科室ID(外键)
- title: 职称(如主治医师、主任医师)
- intro: 简介
- photo_url: 头像路径(可选)
4. 排班表(schedule)
医生每日出诊安排,决定可挂号的时间段。
- id: 主键
- doctor_id: 医生ID(外键)
- dept_id: 科室ID(冗余字段,便于查询)
- work_date: 出诊日期(如2025-04-05)
- shift_type: 班次(ENUM: ‘上午’,’下午’,’全天’)
- max_registration: 最大挂号人数
- current_num: 当前已挂号人数(可实时更新)
- status: 排班状态(如正常、停诊)
5. 号源表(registration_source)
将排班细化为具体时间段和剩余号数,支持分时段挂号。
- id: 主键
- schedule_id: 对应排班ID
- time_slot: 时间段(如 08:00-09:00)
- quota: 号源总数
- used: 已使用数量
- available: 剩余数量(可计算或更新)
6. 挂号记录表(registration)
每次挂号的具体记录。
- id: 主键
- patient_id: 患者ID(外键)
- doctor_id: 医生ID
- dept_id: 科室ID
- schedule_id: 排班ID
- source_id: 号源ID(可选,精确到时间段)
- reg_time: 挂号时间
- visit_date: 就诊日期
- status: 挂号状态(如待就诊、已取消、已完成)
- order_no: 挂号单号(唯一,业务编号)
7. 用户账号表(user_account)
用于系统登录(患者、管理员、医生等)。
- id: 主键
- username: 登录名(可为手机号)
- password_hash: 密码哈希值
- role: 角色(patient, doctor, admin)
- related_id: 关联ID(如 patient.id 或 doctor.id)
关键设计建议:
- 外键约束确保数据一致性,如 registration.patient_id 引用 patient.id
- 挂号时需检查号源 available > 0,并在插入后减一(事务处理)
- index 优化:在 patient.phone、schedule.doctor_id + work_date、registration.order_no 上建索引
- 逻辑删除可用 status 字段代替物理删除
基本上就这些,结构清晰,能支撑预约、查询、统计等常见功能。