Скажем, вы собираете инсайдерскую информацию о предстоящих выпусках супергероев, и ваш главный фильм выглядит примерно так:
Таблица 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? У вас могут быть столбцы "Director", "Director_Source", "Leading Male", "Leading Male_Source" и т.д., Но это становится очень уродливым. Есть ли лучшее решение, о котором я не думаю?
Если я не уточнил ни одного вопроса, прокомментируйте, и я добавлю по мере необходимости. О да, и данные фильма, которые я использовал, сфабрикованы:)
Изменить: Чтобы кратко изложить мой основной вопрос, я хотел бы иметь простоту и истинную конструкцию RDBMS таблицы 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