Как хранить метаданные на столбцах

Допустим, вы собираете инсайдерскую информацию о предстоящих выпусках фильмов о супергероях, и ваша главная таблица фильмов выглядит примерно так:

Table 1

<code>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
</code>

В целом, это должно работать очень хорошо и обеспечивать очень простые запросы, а также сравнение между строками.

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

Table 2

<code>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
...
</code>

Который, хотя он легко захватывает метаданные, которые мы хотели, делает запросы сложнее. Требуется немного больше, чтобы просто получить все основные данные одного фильма. Точнее, здесь вам нужно разобраться с четырьмя строками, чтобы получить четыре важных лакомых кусочка информации о Зеленом фонаре, а в таблице 1 это единственная, красиво инкапсулированная строка.

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

Table 3

<code>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
...
</code>

Но это очень опасно, потому что если кто-то изменит имя столбца в таблице 1, например & quot; Злодей & quot; «первичному злодею»; строка в таблице 3 будет по-прежнему просто "злодей" и, таким образом, связанные данные, к сожалению, будут отделены. Это может помочь, если атрибут "quot; attribute" quot; Столбец был связан с другой таблицей, которая служила перечислением столбцов таблицы 1. Конечно, администратор БД будет нести ответственность за ведение этой таблицы перечисления, чтобы она соответствовала фактическим столбцам таблицы 1. И это может быть даже возможно улучшить кроме того, вместо создания таблицы перечисления вручную, используйте системное представление в SQL Server, в котором хранятся имена столбцов в таблице 1. Хотя я не уверен, что вы можете иметь отношения, которые включают системные представления.

Что ты предлагаешь? EAV единственный путь?

А что, если это был только один столбец метаданных (просто «Источник» без «Журналист») - все равно необходимо идти по маршруту EAV? У вас могут быть столбцы & quot; Директор, & quot; & Quot; Director_Source, & Quot; "Ведущий мужчина" & quot; Leading Male_Source, & quot; и т.д., но это становится ужасно очень быстро. Есть ли какое-то лучшее решение, о котором я не думаю?

Если я не прояснил какой-либо пункт, прокомментируйте, и я добавлю больше по мере необходимости. О да, и данные фильма, которые я использовал, сфабрикованы :)

Изменить: для краткого изложения моего основного вопроса, я хотел бы иметь простоту и истинный дизайн РСУБД в таблице 1, которая действительно хорошо описывает запись фильма, при этом сохраняя метаданные о атрибутах безопасным и доступным способом. Это возможно? Или EAV единственный путь?

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

Update

Использование дизайна таблицы 2, за исключением переименования столбца «Фильм» на "Имя" и вызов всей таблицы "Кино" Вот операция поворота в SQL Server 2008 для возврата в таблицу 1:

<code>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
</code>

Ответы на вопрос(9)

Ваш ответ на вопрос