Моделирование данных HL7 v2X и v3

Компания, в которой я работаю, запустила новую инициативу в HL7, где мы обмениваемся сообщениями как v2X, так и v3 (в частности, CDA). Я нахожусь в той точке, когда я могу принимать, проверять и подтверждать сообщения, которые мы получаем от наших торговых партнеров, и начал создавать модель данных для внутреннего хранилища указанных сообщений. После долгих размышлений и исследований я не знаю, как лучше всего подойти к этому в MS SQL Server 2008 R2.

В настоящее время моя идея состоит в том, чтобы по существу загружать данные в хранилище данных непосредственно из моего механизма интеграции (BizTalk), минуя резервную нормализованную операционную базу данных. Я настроил базу данных для сообщений v2X в соответствии со спецификациями v2.7, поскольку все версии HL7 v2 обратно совместимы (я могу хранить любые предыдущие версии в той же базе данных). В моем первоначальном проекте есть таблица для каждого сегмента, которая будет привязана к таблице заголовков с помощью guid, который я генерирую и сохраняю во время выполнения. Самая большая проблема с этим подходом — это количество столбцов в каждой таблице, и с этим у меня нет опыта. Например, сегмент PV1 имеет 569 столбцов для размещения всех возможных данных. В дополнение к этому мне нужно сделать все столбцы varchar и сделать их достаточно большими, чтобы вместить любой возможный сценарий настройки от наших поставщиков. Я планирую использовать varchar(1024) для достижения этой цели. Многие из этих столбцов (вероятно, большинство) были бы NULL, поэтому я бы использовал столбцы SPARSE. Это кричит мне о плохом дизайне, но полная нормализация этих таблиц потребовала бы тонны работы как в BizTalk, так и в SQL сервере, и я не уверен, что я выиграю от этого. Я пытаюсь быть прагматичным, так как у меня есть крайний срок.

В случае полной нормализации мне, по сути, пришлось бы создавать хранимые процессы, которые имели бы массу параметров ИЛИ разделяли бы эти сообщения до n-й степени, чтобы выполнять отдельные загрузки в меньшие подтаблицы и убедиться, что все они соотносятся с исходным guid. Я также хотел бы поддерживать обработку ACID, которая может стать сложной и вызвать много накладных расходов в BizTalk. Я полагаю, что третьим вариантом будет использование nHapi для создания объектов из сообщений, которые я мог бы связать с Entity Framework, но nHapi кажется мертвым проектом, и на данный момент у меня нет опыта работы с Entity Framework.

Я в основном в растерянности, и мне нужна помощь некоторых профессионалов отрасли, имеющих опыт моделирования данных HL7. Стоит ли прилагать дополнительные усилия для полной нормализации таблиц? Будет ли производительность на стороне SQL ужасной, если я буду использовать эти денормализованные таблицы сегментов с сотнями столбцов (большинство из которых будет NULL для каждой строки)? Я не администратор баз данных, поэтому я пытаюсь понять подводные камни каждого подхода. Я также смотрел на RIMBAA, но RIM HL7 кажется мне иностранным языком, поскольку я новичок в HL7, и перевод сообщений v2 в RIM, вероятно, займет гораздо больше времени, чем мне нужно для завершения этого проекта. Я надеюсь, что слишком много думаю об этом, и есть более простое решение, смотрящее мне в лицо. Надеюсь, этот вопрос не слишком открытый.


person Ritley572    schedule 04.03.2014    source источник
comment
Я думаю, что самый большой вопрос будет заключаться в том, какие поля в сообщении HL7 на самом деле собирается использовать ваша компания? Похоже, вы пытаетесь захватить каждое поле HL7 в сообщении определенного типа (к сожалению, я не знаком с CDA RIM), но собираетесь ли вы активно использовать ВСЕ отправляемые данные, и отправляются ли эти данные куда-либо, кроме базу данных вы создаете? Если вас действительно интересуют только несколько полей данных в сообщении, не собирайте их все — просто фиксируйте то, что вам нужно обработать/отправить обратно.   -  person SQLSavant    schedule 04.03.2014
comment
Я согласен с вами, к сожалению, это новая инициатива, в которой в настоящее время нет абсолютно никаких бизнес-правил. Мне было поручено собрать все данные, которые мы получаем, а позже бизнес придумает, как их использовать. Я вроде в наручниках.   -  person Ritley572    schedule 04.03.2014
comment
Ну, это не звучит весело. Я бы сказал, что тогда лучше всего структурировать базу данных на основе отдельных сегментов. Некоторые сегменты повторно используются в нескольких различных типах сообщений/событиях. Это дало бы ему по крайней мере структурированное ощущение реляционной базы данных. Кроме того, я бы преобразовывал поступающие данные в стандартную спецификацию и пытался работать с вашими поставщиками/партнерами, чтобы отправлять вам данные, соответствующие этим спецификациям. В любом случае, вы смотрите на базу данных спагетти, но, по крайней мере, ваши таблицы будут структурированы и будут менее подвержены неверным данным.   -  person SQLSavant    schedule 04.03.2014
comment
Это подход, который я использую, который возвращает меня к исходному вопросу, некоторые из этих сегментов имеют огромное количество полей (например, IN2 в спецификации 2.5 имеет около 560 полей). Создание таблицы с таким количеством столбцов может быть проблематичным, ищите руководство по этому поводу или альтернативный подход для решения проблем с SQL.   -  person Ritley572    schedule 05.03.2014
comment
@Ritley572 Ritley572 Я работаю над сообщением HL7v2 ... не могли бы вы предложить, как лучше всего хранить сообщение HL7 v2 ... исходя из вашего опыта. не могли бы вы поделиться своим дизайном в качестве ответа .... иначе я могу открыть новый вопрос, если потребуется, и вы можете добавить ответ. Я чувствую, что преобразование его в FHIR и сохранение потребует большой работы, и я хочу этого избежать. Я также попросил не терять данные из сообщения hl7 v2.   -  person Chris_vr    schedule 29.06.2020


Ответы (5)


Я бы ни при каких обстоятельствах не пытался моделировать что-либо с помощью RIM HL7 v3. Причина в том, что эта схема является очень общей, откладывая большую часть метаданных до самого сообщения. Вы знакомы с таблицей EAV? РИМ такой.

С другой стороны, HL7 v2 должен быть довольно простой основой для схемы БД. Вы можете создавать таблицы вокруг типов сегментов и столбцы вокруг имен полей.

Я думаю проблема втягивания всего убивает проект и не стоит этого делать. Как правило, сообщения HL7 v2 несут небольшое подмножество целого, поэтому было бы совершенно бесполезно строить все это, и это было бы очень запутанно.

Кроме того, версия v2, которую вы моделируете, сильно повлияет на ваши схемы, в более поздних версиях все больше и больше полей станут повторяющимися полями, и ваши отношения соединения изменятся.

Я рекомендую вам сделать ставку на песок и начать с версии 2.4, которая довольно проста, но все же сложнее, чем большинство реально используемых интерфейсов. Сосредоточьтесь на нескольких сегментах и ​​нескольких полях. Сначала MSH и PID.

Добавьте таблицу EAV, чтобы зафиксировать то, что может появиться, чего еще нет в ваших таблицах. Затем вы можете посмотреть, что со временем попадает в эту таблицу, и использовать ее, чтобы решить, что строить дальше. Ваш EAV может выглядеть так: MSG_ID, SEGMENT, SET_ID, FIELD_NAME, FIELD VALUE. Просто сохраните не проанализированное содержимое HL7 значения поля.

person dougcl    schedule 01.04.2014
comment
Очень познавательный материал, спасибо. Я думаю, что попробую подход EAV, который вы здесь упомянули, так как это поможет бизнесу намного проще определить то, что им действительно может понадобиться. - person Ritley572; 02.04.2014
comment
Нет ничего особенно плохого в использовании RIM HL7 V3 для моделирования . Это сложно, но достаточно хорошо работает для сферы здравоохранения, если вы понимаете, как все части сочетаются друг с другом. Особенно, если вы храните контент на основе HL7 V3, такой как документы CDA R2, то архитектура приложений на основе RIM (RIMBAA) является естественным выбором. Однако RIM не подходит для сообщений HL7 V2; вам придется выполнить большое количество преобразований данных, чтобы перейти от V2 к RIM/V3. - person Nick Radov; 02.10.2014
comment
На мой взгляд, RIM слишком общий. Хотя общая схема (например, таблица EAV) является гибкой и может иметь свое место, особенно при прототипировании, как я предлагаю выше, она не обеспечивает надежной основы для проверки во время разработки. Другими словами, метаданные, которые в целях совместимости должны находиться в схеме, вместо этого хранятся в данных (контенте). Это означает, что кодирование по схеме мало что значит. Валидация может быть выполнена только в том случае, если функциональная совместимость может быть обеспечена только во время выполнения, эмпирическим путем, на основе примеров. - person dougcl; 04.10.2014

HL7 не является «жестким» стандартным вводом, и ожидаемые результаты зависят от системы, с которой вы общаетесь. В этом случае добавление брокера, такого как Mirth, Rhaposdy или BizTalk, является очень хорошей идеей.

Какое бы решение вы ни использовали, убедитесь, что вы можете справиться с «нестандартным» вводом и выводом, поскольку вскоре вы обнаружите, что все меняется. Что касается версий HL7 2X и 3, имейте в виду, что очень немногие больницы имеют версию 3, в большинстве из которых работает 2X.

Я работал с базой данных, которая пыталась следовать структуре HL7, она может работать, однако это потребует времени и усилий. Учитывая, что у вас жесткий крайний срок, возможно, вам нужно разбить биты данных, которые вам понадобятся для поиска, и иметь поля (например, сегмент PID 3 - это идентификатор пациента, который был бы полезен), остальные могут быть в вашем varchar. Также, если вы не индексируете столбец, вы можете использовать varchar (max).

Что касается ваших Guid в базе данных, это может работать нормально, но будьте осторожны, чтобы не кластеризовать какие-либо индексы, использующие Guid, так как это приведет к фрагментации ваших данных. Проведите свое исследование здесь и, если сомневаетесь, вместо этого выберите столбцы идентификаторов.

Я также рекомендую инфраструктуру сущностей, отличный ORM, который стоит изучить.

Итак, мой общий совет. Пока выберите гибрид, выбивая то, что вам нужно. Ожидайте, что со временем он будет развиваться, разделяя части HL7 на отдельные области по мере необходимости. Напишите общий синтаксический анализатор HL7 (не слишком сложный, я делал это пару раз) и сохраняйте его гибкость. Но больше всего ожидайте, что HL7 будет различаться по структуре, не относитесь к спецификации как к 100% правде, вы получите вариации.

person HSG    schedule 04.03.2014
comment
В большинстве случаев различия связаны с тем, что компании не следуют стандарту во время внедрения, но я тоже обнаружил, что это так. - person user692942; 04.03.2014
comment
Самый первый торговый партнер, который пришел на борт, настроил его, поэтому я пытаюсь построить общую модель данных. Это приводит к очень широким таблицам (например, таблица сегментов PV1, которую я создал, имеет 577 столбцов) для адаптации к спецификациям наших торговых партнеров. Также со слабо типизированными (т.е. полностью varchar) полями. Мне интересно, вызовут ли такие широкие таблицы проблемы с фрагментацией и/или повреждением данных в SQL Server 2008 R2. - person Ritley572; 04.03.2014
comment
В зависимости от размера ваших данных может возникнуть фрагментация, но если большинство полей пусты, я не ожидаю, что это будет проблемой. Повреждение данных не будет проблемой. SQL Server очень надежен. Единственное, за чем вам, возможно, придется следить, это то, по чему вам нужно индексировать, существует ограничение в 900 байт для индексов в MS SQL. - person HSG; 04.03.2014
comment
@ Ritley572 - Джентльменское соглашение об интеграции заключается в том, что отправляющая система должна соответствовать спецификациям принимающей системы. Если вам требуется, чтобы данные X были в поле Y, предоставьте поставщику-отправителю документ со спецификациями, в котором это подробно описывается. Если они откажутся, вам следует разработать перевод сообщения в BizTalk, чтобы приспособить входящее сообщение к вашей спецификации, прежде чем записывать поля в базу данных. - person SQLSavant; 04.03.2014
comment
@HSG, спасибо, я приму во внимание индексацию, если в конечном итоге создам эти широкие таблицы для каждого сегмента. - person Ritley572; 05.03.2014

В большинстве случаев пытаться создать нормализованную реляционную модель данных для сохранения данных HL7 V2 или V3 — пустая трата времени. Я бы рекомендовал просто хранить целые сообщения или документы в виде отдельных значений столбца XML. Затем сделайте запрос, используя SQLXML и/или XQuery. Все современные реляционные базы данных теперь поддерживают это.

person Nick Radov    schedule 07.04.2014
comment
Я бы подчеркнул магазин в собственном аспекте XML этого ответа. Ваше экономическое обоснование может оправдать разбиение сообщения на более мелкие части, но самые маленькие единицы все равно будут храниться в XML. Вы даже можете дополнить XML дополнительными столбцами, где вы извлекаете определенные данные (для индексации и т. д.). - person claytond; 02.10.2014

Я могу только прокомментировать CDA (и некоторые очень ограниченные HL7v2), основываясь на личном опыте.

Мы получаем и отправляем документы CDA, упакованные в оболочки HL7v3, от внешних поставщиков (а также от внутренних систем — см. ниже). Обертки содержат метаданные для таких вещей, как отправка/получение систем/дат и других высокоуровневых данных. Очень ограниченные метаданные сообщения удаляются и сохраняются в репозитории данных сообщений. Внутри оболочки находится фактический CDA, который затем берется и сохраняется как тип данных XML в базе данных SQL.

Используя эту модель, мы можем затем искать на уровне метаданных, а также сужать его на основе АКД с использованием запросов Xpath. Это делает базу данных намного проще... Я даже не могу представить себе создание столбцов на основе схемы CDA.

Что касается того, чтобы заставить клиентов следовать схеме CDA, в рамках проекта мы создали руководство по внедрению, которому должны следовать клиенты, если они хотят, чтобы их сообщения были приняты.

Используя руководство по внедрению + схему + проверку BizTalk и XSD, мы принимаем только сообщения, соответствующие схеме CDA. Затем мы проверяем некоторые поля данных, используя проверку схемы, и отклоняем, если какое-либо из них не работает. Это передается отправителю с помощью обратного сообщения HL7v3 с конкретным сообщением об ошибке и/или недопустимыми полями. Это точка, в которой сообщение будет сохранено в базе данных.

Все это делается в BizTalk/SQL Server. А поскольку схема CDA во многом предопределена группой HL7, вы можете заставить потребителей этой системы следовать этой схеме. Это не похоже на то, что я видел с HL7v2, где кажется, что люди просто изменяют схему по мере необходимости.

Что касается HL7v2, то я на 99% уверен, что «мы» (например, «моя компания») храним сообщения почти таким же образом. За исключением того, что поскольку схема HL7v2 настолько открыта, мы не проверяем, а просто принимаем/сохраняем все сообщения. Парсер HL7v2 был написан для анализа HL7v2 с использованием известных нам вариаций схем.

В случае моего проекта мы отправляем HL7v2 из нашего HCIS --> Mirth --> BizTalk, который затем следует руководству по внедрению + схеме CDA вместе с преобразованием XSLT для сопоставления HL7v2 с CDA, ЗАТЕМ отправляет его в ДРУГОЙ сервис BizTalk CDA Submission. как если бы это был внешний поставщик.

Это тонна чтения прямо сейчас, поэтому, пожалуйста, задавайте вопросы, так как я хотел бы поговорить об этом.

person Bensonius    schedule 18.03.2014
comment
Спасибо за ответ LaMMMy. Несколько вопросов: что послужило бизнес-фактором для решения преобразовать сообщения V2 в формат CDA? Было ли это просто для того, чтобы иметь единую структуру базы данных, чтобы легче связать визиты пациентов и клиническую информацию? Я понимаю простоту хранения CCD в виде XML и использования XML-запросов, но в моем случае бизнесу нужна более удобочитаемая структура для данных, и отказ от очень оптимизированного характера механизмов преобразования XML и обмена сообщениями BizTalk и опора на сервер SQL кажется почти как напрасно тратить. Не могли бы вы пояснить преимущества вашего подхода? - person Ritley572; 08.04.2014
comment
Честно говоря, драйвером было то, что мы пытались стремиться к стандартизированной схеме. Хотя HL7v2 является технически стандартным, здесь, даже среди наших входящих интерфейсов от ОДНОГО поставщика, схемы сильно различаются. На самом деле я не участвовал в принятии решения об использовании V3, но это была попытка уйти от гибридных схем V2, которые, кажется, всегда приживаются. До сих пор это работало. Недостатком является то, что, как вы сказали, это более сложно в отношении BizTalk. - person Bensonius; 13.06.2014

Моделирование на HL7 может быть мучением.

Я бы сделал следующее;

  • используйте стандарты, описанные в HL7 для промежуточных таблиц, таким образом, даже если у вас есть varchar(1024) и они равны нулю, это не повредит вам
  • создайте свою фактическую таблицу, которая будет заполнена из промежуточной таблицы в соответствии со стандартами, которые вы применяли или будете применять.

Это означает, что у вас есть 500+ столбцов из сообщения, но только 10 или 50 имеют смысл, вам нужно будет смоделировать только свои 50. Да, это однобоко, завтра вы хотите сделать больше смысла, тогда он увеличится с 50 до 75 , исторические сообщения не будут содержать информации; что хорошо, но вам нужно будет учитывать дизайн.

person DataGuru    schedule 14.03.2014