2

Как другие используют инструменты реляционного моделирования для сопоставления логической модели или одной в третьей нормальной форме с базой данных, использующей EAV?Моделирование данных для EAV

+2

EAV? Убегай! ;-) http://tonyandrews.blogspot.com/2004/10/otlt-and-eav-two-big-design-mistakes.html –

+1

Итак, что именно _is_ правильный способ реализации произвольных столбцов, если вы не можете использовать EAV? –

+1

Используйте базу данных, предназначенную для модели EAV, а не для реляционной базы данных. –

ответ

7

EAV - это нереляционный дизайн. Вы не можете достичь любых нормальных форм с EAV, потому что это не может быть отношением.

EAV - это пример противотанкового устройства Inner-Platform Effect.

Если вам нужно много атрибутов, вы можете рассмотреть serializing to a blob XML и хранить этот XML в столбце CLOB.

+1

Мне нравится ответ Билла, как я почти всегда делаю. Но я пойду немного дальше. Я отказываюсь полагать, что каждый объект в вашей базе данных не имеет столбцов. Даже если это только имя, insert_Dt, insert_user и т. Д. После извлечения всех общих полей, используйте XML. –

+0

@Stephanie Page: +1 Я согласен с тем, что XML для динамических атрибутов (или JSON или YAML или некоторых таких) предпочтительнее использовать EAV. –

+0

Я также написал блог о том, почему EAV не может быть отношением, и обсуждение в комментариях было буйным: http://karwin.blogspot.com/2009/05/eav-fail.html –

1

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

EAV может быть создан в моделировании логических данных и в реляционных. Это может быть сделано с тремя связанными объектами или таблицами:

  • Базовый объект (такой как клиент), который аналогичен семейству столбцов.
  • Объект типа «тип», который описывает атрибут и его характеристики, такие как сумма чистой стоимости,
  • Объект «значение», который присваивает атрибут экземпляру базового объекта и дает ему значение.

Базовый объект - это объект, который имеет различные характеристики.

«Тип» - это просто таблица кодов, идентифицированная кодом типа и содержащая описание и другие характеристики домена. Домен относится к типу данных, длине, значению и единицам измерения и т. Д. Он описывает атрибут вне контекста (т. Е. Неназначенный). Примером может служить сумма Net Worth Amount, которая является цифрой номер 8 с 2 десятичными знаками, с правом выравнивания, а ее описание представляет собой «значение, представляющее общую финансовую стоимость клиента, включая ликвидные и неликвидные суммы».

Объект «значение» является ассоциативной сущностью или таблицей, идентифицированной идентификатором клиента и кодом типа атрибута [оба внешних ключа], который имеет атрибут value, который присваивает Клиенту тип суммы чистой стоимости и дает ему например, «2 000 000 долларов». В столбце значения часто указывается общее имя, такое как поле.

Однако в SQL пары именных значений несколько сложно запросить и, как правило, не работают должным образом. Скажем, что объект «значение» имеет атрибут «Поле». Это символьная строка. Обычно SQL использует имя столбца для заголовков набора результатов. Скажем, что у поля есть Net Worth. Но когда он отображается, заголовок будет называться «Поле», а не «Нет». Поле - это фактическое имя столбца. Для получения желаемого заголовка требуется расширенный SQL. Эта проблема может быть решена путем денормализации объектов типа и «значения» в один. Вместо трех таблиц у вас есть две - одна ко многим, базовая таблица и таблица значений. Фактически, это, по сути, то, как это делает Cassandra: столбцы в семействе столбцов являются полностью сплюснутой парой атрибута-значения. Даже если вы денормализуете в реляционной, столбец «field» по-прежнему называется «поле».

Вы можете также сгладить (денормализовать) три объекта в одной таблице в реляционном, но возникнут проблемы с резервированием: идентификатор клиента [FK], код типа атрибута [FK], атрибуты базы данных клиента, атрибуты типа атрибута, Поле (для значений). Я не советую; Я просто сказал.

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

+0

Обязательное чтение, чтобы проиллюстрировать точку вашего последнего абзаца: http://www.simple-talk.com/opinion/opinion-pieces/bad -carma / –

Смежные вопросы