创建Patient资源时如何避免生成重复患者记录
如何避免FHIR Patient资源重复创建
首先纠正一个认知偏差:FHIR 标准从未规定POST创建Patient接口时,需要自动对identifier字段做唯一性校验拦截。你在Azure、Google Cloud平台测试到的重复创建成功的表现,是FHIR服务的默认正常行为,不是平台bug。
多次发送如下创建请求会生成重复记录,核心原因就是默认创建逻辑不会主动校验identifier是否已存在:
{ "resourceType": "Patient", "identifier": [ { "use": "usual", "system": "urn:oid:2.16.840.1.113883.19.5", "value": "12345" } ], "active": true, "name": [ { "family": "Levin", "given": [ "Omri" ] } ], "gender": "male", "birthDate": "1980-09-24" }
你可以根据业务场景选择以下方案解决重复创建问题:
- 优先使用FHIR标准的条件创建能力,这是跨平台兼容性最好的方案。发POST请求到
/Patient端点时,新增If-None-Exist请求头,值填写identifier匹配规则,比如identifier=urn:oid:2.16.840.1.113883.19.5|12345。服务端收到请求后会先查询有没有匹配该标识的患者:存在就直接返回已有资源,不执行新建操作;不存在才会完成创建逻辑,从接口层面杜绝重复写入。
请求头示例:POST /Patient HTTP/1.1 Content-Type: application/fhir+json If-None-Exist: identifier=urn:oid:2.16.840.1.113883.19.5|12345 - 如果需要强制所有写入请求都不能生成重复记录,可以在FHIR服务端配置唯一性约束。Azure、Google Cloud的FHIR服务都支持自定义资源字段的唯一索引,你可以给Patient的
identifier字段配置system+value组合唯一索引,配置生效后,任何带重复标识的创建请求都会直接返回409冲突错误,被服务端直接拦截。 - 高并发场景下,不要只依赖业务侧“先查询再创建”的逻辑——并发请求同时通过校验时依然会写入重复数据,这种前置校验只能作为补充手段,必须搭配条件创建或者服务端唯一约束使用。
避坑提醒:不要随便用PUT指定资源ID的方式做幂等创建,除非你能保证生成的资源ID全局唯一、不会和已有数据碰撞,否则很容易覆盖其他患者的记录。
内容的提问来源于stack exchange,提问作者amitaibu
相关产品推荐
相关产品推荐

