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>