当前位置: 首页 > article >正文

从需求到SQL:手把手教你将‘住院管理系统’的ER图转化为可运行的数据表(附建表语句)

从需求到SQL住院管理系统数据库设计实战指南在医疗信息化快速发展的今天一套设计良好的住院管理系统数据库不仅能提高医院运营效率更能为患者提供更精准的医疗服务。本文将带你从零开始完整实现一个住院病人信息管理系统的数据库设计过程。不同于教科书上的理论示例我们将聚焦于实际工程落地特别适合那些理解概念但不知如何编码的实践型开发者。1. 需求分析与ER图设计任何数据库设计的第一步都是深入理解业务需求。根据医院住院管理的实际场景我们梳理出以下核心实体和关系病人病案号作为唯一标识包含姓名、性别等基本信息及入院时间病床与病房、病区形成层级关系需记录使用状态医护人员分为医生和护士两类护士又细分为病床护士和手术室护士诊疗过程包括诊断书、手术安排等关键医疗行为ER图核心关系梳理实体1实体2关系类型说明病人病床多对一一个病人同时只能住一张病床病人医生多对一一次住院由一位主治医生负责护士手术室多对多需要中间表记录护士在手术室中的职责提示在设计多对多关系时务必创建关联表并明确关联属性。例如手术室护士需要记录责任这一额外属性。2. 逻辑结构转换实战将ER图转换为关系模型是数据库设计的核心环节。我们需要明确每个实体的属性、主键和外键关系。2.1 基础实体表结构**病人表(patient)**设计要点CREATE TABLE patient ( medical_record_id VARCHAR(20) PRIMARY KEY, name VARCHAR(50) NOT NULL, gender CHAR(1) CHECK (gender IN (M, F)), id_card VARCHAR(18) UNIQUE, admission_time DATETIME NOT NULL, bed_id VARCHAR(10) NOT NULL, FOREIGN KEY (bed_id) REFERENCES bed(bed_id) );**医生表(doctor)**关键字段CREATE TABLE doctor ( doctor_id VARCHAR(10) PRIMARY KEY, name VARCHAR(50) NOT NULL, department VARCHAR(30) NOT NULL, title VARCHAR(20) );2.2 处理复杂关系手术安排涉及病人、手术室、医生三方多对多关系需要特别注意CREATE TABLE surgery_arrangement ( medical_record_id VARCHAR(20), surgery_room_id VARCHAR(10), surgery_time DATETIME, surgery_name VARCHAR(100), PRIMARY KEY (medical_record_id, surgery_room_id, surgery_time), FOREIGN KEY (medical_record_id) REFERENCES patient(medical_record_id), FOREIGN KEY (surgery_room_id) REFERENCES surgery_room(room_id) ); CREATE TABLE surgery_doctor ( medical_record_id VARCHAR(20), surgery_room_id VARCHAR(10), surgery_time DATETIME, doctor_id VARCHAR(10), responsibility VARCHAR(50) NOT NULL, PRIMARY KEY (medical_record_id, surgery_room_id, surgery_time, doctor_id), FOREIGN KEY (medical_record_id, surgery_room_id, surgery_time) REFERENCES surgery_arrangement(medical_record_id, surgery_room_id, surgery_time), FOREIGN KEY (doctor_id) REFERENCES doctor(doctor_id) );3. 完整SQL实现方案下面给出MySQL环境下的完整建表语句包含所有实体和关系-- 病区表 CREATE TABLE ward ( ward_id VARCHAR(5) PRIMARY KEY, ward_name VARCHAR(50) NOT NULL, location VARCHAR(100) ); -- 病房表 CREATE TABLE room ( room_id VARCHAR(10) PRIMARY KEY, room_type VARCHAR(20) NOT NULL, ward_id VARCHAR(5) NOT NULL, FOREIGN KEY (ward_id) REFERENCES ward(ward_id) ); -- 病床表 CREATE TABLE bed ( bed_id VARCHAR(10) PRIMARY KEY, room_id VARCHAR(10) NOT NULL, status TINYINT DEFAULT 0 COMMENT 0-空闲 1-占用, FOREIGN KEY (room_id) REFERENCES room(room_id) ); -- 护士表 CREATE TABLE nurse ( nurse_id VARCHAR(10) PRIMARY KEY, name VARCHAR(50) NOT NULL, type TINYINT NOT NULL COMMENT 1-病床护士 2-手术室护士, level VARCHAR(20) ); -- 病床护士关联表 CREATE TABLE ward_nurse ( nurse_id VARCHAR(10), ward_id VARCHAR(5), PRIMARY KEY (nurse_id, ward_id), FOREIGN KEY (nurse_id) REFERENCES nurse(nurse_id), FOREIGN KEY (ward_id) REFERENCES ward(ward_id) ); -- 手术室表 CREATE TABLE surgery_room ( room_id VARCHAR(10) PRIMARY KEY, floor VARCHAR(5) NOT NULL, room_type VARCHAR(20) NOT NULL ); -- 手术室护士关联表 CREATE TABLE surgery_nurse ( nurse_id VARCHAR(10), room_id VARCHAR(10), responsibility VARCHAR(50) NOT NULL, PRIMARY KEY (nurse_id, room_id), FOREIGN KEY (nurse_id) REFERENCES nurse(nurse_id), FOREIGN KEY (room_id) REFERENCES surgery_room(room_id) ); -- 诊断书表 CREATE TABLE diagnosis ( medical_record_id VARCHAR(20) PRIMARY KEY, doctor_id VARCHAR(10) NOT NULL, diagnosis_desc TEXT NOT NULL, diagnosis_time DATETIME NOT NULL, FOREIGN KEY (medical_record_id) REFERENCES patient(medical_record_id), FOREIGN KEY (doctor_id) REFERENCES doctor(doctor_id) );4. 高级设计与优化技巧4.1 索引优化策略为提高查询效率应在以下字段上创建索引-- 病人姓名和身份证号查询频繁 CREATE INDEX idx_patient_name ON patient(name); CREATE INDEX idx_patient_id_card ON patient(id_card); -- 按入院时间范围查询很常见 CREATE INDEX idx_patient_admission ON patient(admission_time); -- 手术安排时间查询 CREATE INDEX idx_surgery_time ON surgery_arrangement(surgery_time);4.2 数据完整性保障使用触发器确保业务规则DELIMITER // CREATE TRIGGER check_bed_availability BEFORE INSERT ON patient FOR EACH ROW BEGIN DECLARE bed_status INT; SELECT status INTO bed_status FROM bed WHERE bed_id NEW.bed_id; IF bed_status 1 THEN SIGNAL SQLSTATE 45000 SET MESSAGE_TEXT 该病床已被占用; END IF; END// DELIMITER ;4.3 视图设计示例创建常用查询视图简化应用开发-- 当前住院病人视图 CREATE VIEW current_patients AS SELECT p.*, b.room_id, r.ward_id FROM patient p JOIN bed b ON p.bed_id b.bed_id JOIN room r ON b.room_id r.room_id WHERE p.discharge_time IS NULL; -- 手术室使用情况视图 CREATE VIEW surgery_room_schedule AS SELECT sa.*, GROUP_CONCAT(d.name SEPARATOR , ) AS doctors, GROUP_CONCAT(sd.responsibility SEPARATOR ; ) AS responsibilities FROM surgery_arrangement sa LEFT JOIN surgery_doctor sd ON sa.medical_record_id sd.medical_record_id AND sa.surgery_room_id sd.surgery_room_id AND sa.surgery_time sd.surgery_time LEFT JOIN doctor d ON sd.doctor_id d.doctor_id GROUP BY sa.medical_record_id, sa.surgery_room_id, sa.surgery_time;5. 扩展功能实现5.1 药品管理模块如需增加药品管理功能可扩展如下表结构CREATE TABLE medicine ( medicine_id VARCHAR(20) PRIMARY KEY, name VARCHAR(100) NOT NULL, specification VARCHAR(50) NOT NULL, manufacturer VARCHAR(100), unit_price DECIMAL(10,2) NOT NULL ); CREATE TABLE prescription ( prescription_id INT AUTO_INCREMENT PRIMARY KEY, medical_record_id VARCHAR(20) NOT NULL, doctor_id VARCHAR(10) NOT NULL, create_time DATETIME NOT NULL, FOREIGN KEY (medical_record_id) REFERENCES patient(medical_record_id), FOREIGN KEY (doctor_id) REFERENCES doctor(doctor_id) ); CREATE TABLE prescription_detail ( prescription_id INT, medicine_id VARCHAR(20), dosage VARCHAR(50) NOT NULL, quantity INT NOT NULL, PRIMARY KEY (prescription_id, medicine_id), FOREIGN KEY (prescription_id) REFERENCES prescription(prescription_id), FOREIGN KEY (medicine_id) REFERENCES medicine(medicine_id) );5.2 数据分区建议对于大型医院考虑按时间范围对病人表进行分区CREATE TABLE patient ( -- 字段定义同上 ) PARTITION BY RANGE (YEAR(admission_time)) ( PARTITION p2020 VALUES LESS THAN (2021), PARTITION p2021 VALUES LESS THAN (2022), PARTITION p2022 VALUES LESS THAN (2023), PARTITION pmax VALUES LESS THAN MAXVALUE );在实际项目中我们还需要考虑数据库备份策略、敏感数据加密等问题。例如病人的身份证号应该进行加密存储诊断记录需要严格的权限控制。

相关文章:

从需求到SQL:手把手教你将‘住院管理系统’的ER图转化为可运行的数据表(附建表语句)

从需求到SQL:住院管理系统数据库设计实战指南 在医疗信息化快速发展的今天,一套设计良好的住院管理系统数据库不仅能提高医院运营效率,更能为患者提供更精准的医疗服务。本文将带你从零开始,完整实现一个住院病人信息管理系统的数…...

本地部署开源直播视频平台 Owncast 并实现外部访问

Owncast 是一款开源的、自托管的直播和视频平台,它允许用户完全掌控自己的直播基础设施、数据和观众互动,避免依赖 Twitch 、YouTube 等大型中心化平台,为内容创作者提供一个独立、去中心化的直播解决方案。本文将详细介绍如何利用 Docker 在…...

你的电机仿真结果靠谱吗?聊聊Maxwell瞬态分析里那些容易被忽略的‘坑’

电机仿真精度提升指南:Maxwell瞬态分析中的关键细节与验证方法 当你在凌晨三点盯着屏幕上那条波动异常的转矩曲线时,是否曾怀疑过自己的仿真模型在说谎?作为从业十五年的电磁仿真专家,我见过太多工程师在项目验收前夜才发现仿真结…...

Shell脚本新手必看:6种方法彻底解决Undefined Variable报错(附代码示例)

Shell脚本变量报错终极指南:从根源解决Undefined Variable问题 在Linux系统管理和自动化运维中,Shell脚本是不可或缺的工具。但许多初学者在编写脚本时,经常会遇到"Undefined Variable"这类看似简单却令人头疼的报错。这种错误不仅…...

革新性跨系统应用运行方案:APK Installer实现Windows原生Android应用体验

革新性跨系统应用运行方案:APK Installer实现Windows原生Android应用体验 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 当您急需在Windows电脑上运行某个…...

告别繁琐权限,uTools hosts插件一键切换与管理的效率革命

1. 为什么我们需要更优雅的hosts管理方案 每次修改hosts文件都要经历这样的痛苦循环:先要回忆文件藏在系统哪个角落,接着得用管理员身份打开文本编辑器,小心翼翼地修改内容,最后还要担心格式错误导致系统异常。作为经常需要切换开…...

3大维度解析BGE向量技术:从原理到检索增强实践

3大维度解析BGE向量技术:从原理到检索增强实践 【免费下载链接】FlagEmbedding Dense Retrieval and Retrieval-augmented LLMs 项目地址: https://gitcode.com/GitHub_Trending/fl/FlagEmbedding 文本嵌入技术是现代AI系统的核心组件,而检索增强…...

PingFangSC字体全栈应用指南:从技术原理到性能优化

PingFangSC字体全栈应用指南:从技术原理到性能优化 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件,包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC 解析字体技术原理:为什么格式选…...

基于麻雀优化算法(SSA)优化shared TCN-Transformer模型超参数,实现时间...

基于麻雀优化算法(SSA)优化shared TCN-Transformer模型超参数,实现时间序列预测。[1]模型采用共享TCN结构,用于提取Encoder Embedding和Decoder Embedding 的因果特征,在尽可能保证模型复杂度不变的情况下,…...

FPGA实战:单总线协议解析与DHT11温湿度数据采集

1. 从零认识DHT11温湿度传感器 第一次拿到DHT11这个白色小方块时,我完全没想到这么便宜的传感器能有如此实用的功能。作为一款经典的数字温湿度复合传感器,DHT11通过单总线协议输出校准后的数字信号,省去了传统模拟传感器需要的ADC转换环节。…...

解决Windows远程桌面连接Ubuntu时xrdp闪退的配置技巧

1. 问题现象与排查思路 最近在帮同事配置Windows远程连接Ubuntu时遇到了一个典型问题:用Windows自带的远程桌面连接工具输入账号密码后,界面闪退无法进入桌面。这种情况在Ubuntu 18.04/20.04/22.04各版本中都可能出现,特别是使用GNOME桌面环…...

10分钟重塑Windows体验:Win11Debloat系统优化完全指南

10分钟重塑Windows体验:Win11Debloat系统优化完全指南 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更改以简化和改…...

Day4 Python的函数和参数机制

函数的定义与调用最基本的函数结构如下:def greet(name): return f"Hello, {name}!" print(greet("Alice")) def 定义函数调用时传入对应参数如果参数数量或顺序不匹配,就会报错,这是最常见的问题之一。默认参数默认参数…...

从F1 90到62 F1 90:用Wireshark和CANoe‘解剖’一次完整的UDS 0x22数据读取会话

从F190到62F190:用Wireshark和CANoe解剖UDS 0x22数据读取会话 当你第一次在Wireshark中看到22服务请求和62响应报文时,那些十六进制字节可能就像天书一样难以理解。但正是这些看似杂乱的数据流,承载着现代汽车电子系统最核心的诊断信息交换。…...

三相三电平Vienna整流器:SPWM与SVPWM调制仿真及控制策略对比分析

三相三电平vienna整流器SPWM和SVPWM调制仿真 基于plecs搭建 温度场分析 双PI控制 锁相环控制 中点电压平衡控制 功率因数为1 SPWM和SVPWM调制对比 谐波畸变率对比分析 电压利用率对比分析 电压平衡和不平衡控制对比 图1 仿真模型 图2 温度场分析 图3 交流电压电流三电平…...

C# 核心技术解析:Parse vs TryParse 实战指南

文章目录1. 核心区别&#xff1a;暴力型 vs. 稳重型Parse: 默认数据正确TryParse: 典型的 C# 模式示例2. 执行流程图3. 性能4. 高性能方案4.1. 高性能转换&#xff1a;Span<char> 与 Utf8Parser4.2. 执行流程&#xff1a;内存视角4.3. 类型转换对比5. 易混淆在 C# 处理字…...

零基础玩转OpenClaw:Qwen3-32B镜像快速入门5个示例

零基础玩转OpenClaw&#xff1a;Qwen3-32B镜像快速入门5个示例 1. 为什么选择OpenClawQwen3-32B组合&#xff1f; 去年冬天&#xff0c;当我第一次看到同事用自然语言命令电脑自动整理桌面文件时&#xff0c;仿佛打开了新世界的大门。经过两周的折腾&#xff0c;我终于在本地…...

异构数据库迁移利器:dbswitch实现多源数据高效同步

1. 异构数据库迁移的痛点与常见方案 第一次接触异构数据库迁移时&#xff0c;我被各种工具搞得晕头转向。当时公司需要把Oracle的业务数据同步到Greenplum做分析&#xff0c;试了好几种方案都不太理想。比如用kettle配置gpload&#xff0c;光是理解那些参数就花了两天时间&…...

从Type-C到CH347F:手把手教你设计一块与众不同的STM32H743开发板(附完整原理图)

从Type-C到CH347F&#xff1a;打造高集成度STM32H743开发板的实战指南 当市面上充斥着千篇一律的STM32开发板时&#xff0c;如何设计一款既能满足高性能需求又能简化开发流程的差异化产品&#xff1f;本文将带你深入探索基于STM32H743和CH347F芯片的开发板设计全过程&#xff…...

C# .NET 周刊|2026年3月1期

国内文章.NET 11 预览版1&#xff1a;CoreCLR 在 WebAssembly 上的全面集成与性能突破https://www.cnblogs.com/shanyou/p/19629649.NET 11 Preview 1 正式发布&#xff0c;标志着 CoreCLR 运行时能原生支持 WebAssembly。这是微软在跨平台战略上的重大进展。CoreCLR 提供更优性…...

深度学习基石:从卷积神经网络理解 Stable Yogi 的图像生成能力

深度学习基石&#xff1a;从卷积神经网络理解 Stable Yogi 的图像生成能力 你是不是也好奇&#xff0c;像 Stable Yogi 这样能“凭空”画出精美图片的模型&#xff0c;它的“眼睛”和“大脑”究竟是怎么工作的&#xff1f;为什么给它一段文字描述&#xff0c;它就能理解并生成…...

OpenClaw+nanobot备份方案:自动化配置与数据同步

OpenClawnanobot备份方案&#xff1a;自动化配置与数据同步 1. 为什么需要备份nanobot环境 上周我的开发机突然硬盘故障&#xff0c;导致辛苦配置了两个月的nanobot环境全部丢失。那一刻我才深刻意识到&#xff0c;对于这种高度定制化的AI自动化系统&#xff0c;没有备份方案…...

QT多线程定时任务实战:QTimer与QThread的高效协作与主线程通信

1. QT多线程定时任务的核心挑战 在开发桌面应用程序时&#xff0c;经常会遇到需要定期执行某些任务的场景&#xff0c;比如每隔5秒采集一次传感器数据、每分钟检查一次系统状态等。这时候很多开发者会直接在主线程中使用QTimer&#xff0c;但这样做有个致命问题&#xff1a;如…...

Torch-Pruning高效剪枝实战:解决BERT模型部署中的计算资源瓶颈问题

Torch-Pruning高效剪枝实战&#xff1a;解决BERT模型部署中的计算资源瓶颈问题 【免费下载链接】Torch-Pruning [CVPR 2023] Towards Any Structural Pruning; LLMs / Diffusion / Transformers / YOLOv8 / CNNs 项目地址: https://gitcode.com/gh_mirrors/to/Torch-Pruning …...

让Apple触控设备在Windows系统完美运行的驱动解决方案

让Apple触控设备在Windows系统完美运行的驱动解决方案 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-touchpad 当你在Wi…...

Cayenne-MQTT-ESP:面向IoT平台的轻量级嵌入式MQTT客户端

1. 项目概述 Cayenne-MQTT-ESP 是一个专为 ESP8266 和 ESP32 平台设计的轻量级 MQTT 客户端库&#xff0c;其核心目标是将嵌入式设备无缝接入 Cayenne IoT 云平台&#xff08;现为 myDevices IoT Platform&#xff09;&#xff0c;实现双向数据通信与可视化控制。该库并非从零…...

告别Git命令行烦恼:Tig工具让版本控制效率提升3倍

告别Git命令行烦恼&#xff1a;Tig工具让版本控制效率提升3倍 【免费下载链接】tig Text-mode interface for git 项目地址: https://gitcode.com/gh_mirrors/ti/tig 作为开发者&#xff0c;你是否也曾面临这些Git操作痛点&#xff1a;记不住复杂的git log参数组合、在命…...

薛定谔共价对接实战:如何为你的靶点蛋白快速找到‘锁死’它的共价抑制剂?

薛定谔共价对接实战&#xff1a;靶点蛋白的共价抑制剂高效筛选策略 药物研发领域正经历一场静默革命——共价抑制剂从曾经的"危险分子"摇身变为现代药物设计的明星。与传统可逆抑制剂不同&#xff0c;共价抑制剂能与靶点蛋白形成稳定的共价键&#xff0c;实现近乎不可…...

Qt+OpenCV+海康SDK实战:多线程回调架构下的实时视频流解码与Mat转换全流程解析

1. 项目背景与核心挑战 在智能安防和视频监控领域&#xff0c;实时视频流处理一直是技术难点。传统方案往往面临三个关键问题&#xff1a;视频流延迟高、解码效率低下、跨平台兼容性差。这正是我们选择QtOpenCV海康SDK技术栈的原因——Qt提供跨平台GUI支持&#xff0c;OpenCV负…...

Seelen-UI架构深度解析:5个高效定制技巧打造专业级Windows桌面环境

Seelen-UI架构深度解析&#xff1a;5个高效定制技巧打造专业级Windows桌面环境 【免费下载链接】Seelen-UI The Fully Customizable Desktop Environment for Windows 10/11. 项目地址: https://gitcode.com/GitHub_Trending/se/Seelen-UI Seelen-UI作为Windows平台上的…...