Как устранить недостатки в составлении отчетов из базы данных EAV?

StackOverflow https://stackoverflow.com/questions/2523741

Вопрос

Все основные недостатки конструкций баз данных Entity-Attribute-Value в SQL, по-видимому, связаны с возможностью эффективного и быстрого выполнения запросов к данным и составления отчетов по ним.Большая часть информации, которую я прочитал по этому вопросу, предостерегает от внедрения EAV из-за этих проблем и общности запросов / отчетов почти для всех приложений.

В настоящее время я разрабатываю систему, в которой поля для одной из сущностей неизвестны во время разработки / компиляции и определяются конечным пользователем системы.EAV кажется подходящим для этого требования, но из-за проблем, о которых я читал, я не решаюсь его внедрять, поскольку для этой системы также существуют довольно жесткие требования к отчетности.Я подумай Я придумал способ обойти это, но хотел бы задать вопрос сообществу SO.

Учитывая, что типичная нормализованная база данных (OLTP) все еще не всегда является лучшим вариантом для запуска отчетов, хорошей практикой, по-видимому, является наличие базы данных "отчетов" (OLAP), куда данные из нормализованной базы данных копируются, тщательно индексируются и, возможно, денормализуются для упрощения запросов.Можно ли использовать ту же идею для устранения недостатков конструкции EAV?

Основным недостатком, который я вижу, является повышенная сложность передачи данных из базы данных EAV в reporting, поскольку в конечном итоге вам может потребоваться изменить таблицы в базе данных отчетов по мере определения новых полей в базе данных EAV.Но это вряд ли невозможно и представляется приемлемым компромиссом с повышенной гибкостью, обеспечиваемой конструкцией EAV.Этот недостаток также существует, если я использую хранилище данных, отличное от SQL (т.е.CouchDB или аналогичный) для основного хранилища данных, поскольку все стандартные инструменты отчетности ожидают, что серверная часть SQL будет запрашивать.

Устраняются ли проблемы с системами EAV в основном, если у вас есть отдельная база данных отчетов для запросов?

Редактировать:Спасибо за комментарии на данный момент.Одна из важных особенностей системы, над которой я работаю, заключается в том, что на самом деле я говорю только об использовании EAV для одной из сущностей, а не для всего в системе.

Вся суть системы заключается в том, чтобы иметь возможность извлекать данные из множества разрозненных источников, которые заранее неизвестны, и перерабатывать их, чтобы получить некоторые "наиболее известные" данные о конкретном объекте.Таким образом, каждое "поле", с которым я имею дело, многозначно, и я также обязан отслеживать историю для каждого.Нормализованный дизайн для этого в конечном итоге составляет 1 таблицу на поле, что в любом случае делает запрос к нему довольно болезненным.

Вот схемы таблиц и примеры данных, на которые я смотрю (очевидно, измененные по сравнению с тем, над чем я работаю, но я думаю, что это хорошо иллюстрирует суть):

Таблицы EAV

Person
-------------------
-  Id - Name      -
-------------------
- 123 - Joe Smith -
-------------------

Person_Value
-------------------------------------------------------------------
- PersonId - Source - Field       - Value         - EffectiveDate -
-------------------------------------------------------------------
-      123 -    CIA - HomeAddress - 123 Cherry Ln -    2010-03-26 -
-      123 -    DMV - HomeAddress - 561 Stoney Rd -    2010-02-15 -
-      123 -    FBI - HomeAddress - 676 Lancas Dr -    2010-03-01 -
-------------------------------------------------------------------

Отчетная таблица

Person_Denormalized
----------------------------------------------------------------------------------------
-  Id - Name      - HomeAddress   - HomeAddress_Confidence - HomeAddress_EffectiveDate - 
----------------------------------------------------------------------------------------
- 123 - Joe Smith - 123 Cherry Ln -                  0.713 -                2010-03-26 -
----------------------------------------------------------------------------------------

Нормализованный Дизайн

Person
-------------------
-  Id - Name      -
-------------------
- 123 - Joe Smith -
-------------------

Person_HomeAddress
------------------------------------------------------
- PersonId - Source - Value         - Effective Date - 
------------------------------------------------------
-      123 -    CIA - 123 Cherry Ln -     2010-03-26 -
-      123 -    DMV - 561 Stoney Rd -     2010-02-15 -
-      123 -    FBI - 676 Lancas Dr -     2010-03-01 -
------------------------------------------------------

Поле "Достоверность" здесь генерируется с использованием логики, которая не может быть легко выражена (если вообще может быть выражена) с использованием SQL, поэтому моей наиболее распространенной операцией, помимо вставки новых значений, будет извлечение ВСЕХ данных о человеке для всех полей, чтобы я мог сгенерировать запись для таблицы отчетов.Это на самом деле легче в модели EAV, поскольку я могу выполнить один запрос.В нормализованном дизайне мне в конечном итоге приходится выполнять по 1 запросу на поле, чтобы избежать объединения их всех массивным декартовым произведением.

Это было полезно?

Решение

Краткий ответ - да, база данных отчетов - это разумный подход к решению проблем отчетности на основе модели данных EAV.

Я провел несколько лет, работая с решением для управления информацией, которое позволяло конечным пользователям полную свободу определять свою собственную модель данных, используя как схему, так и данные, хранящиеся с использованием модели EAV.Интересно, что этот продукт предоставлял объекты мета-схемы, используемые для выполнения требований к отчетности (напримерграфики для обеспечения навигации по объектам, виды для выполнения проекции и т.д.).Это означало, что конечный пользователь мог свободно определять запросы, используя те же термины и концепции, которые они использовали для построения модели данных в первом экземпляре.Процесс составления отчета, по сути, состоял в том, чтобы вычислить набор данных путем навигации по этим определениям и передать результат традиционному инструменту написания отчета, как если бы это были реляционные данные.

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

Другие советы

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

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

На самом деле, если подумать об этом:"система, которая позволяет пользователям хранить любые данные вообще" - это эквивалент системы, которая позволяет пользователям просто определять свои переменные.Но какая часть этой системы позволяет пользователям определять ограничения для каждого атрибута?Упс, похоже, что аудитория EAV упустила из виду не такой уж и маловажный аспект управления данными...

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

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

Удачи вам с этим.

С EAV проблем нет, я трачу довольно много времени на запросы из МАССИВНЫХ баз данных EAV.Любой, кто говорит, что отправка отчетов из EAV затруднена или невозможна, имеет 1 из 2 проблем: либо у них очень плохо спроектированная система EAV, либо они не понимают, как запрашивать из нее.получить хорошие отчетные данные из базы данных EAV довольно просто, если вы проделаете это несколько раз.Нет необходимости в базе данных отчетов или чем-то особенном, достаточно нескольких хороших запросов.

Если вы при создании базы данных EAV тратите МНОГО времени на ее разработку, дизайн либо создаст, либо сломает ваше приложение, и попытки исправить или разобраться с плохо разработанным приложением станут сущим кошмаром.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top