Speichern von Metadaten in Spalten

Angenommen, Sie sammeln Insider-Informationen zu kommenden Superhelden-Filmen, und Ihr Hauptfilm sieht ungefähr so ​​aus:

Tabelle 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>

Dies sollte im Allgemeinen sehr gut funktionieren und sehr einfache Abfragen sowie Vergleiche zwischen Zeilen ermöglichen.

Sie möchten jedoch die Quelle jedes Datenfakts sowie den Namen des Journalisten verfolgen, der den Fakt entdeckt hat. Dies scheint auf eine Art zu hindeutenEAV Tabelle wie folgt:

Tabelle 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>

Dies macht Abfragen schwieriger, obwohl die gewünschten Metadaten problemlos erfasst werden können. Es dauert etwas länger, einfach alle grundlegenden Daten eines einzelnen Films abzurufen. Insbesondere müssen Sie sich hier mit vier Zeilen befassen, um die vier wichtigen Informationen über die Grüne Laterne zu erhalten, während es sich in Tabelle 1 um eine einzelne, gut gekapselte Zeile handelt.

Meine Frage ist also, in Anbetracht der Komplikationen, die ich gerade beschrieben habe, und weil ich weiß, dass EAV-Tabellen vermieden werden müssen, ist der EAV immer noch die beste Lösung? Anscheinend ist dies die einzig sinnvolle Möglichkeit, diese Daten darzustellen. Die einzige andere Alternative, die ich sehe, ist die Verwendung von Tabelle 1 in Verbindung mit einer anderen, dienur beherbergt Metadaten wie diese:

Tisch 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>

Dies ist jedoch sehr gefährlich, da bei einer Änderung eines Spaltennamens in Tabelle 1, z. B. "Villain" in "Primary Villain", in der Zeile in Tabelle 3 immer noch nur "Villain" steht und daher die zugehörigen Daten leider entkoppelt werden. Dies könnte hilfreich sein, wenn die Spalte "attribute" mit einer anderen Tabelle verknüpft wäre, die als Aufzählung der Spalten von Tabelle 1 dient. Natürlich wäre der DBA dafür verantwortlich, diese Aufzählungstabelle so zu verwalten, dass sie mit den tatsächlichen Spalten von Tabelle 1 übereinstimmt Möglicherweise können Sie dies sogar noch verbessern, indem Sie die Aufzählungstabelle nicht manuell erstellen, sondern eine Systemansicht in SQL Server verwenden, in der die Namen der Spalten in Tabelle 1 enthalten sind. Ich bin mir jedoch nicht sicher, ob Sie Beziehungen mit einbeziehen können Systemansichten.

Was schlagen Sie vor? Ist die EAV der einzige Weg?

Und was ist, wenn es sich nur um eine Metadatenspalte handelt (nur "Quelle" ohne "Journalist") - ist es dennoch erforderlich, die EAV-Route zu wählen? Sie könnten Spalten "Director", "Director_Source", "Leading Male", "Leading Male_Source" usw. haben, aber das wird sehr schnell hässlich. Gibt es eine bessere Lösung, an die ich nicht denke?

Wenn ich noch keinen Punkt geklärt habe, kommentieren Sie ihn bitte und ich füge bei Bedarf weitere hinzu. Oh ja, und die Filmdaten, die ich verwendet habe, wurden fabriziert :)

Bearbeiten: Um meine Hauptfrage kurz zu formulieren, möchte ich die Einfachheit und das echte RDBMS-Design von Tabelle 1 haben, die einen Filmeintrag wirklich gut beschreibt, während die Metadaten zu den Attributen auf sichere und zugängliche Weise gespeichert werden. Ist das möglich? Oder ist EAV der einzige Weg?

Bearbeiten 2: Nachdem ich einige Web-Recherchen durchgeführt habe, muss ich noch eine Diskussion über EAVs finden, die sich auf den Wunsch konzentriert, Metadaten in den Spalten zu speichern. Der Hauptgrund für die Implementierung eines EAV sind fast immer dynamische und unvorhersehbare Spalten, was in meinem Beispiel nicht der Fall ist. In meinem Beispiel gibt es immer die gleichen vier Spalten: Regisseur, führender Mann, führender Frau, Bösewicht. Ich möchte jedoch bestimmte Fakten (Quelle und Journalist) zu jeder Spalte für jede Zeile speichern. Eine EAV würde dies erleichtern, aber ich würde es gerne vermeiden, darauf zurückzugreifen.

Aktualisieren

Wenn Sie den Entwurf für Tabelle 2 verwenden, außer dass Sie die Spalte "Movie" in "Name" umbenennen und die gesamte Tabelle "Movie" aufrufen, ist dies der Pivot-Vorgang in SQL Server 2008, um Tabelle 1 wiederherzustellen:

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

Antworten auf die Frage(9)

Ihre Antwort auf die Frage