Die Hauptmängel bei Entity-Attribute-Value-Datenbankentwürfen in SQL scheinen alle damit verbunden zu sein, die Daten effizient und schnell abfragen und melden zu können. Die meisten Informationen, die ich zu diesem Thema gelesen habe, warnen vor der Implementierung von EAV aufgrund dieser Probleme und der Gemeinsamkeit von Abfragen/Berichten für fast alle Anwendungen.Wie man Mängel in der Berichterstattung von EAV-Datenbank zu überwinden?
Ich entwerfe gerade ein System, bei dem die Felder für eine der Entitäten zur Design-/Kompilierzeit nicht bekannt sind und vom Endbenutzer des Systems definiert werden. EAV scheint für diese Anforderung gut geeignet zu sein, aber aufgrund der Probleme, über die ich gelesen habe, zögere ich bei der Implementierung, da auch für dieses System einige ziemlich umfangreiche Berichtsanforderungen bestehen. I denke, Ich habe einen Weg gefunden, um diese Frage, aber möchte die SO-Community stellen.
Da die typische normalisierte Datenbank (OLTP) immer noch nicht die beste Option zum Ausführen von Berichten ist, scheint eine "Reporting" -Datenbank (OLAP), in die die Daten aus der normalisierten Datenbank kopiert werden, ausführlich indexiert und möglicherweise für eine einfachere Abfrage denormalisiert. Könnte die gleiche Idee verwendet werden, um die Mängel eines EAV-Designs zu umgehen? Der Hauptnachteil, den ich sehe, ist die erhöhte Komplexität der Übertragung der Daten von der EAV-Datenbank zum Reporting, da Sie am Ende die Tabellen in der Berichtsdatenbank ändern müssen, wenn neue Felder in der EAV-Datenbank definiert werden. Aber das ist kaum unmöglich und scheint ein akzeptabler Kompromiss für die erhöhte Flexibilität zu sein, die das EAV-Design bietet. Dieser Nachteil besteht auch, wenn ich einen Nicht-SQL-Datenspeicher (z. B. CouchDB oder Ähnliches) für den Hauptdatenspeicher verwende, da alle Standardberichterstellungstools erwarten, dass ein SQL-Backend abfragt.
Sind die Probleme mit EAV-Systemen meist weg, wenn Sie eine separate Berichtsdatenbank für die Abfrage haben?
EDIT: Danke für die Kommentare so weit. Eines der wichtigen Dinge an dem System, an dem ich gerade arbeite, ist, dass ich wirklich nur davon spreche, EAV für eine der Entitäten zu verwenden, nicht für alles im System.
Der Kern des Systems besteht darin, Daten aus verschiedenen Quellen, die nicht vorher bekannt sind, zu extrahieren und die Daten zu knacken, um einige "bekannteste" Daten über eine bestimmte Entität zu erhalten. Also ist jedes "Feld", mit dem ich es zu tun habe, mehrwertig und ich muss auch die Geschichte für jeden verfolgen. Der normalisierte Entwurf für diese endet, 1 Tabelle pro Feld zu sein, das die Frage irgendwie irgendwie schmerzhaft macht.
Hier sind die Tabellenschemata und Beispieldaten Ich betrachte (offensichtlich geändert, was ich arbeite, aber ich denke, es ist der Punkt gut illustriert):
EAV Tabellen
Person
-------------------
- Id - Name -
-------------------
- 123 - Joe Smith -
-------------------
Person_Value
-------------------------------------------------------------------
- PersonId - Source - Field - Value - EffectiveDate -
-------------------------------------------------------------------
- 123 - CIA - HomeAddress - 123 Cherry Ln - 2010-03-26 -
- 123 - DMV - HomeAddress - 561 Stoney Rd - 2010-02-15 -
- 123 - FBI - HomeAddress - 676 Lancas Dr - 2010-03-01 -
-------------------------------------------------------------------
Berichtstabelle
Person_Denormalized
----------------------------------------------------------------------------------------
- Id - Name - HomeAddress - HomeAddress_Confidence - HomeAddress_EffectiveDate -
----------------------------------------------------------------------------------------
- 123 - Joe Smith - 123 Cherry Ln - 0.713 - 2010-03-26 -
----------------------------------------------------------------------------------------
Normalisierten Entwurf
Person
-------------------
- Id - Name -
-------------------
- 123 - Joe Smith -
-------------------
Person_HomeAddress
------------------------------------------------------
- PersonId - Source - Value - Effective Date -
------------------------------------------------------
- 123 - CIA - 123 Cherry Ln - 2010-03-26 -
- 123 - DMV - 561 Stoney Rd - 2010-02-15 -
- 123 - FBI - 676 Lancas Dr - 2010-03-01 -
------------------------------------------------------
Das „Confidence“ Feld hier erzeugt wird, unter Verwendung von Logik, die nicht so leicht ausgedrückt werden kann (wenn überhaupt) neue Werte SQL so meine häufigste Operation unter Verwendung neben Einfügen werden alle Daten über eine Person Strang ziehen für alle Felder, damit ich den Datensatz für die Berichtstabelle generieren kann.Das ist eigentlich einfacher im EAV-Modell, da ich eine einzige Abfrage ausführen kann. Im normalisierten Design muss ich schließlich 1 Abfrage pro Feld durchführen, um zu vermeiden, dass ein riesiges kartesisches Produkt alle zusammenfügt.
Speichern von Informationen in XML wäre besser. Wie Sie es immer mit XQuery über SQL abfragen können. Das haben wir erfolgreich für unsere Anwendung getan. – Fahad