Допустим, вы собираете инсайдерскую информацию о предстоящих выпусках фильмов о супергероях, и ваш основной стол фильма выглядит примерно так:
Таблица 1
Title Director Leading Male Leading Female Villain
--------------------------------------------------------------------------
Green Lantern Kubrick Robert Redford Miley Cyrus Hugh Grant
The Tick Mel Gibson Kevin Sorbo Linda Hunt Anthony Hopkins
В целом, это должно работать очень хорошо и разрешать очень простые запросы, а также сравнение между строками.
Однако вы хотели бы отследить источник каждого факта данных, а также имя журналиста, который обнаружил этот факт. Похоже, это предполагает какую-то таблицу EAV , например:
Таблица 2
Movie Attribute Value Source Journalist
----------------------------------------------------------------------------------
Green Lantern Director Kubrick CHUD Sarah
Green Lantern Leading Male Robert Redford CHUD James
Green Lantern Leading Female Miley Cyrus Dark Horizons James
Green Lantern Villain Hugh Grant CHUD Sarah
The Tick Director Mel Gibson Yahoo Cameron
...
Что, хотя и легко захватывает метаданные, которые мы хотели, делает запросы более сложными. Требуется немного больше, чтобы просто получить все основные данные одного фильма. Точнее, здесь вам нужно разобраться с четырьмя строками, чтобы получить четыре важных лакомых кусочка информации о Зеленом фонаре, тогда как в таблице 1 это одна, красиво инкапсулированная строка.
Итак, мой вопрос в свете описанных мною сложностей, и, поскольку я знаю, что в целом таблиц EAV следует избегать, является ли EAV по-прежнему лучшим решением? Похоже, что это единственный разумный способ представления этих данных. Единственная альтернатива, которую я вижу, состоит в том, чтобы использовать таблицу 1 в сочетании с другой таблицей, в которой only содержит метаданные, подобные этому:
Таблица 3
Movie Attribute Source Journalist
----------------------------------------------------------------------------------
Green Lantern Director CHUD Sarah
Green Lantern Leading Male CHUD James
Green Lantern Leading Female Dark Horizons James
Green Lantern Villain CHUD Sarah
The Tick Director Yahoo Cameron
...
Но это очень опасно, потому что если кто-то изменит имя столбца в таблице 1, например, «Злодей» на «Первичный злодей», строка в таблице 3 все равно будет просто сказать «Злодей», и, таким образом, связанные данные, к сожалению, будут отделены , Это могло бы помочь, если бы столбец «атрибута» был связан с другой таблицей, которая служила перечислением столбцов таблицы 1. Конечно, администратор БД будет отвечать за поддержание этой таблицы перечисления для соответствия фактическим столбцам таблицы 1. И на самом деле можно улучшить это еще больше, вместо того чтобы создавать таблицу перечисления вручную, используйте системное представление в SQL Server, в котором хранятся имена столбцов в таблице 1. Хотя я не уверен, что вы можете иметь отношения, которые включают Системные представления.
Что вы предлагаете? EAV - единственный путь?
А что, если это был только один столбец метаданных (просто «Источник» без «Журналист») - все равно необходимо идти по маршруту EAV? У вас могут быть столбцы «Директор», «Директор_источник», «Ведущий мужчина», «Ведущий мужчина_источник» и т. Д., Но это становится очень быстро. Есть ли какое-то лучшее решение, о котором я не думаю?
Если я не уточнил какой-либо вопрос, пожалуйста, прокомментируйте, и я добавлю больше по мере необходимости. О да, и данные фильма, которые я использовал, сфабрикованы:)
Редактировать: Для краткого изложения моего основного вопроса я хотел бы иметь простоту и истинный дизайн СУБД таблицы 1, которая действительно хорошо описывает запись фильма, сохраняя при этом метаданные по атрибутам в надежном и доступном месте. манера. Это возможно? Или EAV единственный путь?
Редактировать 2: Проведя еще несколько исследований в Интернете, мне еще предстоит найти обсуждение EAV, которое было сосредоточено вокруг желания хранить метаданные в столбцах. Основная причина, по которой приводится реализация EAV, - это почти всегда динамические и непредсказуемые столбцы, что в моем примере не так. В моем примере всегда присутствуют четыре одинаковые колонки: директор, ведущий мужчина, ведущая женщина, злодей. Однако я хочу хранить определенные факты (источник и журналист) о каждом столбце для каждой строки. EAV будет способствовать этому, но я бы хотел не прибегать к этому.
Обновление
Используя схему Таблицы 2, за исключением переименования столбца «Фильм» в «Имя» и вызова всей таблицы «Фильм», здесь выполняется операция поворота в SQL Server 2008 для возврата в Таблицу 1:
SELECT Name, [Director], [Leading Male], [Leading Female], [Villain]
FROM (Select Name, Attribute, Value FROM Movie) as src
PIVOT
(
Max(Value)
FOR Attribute IN ([Director], [Leading Male], [Leading Female], [Villain])
) AS PivotTable