咨询在FHIR中存储患者原始监测数据的最优方案
FHIR存储连续心率原始数据的最佳实践
核心结论:不用每条测值都建Observation
直接为每个心率测量值创建独立Observation资源,对于每日10小时、每周7天的高频数据来说完全没必要——这会生成海量资源,既浪费存储,也会拖慢后续查询、分析的效率。FHIR专门提供了更高效的批量存储方案。
更便捷的存储方式:用SampledData类型打包连续数据
FHIR的Observation资源支持valueSampledData字段,专门用于存储连续、批量的时间序列测量数据(比如持续监测的心率、血压)。你可以把一段连续时间内的所有心率采样点打包到同一个Observation里,大幅减少资源数量。
SampledData的关键参数包括:
origin:采样起始时间和初始值(比如监测开始的时间点)period:采样间隔(比如每5秒采一次,就设为5.0)unit:测量单位(比如"bpm")data:所有采样值的数组(用逗号分隔,异常值可以用特定符号标记,比如"E"代表错误)
修改后的代码示例
针对你的C#代码,调整为使用SampledData的版本:
// 假设你有一段连续的心率采样数据,比如10小时内每5秒一次的数值 var sampledData = new SampledData { Origin = new Quantity { Value = 70, // 起始时刻的心率值 Unit = "bpm", Code = "/min" }, Period = 5.0, // 采样间隔:5秒 Unit = "bpm", Data = "72,71,73,70,69,74,..." // 所有采样值的字符串,用逗号分隔 }; var observation = new Observation { Status = ObservationStatus.Final, Code = new CodeableConcept("http://loinc.org", "8867-4", "Heart rate"), // 替换为正确的连续心率LOINC码 Subject = new ResourceReference($"Patient/{measurementData.PatientId}"), Value = sampledData, Effective = new Period // 标记这段数据的采集时间范围 { Start = DateTime.Parse("2024-05-20 08:00:00"), End = DateTime.Parse("2024-05-20 18:00:00") }, Issued = DateTime.Now // 这里建议设为数据上传/生成的时间 };
额外建议
- 拆分粒度:如果是一周的监测数据,建议按天拆分Observation(每天一个),每个Observation存储当天10小时的采样数据,避免单个资源过大。
- LOINC码正确性:确保使用对应连续心率监测的LOINC码,不要用示例中的12345-6,比如
8867-4是通用心率码,若为连续监测可使用更具体的码(比如45044-6:心率,连续)。 - 时间标记:用
Effective字段明确数据的采集时间范围,比单独的Issued更能准确反映数据的时间维度。
内容的提问来源于stack exchange,提问作者Hekky K
相关产品推荐
相关产品推荐

