Node.js医疗平台多角色后台PostgreSQL表关系设计及数据库选型咨询
数据库选型结论
不需要更换为MongoDB,PostgreSQL是当前场景的更优选择。医疗行业数据对一致性、事务性、数据完整性要求极高,且当前业务逻辑是明确的结构化关联关系,PostgreSQL的外键约束、ACID事务、行级权限控制可以很好的匹配需求,反而MongoDB的弱事务、无模式特性会给后续医疗数据合规、数据一致性校验带来额外的开发成本。
PostgreSQL 核心表结构设计方案
1. 基础权限相关表
institutions医疗机构表:存储所有医疗服务机构的基础信息,核心字段:id(主键)、name(机构名称)、license_no(执业许可证号)、address、status(启用/停用)、created_at、updated_atadmin_users管理员账号表:统一存储两类管理员的账号信息,不需要拆分表,用角色字段做区分即可,后续新增角色也可平滑扩展,核心字段:id(主键)、username、password_hash、real_name、phone、email、role_type(枚举值:main_admin/hcp_admin)、institution_id(外键关联institutions.id,超级管理员该字段为空)、status(启用/停用)、last_login_at、created_at、updated_at
2. 业务核心表
doctors医生表:存储所有机构下的医生信息,核心字段:id(主键)、institution_id(外键关联institutions.id)、name、job_title(职称)、department(所属科室)、id_card_no、qualification_no(执业资格证号)、status、created_at、updated_atschedules日程表:存储医生的出诊/排班信息,冗余存储机构ID方便权限校验,减少关联查询成本,核心字段:id(主键)、doctor_id(外键关联doctors.id)、institution_id、schedule_date(排班日期)、time_slot_start、time_slot_end、max_appointment(最大可预约数)、current_appointment(当前已预约数)、status、created_at、updated_atappointments预约表:存储用户的预约记录,核心字段:id(主键)、institution_id、schedule_id(外键关联schedules.id)、doctor_id(外键关联doctors.id)、patient_name、patient_phone、patient_id_card、appointment_status(枚举:待确认/已完成/已取消)、created_at、updated_at
3. 权限控制优化方案
可以直接使用PostgreSQL自带的行级安全策略(RLS)简化后端权限校验逻辑,不需要每次业务查询都手动拼接institution_id过滤条件,配置示例:
-- 启用doctors表的行级安全控制 ALTER TABLE doctors ENABLE ROW LEVEL SECURITY; -- 配置策略:hcp_admin只能查看所属机构的医生数据 CREATE POLICY hcp_admin_doctors_access ON doctors FOR ALL TO hcp_admin USING (institution_id = current_setting('app.current_institution_id')::int);
超级管理员对应的数据库账号默认绕过RLS,可直接访问全量数据。
补充注意事项
- 所有涉及用户隐私的字段(身份证号、手机号、患者信息等)必须加密存储,PostgreSQL的
pgcrypto扩展可以直接满足加密需求 - 单独建
admin_operation_logs表记录所有管理员的操作信息,包括操作人、操作时间、操作内容、操作IP,满足医疗数据的可追溯要求 - 预约修改、医生信息变更这类涉及多表联动的操作,必须包裹在事务中执行,保证数据一致性
内容的提问来源于stack exchange,提问作者BorisHoppe
相关产品推荐
相关产品推荐

