
1) 【一句话结论】:电子病历系统核心数据库通过关系型表设计,以患者ID为纽带关联病历、诊断、药品等表,通过外键约束保证数据一致性,并利用时间戳列和索引优化时间顺序查询性能。
2) 【原理/概念讲解】:电子病历系统属于典型的关系型数据库应用,核心是设计表结构并建立关联。关系型数据库用表存储数据,表间通过**外键(Foreign Key)**关联,实现数据复用。比如患者表与病历表是一对多关系(一个患者对应多份病历),病历表与诊断表是一对多(一份病历包含多个诊断),诊断表与药品表是多对多(一个诊断可能对应多种药品,一种药品用于多个诊断),此时需通过中间表(如诊断-药品关联表)实现多对多。**索引(如B树索引)**用于加速查询,特别是时间范围查询,因为时间列适合用范围索引(如按时间顺序查病历记录)。
3) 【对比与适用场景】:
| 表名 | 关键字段 | 关联关系 | 说明 |
|---|---|---|---|
| 患者表 | 患者ID(主键)、姓名、身份证号、联系方式 | 一对多(患者-病历) | 每个患者对应多份病历 |
| 病历表 | 病历ID(主键)、患者ID(外键)、创建时间(时间戳)、状态 | 一对多(病历-诊断/检查/药品) | 一份病历包含多个诊断、检查、药品记录 |
| 诊断表 | 诊断ID(主键)、病历ID(外键)、诊断内容、诊断时间 | 一对多(病历-诊断) | 一份病历有多个诊断 |
| 药品表 | 药品ID(主键)、药品名称、规格、厂家 | 多对多(诊断-药品,通过中间表) | 一种药品用于多个诊断,一个诊断用多种药品 |
| 检查表 | 检查ID(主键)、病历ID(外键)、检查项目、检查结果 | 一对多(病历-检查) | 一份病历有多个检查记录 |
4) 【示例】:伪代码表结构(最小可运行示例):
-- 患者表
CREATE TABLE patient (
patient_id INT PRIMARY KEY,
name VARCHAR(100),
id_card VARCHAR(18),
phone VARCHAR(11)
);
-- 病历表(带时间戳,用于时间顺序查询)
CREATE TABLE medical_record (
record_id INT PRIMARY KEY,
patient_id INT,
create_time TIMESTAMP NOT NULL,
status VARCHAR(20),
FOREIGN KEY (patient_id) REFERENCES patient(patient_id)
);
-- 诊断表
CREATE TABLE diagnosis (
diagnosis_id INT PRIMARY KEY,
record_id INT,
diagnosis_content TEXT,
diagnosis_time TIMESTAMP,
FOREIGN KEY (record_id) REFERENCES medical_record(record_id)
);
-- 药品表
CREATE TABLE drug (
drug_id INT PRIMARY KEY,
drug_name VARCHAR(100),
specification VARCHAR(50),
manufacturer VARCHAR(100)
);
-- 多对多关联中间表(诊断-药品)
CREATE TABLE diagnosis_drug (
diagnosis_id INT,
drug_id INT,
PRIMARY KEY (diagnosis_id, drug_id),
FOREIGN KEY (diagnosis_id) REFERENCES diagnosis(diagnosis_id),
FOREIGN KEY (drug_id) REFERENCES drug(drug_id)
);
-- 检查表
CREATE TABLE checkup (
checkup_id INT PRIMARY KEY,
record_id INT,
checkup_item VARCHAR(100),
checkup_result TEXT,
FOREIGN KEY (record_id) REFERENCES medical_record(record_id)
);
5) 【面试口播版答案】:
面试官您好,设计电子病历系统的核心数据库表结构,我会从表设计、关联关系和性能优化三方面说明。首先,表设计以患者ID为纽带,患者表存储患者基本信息,病历表关联患者并记录创建时间;病历表与诊断表、检查表是一对多关系(一份病历包含多个诊断/检查),诊断表与药品表是多对多关系(通过中间表关联)。关联关系通过外键约束保证数据一致性,比如病历表的外键指向患者表。性能优化方面,为时间顺序查询(如按时间查病历记录),在病历表的create_time列建立B树索引,加速范围查询。核心是利用关系型数据库的表关联和外键,结合索引优化查询效率,确保数据完整性和查询性能。
6) 【追问清单】:
7) 【常见坑/雷区】: