Немного обо мне
В 1987-м году я окончил с красным дипломом приборостроительный факультет челябинского политехнического института по специальности "Автоматика и телемеханика", хотя планировал стать физиком-теоретиком и школу заканчивал в специализированной школе-интернате №18 при МГУ. По распределению попал в специализированное конструкторское бюро и до 1991-го года разрабатывал электронные блоки для бронетанковой техники. До сих пор считаю что полученная при этом инженерная школа является чем-то недостижимым в современных реалиях. В частности, мы с коллегами создали комбинированный аналого-цифровой программируемый комплекс, который в реальном времени проводил расчеты по математической модели объекта, описываемой системой дифференциальных уравнений 4-го порядка с 14-ью нелинейными элементами и принимал решения более 10 тысяч раз в секунду. На современных вычислителях это наверное и можно было бы сделать, но в то время мы решали задачу имея в распоряжении только набор интегральных микросхем, самой крутой из которых была ПЗУ на 2 килобайта и всё наше творчество должно было уместиться в 9 литров объёма и работать в диапазоне температур от -40 до +85.
После того как в 1991-м году страна развалилась я выбрал стезю программирования и с тех пор так или иначе связан с разработкой ПО и построением крупных информационных систем. Начинал с создания комплексного ПО и "умной кассы" для торгового центра, потом была информационная система учёта аренды муниципального имущества. Потом я вернулся в конструкторское бюро на считавшийся безнадёжным проект по созданию комплекса диагностических стендов для автоматизированного поиска неисправностей в электронных блоках в интересах иностранного заказчика. После окончания разработки я возглавлял группу разработчиков, которая сдавала эти стенды заказчику, и мы с этой задачей справились.
После этого бесценного опыта я был техническим директором фирмы по коммерческой разработке программного обеспечения и здесь мне пришлось впервые окунуться в предметную область информационных систем для медицины.
Начало осмысления проблем
Среди нескольких серьёзных разрабатывавшихся проектов (был и "Умный город" с системами распознавания номеров автомобилей, и логистика транспортных средств металлургического комбината и ...) был особенный проект по созданию единой информационно-аналитической системы здравоохранения Челябинской области.
Первым этапом по контракту с министерством здравоохранения было создание технического проекта - очень редкое по нынешним временам явление, так как результатом являлся только лишь бумажный отчёт. Пиши себе всё что хочешь в своё удовольствие и проверить насколько ты выполнил условия контракта практически нереально. Но мы подошли к вопросу достаточно скрупулёзно и проанализировали весь доступный мировой опыт создания крупных медицинских информационных систем.
Первым объектом глубокого исследования был конечно самый распространённый на то время комплекс стандартов HL7. Изучая его и кучу сопутствующих ему стандартов мы стали впадать в отчаяние - количество терминов и связей, необходимых хотя бы для минимальной функциональности одного лечебного учреждения, превышало наши возможности их осмысления, а тем более реализации, на порядки. Система здравоохранения (в том виде как она нужна именно для повышения показателей здоровья популяции) охватывает огромное количество разнообразных видов деятельности, каждый из которых имеет собственные обширные предметные области. А стандарт HL7, по крайней мере в том виде, в каком он был на момент нашего анализа (сейчас вроде бы сильно изменился, я не уточнял), был конгломератом стандартов на всех уровнях модели OSI. При попытке охватить все необходимые аспекты проект превращался в такое грандиозное нагромождение мало связанных между собой частей, что за его реализацию пришлось бы браться только нашим потомкам.
В ходе поиска возможных альтернатив и рабочих решений мы наткнулись на малоизвестный в то время комплекс стандартов OpenEHR. Заложенные в нём подходы позволяли хорошо упорядочить разработку, охватывали все необходимые направления перспективных разработок и давали возможность реализации отдельных частей по мере развития всеохватывающей информационной системы. Недостатками было то, что единственный на то время разработчик (он же составитель и распорядитель стандарта), находился в Австралии и запрашивал за любые свои услуги неподъёмную для российских субъектов оплату. Он предоставлял хорошие инструменты для проектирования информационных систем на основе его стандартов, но стоимость лицензий на эти инструменты делала разработку на их основе никогда не окупаемой.
Поиск решения
С технической точки зрения комплекс стандартов OpenEHR представляет собой набор правил для создания и эволюции сложных, взаимосвязанных типов данных, язык построения универсальных запросов к данным, являющимся экземплярами таких типов, и набор требований к информационным системам для обеспечения их взаимодействия между собой при условии, что они не обязаны заботится о совместимости друг с другом. Это было очень похоже на идеи, закладывавшиеся при разработке комплекса стандартов XML. Только стандарты консорциума W3C являются унифицированными и распространяются не только на медицину.
В итоге мы сформировали проект, в основе которого был заложен подход, ставящий в центр всей конструкции универсальный "движок XML", а специализация его под медицинский проект осуществлялась путем модификации java-реализации стандарта OpenEHR на использование во всех возможных местах этого "универсального движка". Компания Ocean Informatics вела свои разработки на .Net и данная реализация распространялась ими бесплатно в учебных целях. Сейчас модифицированную java-реализацию можно найти здесь.
Реализации
Как всегда, когда идёт переход от теории к практике,
не могу удержаться чтобы не привести здесь афоризм, приписываемый Эйнштейну
Что такое теория? Это когда знаешь как, но ничего не работает. Что такое практика? Это когда всё работает, но никто не знает почему. Что такое соединение теории с практикой? Это когда ничего не работает и никто не знает почему.
приходится реализовывать что-то очень далёкое от того что напроектировал. В нашем случае первой реальной реализацией подходов, закладывавшихся в единую информационно-аналитическую систему здравоохранения области, стала система обеспечения необходимыми лекарственными средствами отдельных (льготных) категорий граждан. И на первый план вышли проблемы совсем не "электронной истории болезни", а совмещение учётной системы областного аптечного склада и импорт/экспорт данных самых разнообразных источников на стороне лечебно-профилактических учреждений. Я считаю что мы с этой задачей справились, система была запущена более чем в 500-ах лечебных учреждениях и на момент моего ухода из компании нареканий к её функционированию не было. Но упомянутый "движок XML" представлял из себя совершенно вырожденного уродца.
Однако сама идея, закладывавшаяся в проект, странным образом не умерла. Участвовавшая в этом проекте на субподряде компания решила продолжить собственные разработки в этом направлении, существенно их модифицировала и даже смогла поучаствовать во внедрении медицинских систем в лечебно-профилактические учреждения города Москвы. Вот одна из её публикаций на эту тему.
Те же проблемы, но в другой сфере
После ухода из упомянутой компании я участвовал во многих проектах, попробовал силы в собственном бизнесе, своими руками перепробовал наверное большинство из современных технологических решений. На проекте с которого я ушёл совсем недавно (очень горячий проект в интересах пенсионного фонда РФ), мне пришлось снова задуматься о документоориентированных/иерархических хранилищах. Если бы не постоянный цейтнот и отсутствие поддержки со стороны руководства, то я точно попробовал бы вернуться на этом проекте к идее "движка XML". Главные болячки этого проекта в том, что практически вся информация, поступающая в систему, это xml-документы из внешних информационных систем, а запросы, поступающие к этой системе, заранее не определены и очень часто меняются. Созданная для этого структура хранения данных напоминает мне попытку компании Oracle реализовать обработку XML в своей базе данных. Oracle конечно подошла к этому вопросу более методично и внедрила все необходимые процедуры прямо в ядро базы данных (это была попытка представить иерархические связи в виде множества генерируемых таблиц, связываемых join-ами), но и она впоследствии отказалась от такого решения, так как попытка загрузить в базу данных xml-документ 10-мегабайтного объёма, приводила к "подвисанию" на несколько часов, а многие из xpath-запросов в принципе не поддавались оптимизации на реляционном представлении.
Так как же всё-таки решать подобные задачи
В 2006-м году корпорацией IBM был опубликован интересный документ. В котором подробно расписана методика исполнения любых XPath-выражений средствами реляционных баз данных, без деградации производительности на рекурсивных процедурах. Ими же была разработана эталонная реализация данного подхода, но дальнейшую судьбу продукта я отследить не смог.
Попутно хочу заметить что к стандартным реализациям XPath в java (xerces, xalan) имеется большое количество вопросов, которые нелегко разрешить.
В свободное от основной работы время, долгими вечерами, я реализовал собственное решение на основе описанного в упомянутом документе подхода. Парсинг XPath-выражений осуществляется замечательным продуктом ANTLR, необходимые для хранения xml-документов и xsd-схем сущности формируются средствами JPA, что даёт возможность использовать любую реляционную базу данных, попутным бонусом получилась неплохая реализация обработки XPath-запросов на файловых ресурсах.
Minimum Value Point решения можно посмотреть на этом ресурсе. Текущая реализация пока имеет много ограничений (не реализована работа с map и arrays, из всех функций полноценно реализована только функция abs), но большинство потребностей обработки иерархических документов обеспечиваются уже на данном уровне реализации. Поскольку это развёрнуто на моей домашней рабочей станции, на которой я ещё и выполняю основную работу, я ограничил поток обрабатываемых запросов (не более 10 запросов в минуту, объём одного документа не больше 1 мб), но внутри обработки никаких ограничений нет и ведутся замеры времени выполнения отдельных частей процесса.
Комментарии (12)
Ahuromazdie
20.01.2023 11:23<старыйпенсионер>
Приятель после универа в 9х пошел работать в банк (менатеп?). Через много лет , работая уже в телекоме и перебравшись в Москоу вспоминал. На первом этапе, когда он поступил на работу, абс-ка была написана на мумпсе (MUMPS, M-system). Все работало как часики, своя терминалка алфавитно-цифровая, ничего не виснет, откат/восстановление занимал минуты. Затем началась реорганизация. Привезли какие-то дорогущщие сервера под *nix, развернули сервер БД, установили новую абс-ку. Количество сбоев увеличилось на порядок, время простоя требуемого для восстановления/отката и устранения последствий еще больше. И так несколько итераций с переменным успехом (успех - то что количество проблем не увеличилось). Одно слово - прогресс....
</старыйпенсионер>
rukhi7
20.01.2023 12:14Одно слово - прогресс....
да, к сожалению, прогресс особенно заметен в развитии возможностей пудрить мозги.
Но это общие рассуждения, это не к статье.
По статье, я, например, не понял, где же описание или какая то основопологающая идея которая описывает
инструмент, превращающий реляционную базу данных в эффективно работающее документоориентированное хранилище
VladimirPashutin Автор
20.01.2023 14:04Здесь - В 2006-м году корпорацией IBM был опубликован интересный документ.
rukhi7
20.01.2023 16:30Документ действительно интересный, и было бы интересно узнать (и наверно обсудить) что, конкретно вы (у вас), подчерпнули-реализовали из этого proposal ("пропозола"), без этого смысл написания вашей статьи как то теряется. По крайней мере мне так кажется.
VladimirPashutin Автор
20.01.2023 16:48Если брать раздел "5.1 A Purely Relational Implementation", то он реализован полностью. Правда я подходил к этому документу как к описанию метода и структура хранения, собственно машина формирования запросов, несколько видоизменены, но основной подход полностью соответствует "proposal-у". Видоизменения вызваны тем, что я планирую довести этот проект до состояния, когда можно сохранять в базе данных любые соответствующие спецификациям xml-документы с учётом эволюции описывающих их xsd-схем (и сами схемы тоже), строить на полном множестве всех документов любые запросы, соответствующие спецификации XPath 3.1 и связывать отдельные узлы документов с НСИ и JPA-сущностями любых бизнес-доменов.
VladimirPashutin Автор
20.01.2023 16:50Было бы очень любопытно узнать в чём Вы видите смысл этой статьи?
rukhi7
20.01.2023 17:02+1Смысл этой статьи, как и любой другой, наверно и как мне кажется, найти заинтересованных людей по теме, и обсудить с ними свое понимание проблемы, технологии, ... а также достижения, результаты
Наверно, близко к тому чтобы проверить себя, проверить актуальность темы, решения, технологии, ... того что описано. Реклама своих достижений то же из списка положительных смыслов, как мне кажется.
rukhi7
Из того что вы написали получается вы считаете проблемой что xml-документ 10-мегабайтного объёма очень долго парсится- раскладывается в таблицы, интересно почему вас не беспокоит сколько времени этот xml-документ 10-мегабайтного объёма создается (вы об этом не упоминаете по крайней мере). Мне кажется искать проблему надо на стороне его создания в первую очередь.
Вопрос о том как и почему данные накапливаются в промежуточном формате не рассматривали?
VladimirPashutin Автор
Я рассматриваю проблему на стороне подсистемы, осуществляющей хранение и обработку. Реализованное мною решение не нуждается в накоплении чего-либо в промежуточных форматах. Сохранение в базу данных - поточная процедура, работающая с той производительностью сохранения, которую может предоставить реляционная база данных. Хранение иерархических данных осуществляется в трёх таблицах (документы, узлы документов и связи между ними).
Вопрос создания xml-документа чаще всего лежит на стороне бизнес-потребности и универсальный инструмент хранения/обработки должен с максимально возможной производительностью работать независимо от размеров данных, которые в него загружают.
rukhi7
Мне товарищ рассказывал как он решил подобные проблемы примерно 20 (!) лет назад для системы хранения анализа билинговых данных (слежение за израсходованным оплаченным ресурсом по сотовой связи), тоже говорил что один файл данных загружался целый рабочий день в базу данных. Он как раз применил XML и стандартную виндузовую длл-ку для его парсинга, трансформаций, запросов, ... (XML, XSLT, XML Schema) с тех пор все летает. Он тогда гордился что смог сократить один из пяти (кажется) серверов из поставки оборудования под эти дела.
Я к тому что не надо пытаться написать свой XSLT процессор, XML парсер, все уже есть и работало уже 20 лет назад. Эта длл-ка бесплатная даже под виндос.
VladimirPashutin Автор
В некоторой части соглашусь - писать велосипеды пустая трата времени, но я уверен, что данное решение будет оптимальным для описанного мною класса проблем. Тем более, что это не отдельно стоящий парсер, а инструмент, превращающий реляционную базу данных в эффективно работающее документоориентированное хранилище. Возможность выполнять любые иерархические запросы с той же производительностью, что и реляционные запросы к плоским таблицам, позволяет упростить решение очень многих бизнес-задач.