Модель сущность-атрибут-значение ( EAV ) — это модель данных , оптимизированная для эффективного хранения разреженных или специальных значений свойств или данных, предназначенная для ситуаций, когда шаблоны использования во время выполнения произвольны, подвержены изменениям со стороны пользователя или иным образом непредсказуемы с использованием фиксированного дизайна. Вариант использования нацелен на приложения, которые предлагают большую или богатую систему определенных типов свойств, которые, в свою очередь, подходят для широкого набора сущностей, но где обычно только небольшой, конкретный выбор из них инстанцируется (или сохраняется) для данной сущности. Таким образом, этот тип модели данных относится к математическому понятию разреженной матрицы . EAV также известна как модель объект-атрибут-значение , вертикальная модель базы данных и открытая схема .
Это представление данных аналогично эффективным по пространству методам хранения разреженной матрицы , где хранятся только непустые значения. В модели данных EAV каждая пара атрибут-значение является фактом, описывающим сущность, а строка в таблице EAV хранит один факт. Таблицы EAV часто описываются как «длинные и тонкие»: «длинные» относится к количеству строк, «тонкие» — к нескольким столбцам.
Данные записываются в три столбца:
Рассмотрим, как можно попытаться представить клиническую запись общего назначения в реляционной базе данных. Очевидно, что создание таблицы (или набора таблиц) с тысячами столбцов нецелесообразно, поскольку подавляющее большинство столбцов будет null . Чтобы усложнить ситуацию, в продольной медицинской записи, которая отслеживает пациента с течением времени, может быть несколько значений одного и того же параметра: например, рост и вес ребенка меняются по мере его роста. Наконец, вселенная клинических результатов продолжает расти: например, возникают заболевания и разрабатываются новые лабораторные тесты; это потребует постоянного добавления столбцов и постоянного пересмотра пользовательского интерфейса. Термин «изменчивость атрибутов» иногда используется для описания проблем или ситуаций, которые возникают, когда список доступных атрибутов или их определений должен со временем меняться.
Ниже показана выборка строк таблицы EAV для клинических результатов визита к врачу по поводу лихорадки утром 1998-05-01. Записи, показанные в угловых скобках, являются ссылками на записи в других таблицах, показанных здесь как текст, а не как закодированные значения внешнего ключа для простоты понимания. В этом примере все значения являются литеральными значениями, но они также могут быть предопределенными списками значений. Последние особенно полезны, когда известно, что возможные значения ограничены (т. е. перечислимы ).
Приведенный ниже пример иллюстрирует симптомы, которые могут наблюдаться у пациента с пневмонией .
Данные EAV, описанные выше, сопоставимы с содержимым чека в супермаркете (который будет отражен в таблице Sales Line Items в базе данных). В чеке перечислены только сведения о фактически купленных товарах, а не каждый продукт в магазине, который клиент мог бы купить, но не сделал этого. Как и клинические результаты для конкретного пациента, чек представляет собой компактное представление изначально разреженных данных.
Строковое моделирование [ требуется пояснение ] , где факты о чем-либо (в данном случае, транзакция продажи) записываются в виде нескольких строк, а не нескольких столбцов , является стандартной техникой моделирования данных. Различия между строковым моделированием и EAV (которое можно считать обобщением строкового моделирования) следующие:
В репозитории клинических данных моделирование строк также находит многочисленные применения; подсхема лабораторных тестов обычно моделируется таким образом, поскольку результаты лабораторных тестов, как правило, являются числовыми или могут быть закодированы в числовом виде.
Ниже перечислены обстоятельства, при которых вам может потребоваться перейти от стандартного моделирования строк к EAV:
Некоторые («гибридные») классы имеют некоторые атрибуты, которые не являются разреженными (присутствуют во всех или большинстве случаев), в то время как другие атрибуты являются весьма изменчивыми и разреженными. Последние подходят для моделирования EAV. Например, описания продуктов, производимых корпорацией-конгломератом, зависят от категории продукта, например, атрибуты, необходимые для описания марки лампочки, существенно отличаются от тех, которые требуются для описания медицинского устройства визуализации, но оба имеют общие атрибуты, такие как единица упаковки и стоимость за единицу.
В клинических данных сущностью обычно является клиническое событие, как описано выше. В более общих настройках сущность является внешним ключом в таблице «объектов», которая записывает общую информацию о каждом «объекте» (вещи) в базе данных – как минимум, предпочтительное имя и краткое описание, а также категорию/класс сущности, к которой она принадлежит. Каждой записи (объекту) в этой таблице назначается сгенерированный машиной идентификатор объекта.
Подход «таблицы объектов» был впервые предложен Томом Слезаком и его коллегами из Lawrence Livermore Laboratories для базы данных Chromosome 19 и теперь является стандартом в большинстве крупных баз данных биоинформатики. Использование таблицы объектов не требует одновременного использования дизайна EAV: для хранения деталей каждого объекта, относящихся к конкретной категории, можно использовать обычные таблицы.
Главное преимущество центральной таблицы объектов заключается в том, что, имея вспомогательную таблицу синонимов объектов и ключевых слов, можно обеспечить стандартный механизм поиска, подобный Google, по всей системе, где пользователь может найти информацию о любом интересующем его объекте, не указывая предварительно категорию, к которой он принадлежит. (Это важно в биологических системах, где ключевое слово, например «ацетилхолин», может относиться либо к самой молекуле, которая является нейромедиатором, либо к биологическому рецептору, с которым она связывается.)
В самой таблице EAV это просто идентификатор атрибута, внешний ключ в таблице определений атрибутов, как указано выше. Однако обычно существует несколько таблиц метаданных, содержащих информацию, связанную с атрибутами, и они будут рассмотрены вкратце.
Приведение всех значений к строкам, как в примере данных EAV выше, приводит к простой, но немасштабируемой структуре: требуются постоянные взаимопреобразования типов данных, если требуется что-либо сделать со значениями, а индекс в столбце значений таблицы EAV по сути бесполезен. Кроме того, неудобно хранить большие двоичные данные, такие как изображения, в кодировке Base64 в той же таблице, что и небольшие целые числа или строки. Поэтому более крупные системы используют отдельные таблицы EAV для каждого типа данных (включая большие двоичные объекты , «BLOBS»), при этом метаданные для данного атрибута идентифицируют таблицу EAV, в которой будут храниться его данные. Этот подход на самом деле довольно эффективен, поскольку скромное количество метаданных атрибута для данного класса или формы, с которыми пользователь выбирает работать, можно легко кэшировать в памяти. Однако он требует перемещения данных из одной таблицы в другую, если тип данных атрибута изменяется.
EAV, как универсальное средство представления знаний , возникло из концепции « ассоциативных списков » ( пар атрибут–значение ). Обычно используемые сегодня, они были впервые введены в языке LISP . [1] Пары атрибут–значение широко используются для различных приложений, таких как файлы конфигурации (используя простой синтаксис, такой как атрибут = значение ). Примером использования EAV вне базы данных является UIMA (Unstructured Information Management Architecture), стандарт, который в настоящее время управляется Apache Foundation и применяется в таких областях, как обработка естественного языка . Программное обеспечение, которое анализирует текст, обычно размечает («аннотирует») сегмент: пример, приведенный в руководстве по UIMA, представляет собой программу, которая выполняет распознавание именованных сущностей (NER) в документе, аннотируя текстовый сегмент «Президент Буш» тройкой аннотация–атрибут–значение (Персона, Полное_имя, «Джордж Буш-младший») . [2] Такие аннотации могут храниться в таблице базы данных.
Хотя EAV не имеет прямой связи с AV-парами, Стед и Хаммонд, по-видимому, были первыми, кто задумал их использование для постоянного хранения произвольно сложных данных. [3] Первыми системами медицинских записей, использовавшими EAV, были электронные медицинские записи Regenstrif (работы под руководством Клемента Макдональда), [4] система TMR (The Medical Record) Уильяма Стеда и Эда Хаммонда и репозиторий клинических данных HELP (CDR), созданный группой Гомера Уорнера в больнице LDS в Солт-Лейк-Сити, штат Юта. [5] [6] (Система Regenstrif фактически использовала конструкцию Patient-Attribute-Timestamp-Value: использование временной метки поддерживало извлечение значений для данного пациента/атрибута в хронологическом порядке.) Все эти системы, разработанные в 1970-х годах, были выпущены до того, как стали доступны коммерческие системы, основанные на модели реляционной базы данных Э. Ф. Кодда , хотя HELP был гораздо позже перенесен на реляционную архитектуру и коммерциализирован корпорацией 3M. (Обратите внимание, что хотя знаменательная статья Кодда была опубликована в 1970 году, ее сильно математический тон имел неприятный эффект, уменьшив ее доступность среди людей, не связанных с компьютерными науками, и, следовательно, задержав принятие модели в кругах ИТ и поставщиков программного обеспечения. Ценность последующего вклада Кристофера Дж. Дейта , коллеги Кодда в IBM, в перевод этих идей на доступный язык, сопровождаемый простыми примерами, иллюстрирующими их силу, невозможно переоценить.)
Группа в Колумбийском пресвитерианском медицинском центре была первой, кто использовал реляционную базу данных в качестве основы системы EAV. [7]
Система управления данными клинических исследований TrialDB с открытым исходным кодом, разработанная Надкарни и др., была первой, в которой использовалось несколько таблиц EAV, по одной для каждого типа данных СУБД . [8]
Структура EAV/CR, разработанная в первую очередь Луисом Маренко и Пракашем Надкарни, наложила принципы объектной ориентации на EAV; [9] она была основана на подходе объектной таблицы Тома Слезака (описанном ранее в разделе «Сущность»). SenseLab, общедоступная база данных нейронауки, создана с использованием структуры EAV/CR.
Термин «база данных EAV» относится к проекту базы данных, где значительная часть данных моделируется как EAV. Однако даже в базе данных, описываемой как «основанная на EAV», некоторые таблицы в системе являются традиционными реляционными таблицами.
Как отмечено выше, моделирование EAV имеет смысл для таких категорий данных, как клинические данные, где атрибуты многочисленны и редки. Если эти условия не выполняются, предпочтительнее стандартное реляционное моделирование (т. е. один столбец на атрибут); использование EAV не означает отказ от здравого смысла или принципов хорошего реляционного дизайна. В системах клинических записей подсхемы, работающие с демографическими данными пациентов и выставлением счетов, обычно моделируются традиционно. (В то время как большинство схем баз данных поставщиков являются фирменными, VistA , система, используемая во всей медицинской системе Министерства по делам ветеранов США (VA), известной как Администрация здравоохранения ветеранов (VHA), [10] имеет открытый исходный код, и ее схему легко проверить, хотя она использует ядро базы данных MUMPS, а не реляционную базу данных.)
Как обсуждалось вкратце, база данных EAV по сути не может поддерживаться без многочисленных вспомогательных таблиц, содержащих вспомогательные метаданные . Таблицы метаданных, которые обычно превосходят по численности таблицы EAV по крайней мере в три раза или более, обычно являются стандартными реляционными таблицами. [8] [9] Примером таблицы метаданных является таблица определений атрибутов, упомянутая выше.
В простом дизайне EAV значения атрибута являются простыми или примитивными типами данных с точки зрения ядра базы данных. Однако в системах EAV, используемых для представления весьма разнообразных данных, возможно, что заданный объект (экземпляр класса) может иметь подструктуру: то есть некоторые из его атрибутов могут представлять другие виды объектов, которые, в свою очередь, могут иметь подструктуру, до произвольного уровня сложности. Например, у автомобиля есть двигатель, трансмиссия и т. д., а у двигателя есть такие компоненты, как цилиндры. (Допустимая подструктура для заданного класса определяется в метаданных атрибутов системы, как обсуждается далее. Таким образом, например, атрибут «random-access-memory» может применяться к классу «computer», но не к классу «engine».)
Для представления подструктуры вводится специальная таблица EAV, в которой столбец значений содержит ссылки на другие сущности в системе (т. е. значения внешнего ключа в таблице объектов). Чтобы получить всю информацию о данном объекте, требуется рекурсивный обход метаданных, за которым следует рекурсивный обход данных, который останавливается, когда каждый извлеченный атрибут является простым (атомарным). Рекурсивный обход необходим независимо от того, представлены ли сведения об отдельном классе в обычной или EAV-форме; такой обход выполняется, например, в стандартных объектно-реляционных системах. На практике количество уровней рекурсии, как правило, относительно невелико для большинства классов, поэтому потери производительности из-за рекурсии невелики, особенно при индексации идентификаторов объектов.
EAV/CR (EAV с классами и отношениями) [11] [12] [13] относится к фреймворку, который поддерживает сложную подструктуру. Его название несколько неверно: хотя это было ответвлением работы над системами EAV, на практике многие или даже большинство классов в такой системе могут быть представлены в стандартной реляционной форме, в зависимости от того, являются ли атрибуты разреженными или плотными. EAV/CR действительно характеризуется своими очень подробными метаданными, которые достаточно богаты, чтобы поддерживать автоматическую генерацию интерфейсов просмотра для отдельных классов без необходимости писать код пользовательского интерфейса для каждого класса. Основой таких интерфейсов браузера является то, что можно генерировать пакет динамических SQL-запросов, который не зависит от класса объекта, сначала просматривая его метаданные и используя информацию метаданных для генерации последовательности запросов к таблицам данных, и некоторые из этих запросов могут быть произвольно рекурсивными. Такой подход хорошо работает для запросов «объект за раз», например, в веб-интерфейсах просмотра, где нажатие на имя объекта выводит все сведения об объекте на отдельной странице: метаданные, связанные с классом этого объекта, также облегчают представление сведений об объекте, поскольку включают в себя заголовки отдельных атрибутов, порядок, в котором они должны быть представлены, а также способ их группировки.
Один из подходов к EAV/CR заключается в том, чтобы разрешить столбцам хранить структуры JSON , которые, таким образом, обеспечивают необходимую структуру класса. Например, PostgreSQL , начиная с версии 9.4, предлагает поддержку двоичных столбцов JSON (JSONB), позволяя запрашивать, индексировать и объединять атрибуты JSON.
По словам профессора доктора Дэниела Масиса (бывшего заведующего кафедрой медицинской информатики Университета Вандербильта), проблемы работы с EAV возникают из-за того, что в базе данных EAV «физическая схема» (способ хранения данных) радикально отличается от «логической схемы» — способа, которым пользователи и многие программные приложения, такие как статистические пакеты, рассматривают ее, то есть как обычные строки и столбцы для отдельных классов. (Поскольку таблица EAV концептуально смешивает яблоки, апельсины, грейпфруты и рагу из рагу, если вы хотите выполнить какой-либо анализ данных с использованием стандартного готового программного обеспечения, в большинстве случаев вам придется преобразовывать их подмножества в столбчатую форму. [14] Процесс выполнения этого, называемый поворотом , достаточно важен, чтобы обсудить его отдельно.)
Метаданные помогают выполнять ловкость рук, которая позволяет пользователям взаимодействовать с системой в терминах логической схемы, а не физической: программное обеспечение постоянно обращается к метаданным для различных операций, таких как представление данных, интерактивная проверка, извлечение больших объемов данных и специальные запросы. Метаданные фактически могут использоваться для настройки поведения системы.
Системы EAV жертвуют простотой физической и логической структуры данных ради сложности метаданных, которые, помимо прочего, играют ту же роль, что ограничения базы данных и ссылочная целостность в стандартных проектах баз данных. Такой компромисс, как правило, оправдан, поскольку в типичной смешанной схеме производственных систем данные в обычных реляционных таблицах также могут извлекать выгоду из функциональности, такой как автоматическая генерация интерфейса. Структура метаданных достаточно сложна, чтобы включать в себя собственную подсхему в базе данных: различные внешние ключи в таблицах данных ссылаются на таблицы в этой подсхеме. Эта подсхема является стандартно-реляционной, в которой такие функции, как ограничения и ссылочная целостность, используются в полной мере.
Корректность содержимого метаданных с точки зрения предполагаемого поведения системы имеет решающее значение, и задача обеспечения корректности означает, что при создании системы EAV значительные усилия по проектированию должны быть направлены на создание пользовательских интерфейсов для редактирования метаданных, которые могут использоваться людьми в команде, знающими проблемную область (например, клиническую медицину), но не обязательно программистами. (Исторически сложилось так, что одной из главных причин, по которой дореляционная система TMR не была принята на сайтах, отличных от ее домашнего учреждения, было то, что все метаданные хранились в одном файле с неинтуитивной структурой. Настройка поведения системы путем изменения содержимого этого файла, не вызывая при этом сбоя в работе системы, была настолько деликатной задачей, что авторы системы доверяли ее выполнение только себе.)
Если система EAV реализована через RDF , язык RDF Schema может быть удобно использован для выражения таких метаданных. Эта информация о схеме может затем использоваться ядром базы данных EAV для динамической реорганизации его внутренней структуры таблиц для лучшей эффективности. [15]
Несколько последних предостережений относительно метаданных:
Валидация, представление и группировка метаданных делают возможным создание структур кода, которые поддерживают автоматическую генерацию пользовательского интерфейса как для просмотра данных, так и для интерактивного редактирования. В производственной системе, которая поставляется через Интернет, задача валидации данных EAV по сути перемещается с уровня бэкэнда/базы данных (который бессилен по отношению к этой задаче) на средний уровень/уровень веб-сервера. В то время как валидация на внутреннем уровне всегда идеальна, поскольку ее невозможно подорвать, попытавшись напрямую ввести данные в таблицу, валидация на среднем уровне через общую структуру вполне работоспособна, хотя значительная часть усилий по проектированию программного обеспечения должна быть направлена на создание структуры в первую очередь. Наличие структур с открытым исходным кодом , которые можно изучать и изменять для индивидуальных потребностей, может иметь большое значение для избежания повторного изобретения колеса. [ требуется цитата ]
(Первая часть этого раздела представляет собой краткое изложение справочной статьи Дину/Надкарни в Central [18] , к которой читатель может обратиться за более подробной информацией.)
Моделирование EAV, под альтернативными терминами " generic data modeling " или "open schema", уже давно является стандартным инструментом для продвинутых разработчиков моделей данных. Как и любая продвинутая техника, она может быть обоюдоострой и должна использоваться благоразумно.
Кроме того, использование EAV не исключает использования традиционных подходов моделирования реляционных баз данных в рамках той же схемы базы данных. В EMR, которые полагаются на RDBMS, такие как Cerner , которые используют подход EAV для своей подсхемы клинических данных, подавляющее большинство таблиц в схеме фактически моделируются традиционно, с атрибутами, представленными в виде отдельных столбцов, а не строк.
Моделирование подсхемы метаданных системы EAV, по сути, очень хорошо подходит для традиционного моделирования из-за взаимосвязей между различными компонентами метаданных. Например, в системе TrialDB количество таблиц метаданных в схеме превышает количество таблиц данных примерно в десять раз. Поскольку правильность и согласованность метаданных имеют решающее значение для правильной работы системы EAV, разработчик системы хочет в полной мере воспользоваться всеми функциями, которые предоставляют СУРБД, такими как ссылочная целостность и программируемые ограничения, а не изобретать колесо движка СУРБД. Следовательно, многочисленные таблицы метаданных, которые поддерживают проекты EAV, обычно находятся в реляционной форме третьей нормальной формы.
Коммерческие электронные системы медицинских карт (EHR) используют моделирование строк для таких классов данных, как диагнозы, выполненные хирургические процедуры и результаты лабораторных тестов, которые разделены на отдельные таблицы. В каждой таблице «сущность» представляет собой совокупность идентификатора пациента и даты/времени постановки диагноза (или проведения операции или лабораторного теста); атрибут является внешним ключом в специально предназначенной таблице поиска, которая содержит контролируемый словарь — например, МКБ-10 для диагнозов, Текущая процедурная терминология для хирургических процедур с набором атрибутов значений. (Например, для результатов лабораторных тестов можно записать измеренное значение, находится ли оно в нормальном, низком или высоком диапазоне, идентификатор лица, ответственного за выполнение теста, дату/время выполнения теста и т. д.) Как было сказано ранее, это не полноценный подход EAV, поскольку домен атрибутов для данной таблицы ограничен, так же как домен идентификаторов продуктов в таблице Sales супермаркета будет ограничен доменом Products в таблице Products.
Однако для сбора данных по параметрам, которые не всегда определены в стандартных словарях, EHR также предоставляют «чистый» механизм EAV, где специально назначенные продвинутые пользователи могут определять новые атрибуты, их тип данных, максимально и минимально допустимые значения (или допустимый набор значений/кодов), а затем разрешать другим собирать данные на основе этих атрибутов. В Epic (TM) EHR этот механизм называется «Flowsheets» и обычно используется для сбора данных наблюдения за стационарным сестринским уходом.
Типичный случай использования модели EAV — это очень редкие, неоднородные атрибуты, такие как клинические параметры в электронных медицинских картах (EMR), как указано выше. Однако даже здесь будет правильным указать, что принцип моделирования EAV применяется к подсхеме базы данных, а не ко всему ее содержимому. (Например, демографические данные пациентов наиболее естественно моделируются в традиционной реляционной структуре с одним столбцом на атрибут.)
Следовательно, аргументы о EAV против «реляционного» дизайна отражают неполное понимание проблемы: дизайн EAV должен использоваться только для той подсхемы базы данных, где необходимо моделировать разреженные атрибуты: даже здесь они должны поддерживаться таблицами метаданных третьей нормальной формы . Существует относительно немного проблем проектирования баз данных, где встречаются разреженные атрибуты: вот почему обстоятельства, в которых применим дизайн EAV, относительно редки. Даже там, где они встречаются, набор таблиц EAV не является единственным способом решения проблемы разреженных данных: решение на основе XML (обсуждаемое ниже) применимо, когда максимальное количество атрибутов на сущность относительно невелико, а общий объем разреженных данных также столь же скромен. Примером такой ситуации являются проблемы захвата переменных атрибутов для различных типов продуктов.
Разрозненные атрибуты могут также возникать в ситуациях электронной коммерции, когда организация закупает или продает большой и весьма разнообразный набор товаров, при этом детали отдельных категорий товаров сильно различаются.
Другое применение EAV — моделирование классов и атрибутов, которые, хотя и не редки, являются динамическими, но где количество строк данных на класс будет относительно скромным — максимум пара сотен строк, но обычно несколько десятков — и разработчик системы также должен предоставить веб-интерфейс для конечного пользователя в течение очень короткого времени выполнения. «Динамический» означает, что новые классы и атрибуты должны постоянно определяться и изменяться для представления развивающейся модели данных. Этот сценарий может иметь место в быстро развивающихся научных областях, а также в разработке онтологий, особенно на этапах прототипирования и итеративного уточнения.
В то время как создание новых таблиц и столбцов для представления новой категории данных не является особенно трудоемким, программирование веб-интерфейсов, которые поддерживают просмотр или базовое редактирование с проверкой на основе типа и диапазона, является таковым. В таком случае более поддерживаемым долгосрочным решением является создание фреймворка, в котором определения классов и атрибутов хранятся в метаданных, а программное обеспечение динамически генерирует базовый пользовательский интерфейс из этих метаданных.
Упомянутая ранее структура EAV/CR была создана для решения именно этой ситуации. Обратите внимание, что модель данных EAV здесь не является обязательной, но разработчик системы может счесть ее приемлемой альтернативой созданию, скажем, шестидесяти или более таблиц, содержащих в общей сложности не более двух тысяч строк. Здесь, поскольку количество строк на класс так мало, соображения эффективности менее важны; при стандартном индексировании по идентификатору класса/идентификатору атрибута оптимизаторы СУБД могут легко кэшировать данные для небольшого класса в памяти при выполнении запроса, включающего этот класс или атрибут.
В сценарии с динамическими атрибутами стоит отметить, что Resource Description Framework (RDF) используется в качестве основы для работы над онтологиями, связанными с семантической паутиной. RDF, предназначенный для использования в качестве общего метода представления информации, является формой EAV: тройка RDF включает объект, свойство и значение.
В конце книги Джона Бентли «Написание эффективных программ» автор предупреждает, что повышение эффективности кода в целом также усложняет его понимание и поддержку, поэтому не стоит торопиться и настраивать код, если вы сначала не определили, что есть проблема с производительностью, и такие меры, как профилирование кода, не выявили точное местоположение узкого места. После того, как вы это сделали, вы изменяете только тот конкретный код, который должен работать быстрее. Аналогичные соображения применимы к моделированию EAV: вы применяете его только к подсистеме, где традиционное реляционное моделирование известно априори как громоздкое (как в области клинических данных) или обнаруживается, что в ходе эволюции системы оно создает значительные проблемы с обслуживанием. Например, гуру баз данных (и в настоящее время вице-президент по основным технологиям в корпорации Oracle) Том Кайт [19] правильно указывает на недостатки использования EAV в традиционных бизнес-сценариях и подчеркивает, что простая «гибкость» не является достаточным критерием для использования EAV. (Однако он делает решительное заявление о том, что EAV следует избегать при любых обстоятельствах, даже несмотря на то, что само подразделение Oracle Health Sciences использует EAV для моделирования атрибутов клинических данных в своих коммерческих системах ClinTrial [20] и Oracle Clinical [21] ) .
Ахиллесова пята EAV — сложность работы с большими объемами данных EAV. Часто необходимо временно или постоянно выполнять взаимное преобразование между столбчатыми и строчными или EAV-моделированными представлениями одних и тех же данных; это может быть как подвержено ошибкам, если выполняется вручную, так и требовать больших ресурсов ЦП. Универсальные фреймворки, которые используют атрибуты и метаданные группировки атрибутов, устраняют первое, но не второе ограничение; их использование более или менее обязательно в случае смешанных схем, которые содержат смесь обычных реляционных и EAV-данных, где коэффициент ошибок может быть очень значительным.
Операция преобразования называется поворотом . Поворот требуется не только для данных EAV, но и для любой формы данных, смоделированных строками. (Например, реализации алгоритма Apriori для анализа ассоциаций, широко используемого для обработки данных о продажах в супермаркетах с целью определения других продуктов, которые покупатели данного продукта, вероятно, также купят, поворачивают данные, смоделированные строками, в качестве первого шага.) Многие СУБД имеют собственные расширения SQL для облегчения поворота, и такие пакеты, как Microsoft Excel, также поддерживают его. Обстоятельства, при которых поворот необходим, рассматриваются ниже.
Однако структура модели данных EAV является идеальным кандидатом для реляционного деления, см. реляционную алгебру . При хорошей стратегии индексации можно получить время отклика менее нескольких сотен миллисекунд для таблицы EAV с миллиардом строк. Microsoft SQL Server MVP Питер Ларссон доказал это на ноутбуке и сделал решение общедоступным. [22]
Очевидно, что независимо от того, какой подход вы выберете, запросы EAV не будут такими быстрыми, как запросы к стандартным реляционным данным, смоделированным по столбцам, для определенных типов запросов, во многом так же, как доступ к элементам в разреженных матрицах не такой быстрый, как доступ к элементам в неразреженных матрицах, если последние полностью помещаются в основную память. (Разреженные матрицы, представленные с использованием таких структур, как связанные списки, требуют обхода списка для доступа к элементу в заданной позиции XY, в то время как доступ к элементам в матрицах, представленных в виде двумерных массивов, может быть выполнен с использованием быстрых операций регистра ЦП.) Однако, если вы правильно выбрали подход EAV для проблемы, которую пытаетесь решить, это цена, которую вы платите; в этом отношении моделирование EAV является примером компромисса между пространством (и обслуживанием схемы) и временем ЦП.
Первоначально постулированная Майером, Ульманом и Варди [23] , «Универсальная модель данных» (UDM) стремится упростить запрос сложной реляционной схемы для наивных пользователей, создавая иллюзию того, что все хранится в одной гигантской «универсальной таблице». Она делает это, используя межтабличные связи, так что пользователю не нужно беспокоиться о том, какая таблица содержит какой атрибут. Однако CJ Date [24] указал, что в обстоятельствах, когда таблица многократно связана с другой (как в генеалогических базах данных, где отец и мать человека также являются людьми, или в некоторых бизнес-базах данных, где все адреса хранятся централизованно, и организация может иметь разные адреса офисов и адреса доставки), в схеме базы данных недостаточно метаданных для указания однозначных соединений. Когда UDM была коммерциализирована, как в SAP BusinessObjects , это ограничение было обойдено путем создания «Юниверсов», которые представляют собой реляционные представления с предопределенными объединениями между наборами таблиц: разработчик «Юниверсов» устраняет неоднозначность объединений, включая многократно связанную таблицу в представление несколько раз, используя разные псевдонимы.
Помимо способа, которым данные явно моделируются (UDM просто использует реляционные представления для посредничества между пользователем и схемой базы данных), EAV отличается от универсальных моделей данных тем, что он также применяется к транзакционным системам, а не только к системам, ориентированным на запросы (только для чтения), как в UDM. Кроме того, при использовании в качестве основы для систем запросов клинических данных реализации EAV не обязательно защищают пользователя от необходимости указывать класс интересующего его объекта. Например, в магазине клинических данных i2b2 на основе EAV [25] , когда пользователь ищет термин, у него есть возможность указать категорию данных, которые его интересуют. Например, фраза « литий » может относиться либо к лекарству (которое используется для лечения биполярного расстройства ), либо к лабораторному анализу уровня лития в крови пациента. (Уровень лития в крови необходимо тщательно контролировать: слишком большое количество препарата вызывает серьезные побочные эффекты, а слишком малое — неэффективно.)
Реализация Open Schema может использовать столбец XML в таблице для захвата переменной/разреженной информации. [26] Аналогичные идеи можно применить к базам данных, которые поддерживают столбцы со значениями JSON : разреженные иерархические данные могут быть представлены в виде JSON. Если база данных поддерживает JSON, например PostgreSQL и (частично) SQL Server 2016 и более поздние версии, то атрибуты можно запрашивать, индексировать и объединять. Это может обеспечить повышение производительности более чем в 1000 раз по сравнению с наивными реализациями EAV., [27] но не обязательно делает общее приложение базы данных более надежным.
Обратите внимание, что существует два способа хранения данных XML или JSON: один способ — хранить их как простую строку, непрозрачную для сервера базы данных; другой способ — использовать сервер базы данных, который может «видеть» структуру. Очевидно, что существуют некоторые серьезные недостатки в хранении непрозрачных строк: их нельзя запрашивать напрямую, нельзя сформировать индекс на основе их содержимого, и невозможно выполнять соединения на основе содержимого.
Создание приложения, которое должно управлять данными, становится чрезвычайно сложным при использовании моделей EAV из-за масштаба инфраструктуры, которую необходимо разработать с точки зрения таблиц метаданных и кода фреймворка приложения. Использование XML решает проблему проверки данных на сервере (которая должна выполняться кодом среднего уровня и браузера в фреймворках на основе EAV), но имеет следующие недостатки:
Все вышеперечисленные недостатки можно устранить, создав слой метаданных и кода приложения, но при его создании изначальное «преимущество» отсутствия необходимости создания фреймворка исчезло. Дело в том, что надежное моделирование атрибутов разреженных данных является сложной проблемой проектирования приложений баз данных, независимо от того, какой подход к хранению используется. Однако работа Сарки [26] доказывает жизнеспособность использования поля XML вместо реляционных таблиц EAV, специфичных для конкретного типа, для слоя хранения данных, и в ситуациях, когда количество атрибутов на сущность невелико (например, переменные атрибуты продукта для разных типов продуктов), решение на основе XML более компактно, чем решение на основе таблицы EAV. (Сам XML можно рассматривать как средство представления данных атрибут-значение, хотя он основан на структурированном тексте, а не на реляционных таблицах.)
Существует несколько других подходов к представлению древовидных данных, будь то XML , JSON или другие форматы, такие как вложенная модель набора , в реляционной базе данных. С другой стороны, поставщики баз данных начали включать поддержку JSON и XML в свои структуры данных и функции запросов, как в IBM Db2 , где данные XML хранятся как XML отдельно от таблиц, используя запросы XPath как часть операторов SQL, или в PostgreSQL , с типом данных JSON [28] , который можно индексировать и запрашивать. Эти разработки дополняют, улучшают или заменяют подход модели EAV.
Использование JSON и XML не обязательно совпадает с использованием модели EAV, хотя они могут пересекаться. XML предпочтительнее EAV для произвольно иерархических данных, которые относительно скромны по объему для одной сущности: он не предназначен для масштабирования до уровня нескольких гигабайт в отношении производительности манипулирования данными. [ требуется ссылка ] XML сам по себе не связан с проблемой разреженных атрибутов, и когда модель данных, лежащая в основе представляемой информации, может быть напрямую разложена в реляционную структуру, XML лучше подходит как средство обмена данными, чем как основной механизм хранения. EAV, как было сказано ранее, специально (и только) применим к сценарию разреженных атрибутов. Когда такой сценарий имеет место, использование таблиц атрибутов-значений, специфичных для типа данных, которые можно индексировать по сущности, по атрибуту и по значению и манипулировать с помощью простых операторов SQL, гораздо более масштабируемо, чем использование древовидной структуры XML. [ необходима цитата ] Упомянутый выше Google App Engine [ необходима цитата ] использует таблицы со строго типизированными значениями по веской причине. [ необходима цитата ]
Альтернативный подход к управлению различными проблемами, возникающими с данными, структурированными в EAV, заключается в использовании графовой базы данных . Они представляют сущности как узлы графа или гиперграфа , а атрибуты как связи или ребра этого графа. Проблема соединений таблиц решается путем предоставления языков запросов, специфичных для графов, таких как Apache TinkerPop, [29] или сопоставитель шаблонов атомного пространства OpenCog . [30]
Другой альтернативой является использование хранилища SPARQL .
PostgreSQL версии 9.4 включает поддержку бинарных столбцов JSON (JSONB), которые можно запрашивать, индексировать и объединять. Это позволяет повысить производительность в тысячу и более раз по сравнению с традиционными конструкциями таблиц EAV. [27]
Схема БД на основе JSONB всегда имеет меньше таблиц: можно вкладывать пары атрибут-значение в поля типа JSONB таблицы Entity. Это делает схему БД простой для понимания и SQL-запросы лаконичными. [31] Программный код для манипулирования объектами базы данных на уровне абстракции получается намного короче. [32]
Microsoft SQL Server 2008 предлагает (собственную) альтернативу EAV. [33] Столбцы с атомарным типом данных (например, числовые, varchar или datetime столбцы) можно обозначить как разреженные , просто включив слово SPARSE в определение столбца оператора CREATE TABLE. Разреженные столбцы оптимизируют хранение значений NULL (которые теперь вообще не занимают места) и полезны, когда большинство записей в таблице будут иметь значения NULL для этого столбца. Индексы по разреженным столбцам также оптимизируются: индексируются только те строки со значениями. Кроме того, содержимое всех разреженных столбцов в определенной строке таблицы может быть коллективно объединено в один столбец XML (набор столбцов), содержимое которого имеет форму [<column-name>column contents </column-name>]*....
Фактически, если набор столбцов определен для таблицы как часть оператора CREATE TABLE, все разреженные столбцы, определенные впоследствии, обычно добавляются к нему. Это имеет интересное последствие, заключающееся в том, что оператор SQL SELECT * from <tablename>
не будет возвращать отдельные разреженные столбцы, а объединит их все в один столбец XML, имя которого совпадает с именем набора столбцов (который, таким образом, действует как виртуальный вычисляемый столбец). Разреженные столбцы удобны для бизнес-приложений, таких как информация о продукте, где применимые атрибуты могут сильно варьироваться в зависимости от типа продукта, но где общее количество переменных атрибутов на тип продукта относительно скромное.
Однако этот подход к моделированию разреженных атрибутов имеет несколько ограничений: конкурирующие СУБД, в частности, решили не заимствовать эту идею для своих собственных движков. Ограничения включают:
Многие поставщики облачных вычислений предлагают хранилища данных на основе модели EAV, где произвольное количество атрибутов может быть связано с заданной сущностью. Роджер Дженнингс приводит подробное сравнение [34] этих типов. В предложении Amazon, SimpleDB, тип данных ограничен строками, и данные, которые по своей сути не являются строками, должны быть приведены к строке (например, числа должны быть дополнены ведущими нулями), если вы хотите выполнить такие операции, как сортировка. Предложение Microsoft, Windows Azure Table Storage, предлагает ограниченный набор типов данных: byte[], bool, DateTime, double, Guid, int, long и string [1]. Google App Engine [2] предлагает наибольшее разнообразие типов данных: в дополнение к разделению числовых данных на int, long или float, он также определяет пользовательские типы данных, такие как номер телефона, адрес электронной почты, геокод и гиперссылка. Google, в отличие от Amazon или Microsoft, позволяет вам определять метаданные, которые предотвращают связывание недопустимых атрибутов с определенным классом сущностей, позволяя вам создавать модель метаданных.
Google позволяет вам работать с данными, используя подмножество SQL; Microsoft предлагает синтаксис запросов на основе URL, который абстрагируется через поставщика LINQ ; Amazon предлагает более ограниченный синтаксис. Беспокойство вызывает то, что встроенная поддержка объединения различных сущностей посредством объединений в настоящее время (апрель '10) отсутствует во всех трех движках. Такие операции должны выполняться кодом приложения. Это может не быть проблемой, если серверы приложений размещены совместно с серверами данных в центре обработки данных поставщика, но если бы они были географически разделены, возник бы большой сетевой трафик.
Подход EAV оправдан только тогда, когда моделируемые атрибуты многочисленны и редки: если собираемые данные не соответствуют этому требованию, подход EAV по умолчанию поставщиков облачных услуг часто не подходит для приложений, которым требуется настоящая внутренняя база данных (а не просто средство постоянного хранения данных). Модернизация подавляющего большинства существующих приложений баз данных, которые используют традиционный подход моделирования данных, в облачную архитектуру типа EAV потребовала бы серьезной хирургической операции. Например, Microsoft обнаружила, что ее база разработчиков приложений баз данных в значительной степени неохотно вкладывала такие усилия. Поэтому в 2010 году Microsoft запустила премиум-предложение SQL Server Azure, доступный из облака, полнофункциональный реляционный движок, который позволяет переносить существующие приложения баз данных с небольшими изменениями. По состоянию на начало 2020-х годов служба допускает стандартные размеры физических баз данных до 8 ТБ [35] , а также доступны «гипермасштабируемые» и «критически важные для бизнеса» предложения.