Frage

Die wichtigsten Mangel mit Entity-Attribute-Value-Datenbank-Design in SQL alle scheinen in der Lage zu Abfrage und Bericht über die Daten effizient und schnell zu sehen. Die meisten Informationen las ich über das Thema warnen vor EAV aufgrund dieser Probleme der Umsetzung und die Gemeinsamkeit der Abfrage- / Reporting für fast alle Anwendungen.

Ich bin der Gestaltung derzeit ein System, in dem die Felder für eines der Unternehmen sind nicht auf Design / Kompilierung bekannt und werden durch den Endnutzer des Systems definiert. EAV scheint wie eine gute Passform für diese Anforderung aber aufgrund der Probleme, die ich über gelesen habe, bin ich zögerlich es bei der Umsetzung, da es auch einige ziemlich schwer sind Berichtsanforderungen für dieses System auch. I denken Ich habe um diese mit einer Art und Weise kommen aber möchte die Frage an die Gemeinschaft SO stellen.

Da die typische normalisierte Datenbank (OLTP) ist noch nicht immer die beste Option für die Erstellung von Berichten, scheint eine gute Praxis, einen „Reporting“ Datenbank (OLAP), wo die Daten aus der normalisierten Datenbank kopiert sein zu müssen, indiziert extensiv und möglicherweise für eine einfachere Abfrage denormalized. Könnte die gleiche Idee zu arbeiten rund um die Mängel eines EAV-Design verwendet werden?

Der größte Nachteil ich sehe, sind die erhöhte Komplexität die Daten von der EAV-Datenbank übertragen zu berichten, wie Sie am Ende mit können die Tabellen in der Berichtsdatenbank ändern als neue Felder in der EAV Datenbank definiert sind. Aber das ist kaum möglich und scheint von dem EAV-Design gegeben ein akzeptabler Kompromiss für die erhöhte Flexibilität zu sein. Dieser Nachteil besteht auch, wenn ich einen Nicht-SQL-Datenspeicher (d CouchDB oder ähnlich) für die Hauptdatenspeicher verwenden, da alle Standard-Reporting-Tools sind eine SQL-Backend-Abfrage erwartet.

Haben die Probleme mit EAV Systeme meist gehen weg, wenn Sie eine separate Reporting-Datenbank zur Abfrage haben?

EDIT: Danke für die Kommentare bisher. EAV mit für eines der Unternehmen, nicht alles im System Eines der wichtigsten Dinge über das System, das ich auf sie bin arbeiten, dass ich wirklich nur reden.

Der ganze Kern des Systems ist in der Lage sein, Daten zu ziehen, aus mehreren unterschiedlichen Quellen, die nicht bekannt sind, vor der Zeit und Crunch die Daten mit einigen „bekanntesten“ Daten über eine bestimmte Einheit zu kommen. Also jedes „Feld“ mit Ich bin der Umgang ist mehrwertig, und ich bin auch für jeden verfolgen Geschichte erforderlich. Das normalisierte Design für diese endet als 1 Tisch pro Feld, das es irgendwie schmerzhaft sowieso macht abfragt.

Hier sind die Tabellenschemata und Beispieldaten Ich betrachte (offensichtlich geändert, was ich arbeite, aber ich denke, es ist der Punkt zeigt gut):

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

Berichte Tabelle

Person_Denormalized
----------------------------------------------------------------------------------------
-  Id - Name      - HomeAddress   - HomeAddress_Confidence - HomeAddress_EffectiveDate - 
----------------------------------------------------------------------------------------
- 123 - Joe Smith - 123 Cherry Ln -                  0.713 -                2010-03-26 -
----------------------------------------------------------------------------------------

Normalized Design

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

Der „Confidence“ Feld ist hier Logik erzeugt unter Verwendung, die nicht leicht ausgedrückt werden kann (wenn überhaupt) mit SQL so meine häufigste Operation neben neuen Werten eingefügt wird für alle Felder auf alle Daten über eine Person Strang ziehen, damit ich die erzeugen kann Rekord für die Berichtstabelle. Dies ist eigentlich leichter in dem EAV-Modell, wie ich eine einzelne Abfrage tun. In dem normierten Design, ich am Ende tun 1 Abfrage pro Feld sie alle zusammen von der Teilnahme an ein massives Kreuzprodukt zu vermeiden.

War es hilfreich?

Lösung

Kurze Antwort -. Ja, eine Berichtsdatenbank ist ein vernünftiger Ansatz, um die Probleme der Berichterstattung von einem EAV-Datenmodell zur Lösung

verbrachte ich eine Reihe von Jahren mit einer Informations-Management-Lösung arbeiten, die Endanwendern völlige Freiheit erlaubt, ihr eigenes Datenmodell zu definieren, sowohl mit dem Schema und den Daten, die ein EAV-Modell gespeichert ist. Interessanterweise zur Verfügung gestellt dieses Produkt Meta-Schema Berichtsanforderungen erfüllen Objekte (zum Beispiel Graphen Objektnavigation zur Verfügung zu stellen, Ansichten Projektion durchzuführen, etc.). Dies bedeutet, dass der Endbenutzer war frei Abfragen zu definieren, die gleichen Begriffe und Konzepte verwenden, die sie benutzt hatten, das Datenmodell in erster Linie zu bauen. Der Akt der Berichterstattung war im Wesentlichen der Datenmenge zu berechnen, indem diese Definitionen der Navigation und geben Sie das Ergebnis über ein traditionelles Bericht Schreibwerkzeug, als ob es relationale Daten waren.

Eine der Stärken dieses Ansatzes war, dass der gleiche Mechanismus, der bereits an Ort und Stelle war das EAV-Modell der Benutzer mit könnten, um etwas zu verwandeln arbeiten könnte wiederverwendet und in der Reporting-Funktion angewandt werden.

Andere Tipps

  

In diesem Schema zuerst kommen wir mit einem System, das die Benutzer speichern, jede Art von Daten kann auch immer, unabhängig von seiner Struktur, und unabhängig von den künftigen Gebrauch bestimmt. Dann, wenn es Zeit für die Berichte aus zu bekommen, müssen wir herausfinden, was wir haben und wie diese bezieht sich auf das, was wir brauchen.

Da Sie deutlich die Art des Problems Attribut „in diesem Schema zu sein“, so scheint es mir wirklich, als ob das Problem mit EAV wirklich ist wegen EAV als solche.

In der Tat kommen, daran zu denken: „ein System, das die Benutzer speichern, jede Art von Daten kann auch immer“ die äquivalent ein System, mit dem Benutzer einfach ihre relvars definieren. Aber welcher Teil des Systems erlaubt die Benutzer Einschränkungen für jedes Attribut zu definieren? Hoppla, EAV Publikum scheint nicht so unwichtigen Aspekt der Datenverwaltung verpasst zu haben, wie es scheint ...

Das Problem mit EAV ist zu EAV als solche nicht fällig. Es ist aufgrund der Gestaltung und den Aufbau einer Datenbank, ohne zu verstehen, was die Datenanforderungen wirklich sind, und welche logische Struktur müssen die Daten haben, um diese Anforderungen zu erfüllen. EAV, und jedes andere System, dass die Benutzer eigene Daten können, schaltet sich diese auf den Kopf.

In diesem Schema zuerst kommen wir mit einem System, das die Benutzer speichern, jede Art von Daten kann auch immer, unabhängig von seiner Struktur, und unabhängig von den künftigen Gebrauch bestimmt. Dann, wenn es Zeit für die Berichte aus zu bekommen, müssen wir herausfinden, was wir haben und wie diese bezieht sich auf das, was wir brauchen.

Viel Glück damit.

Es gibt kein Problem mit EAV ich ziemlich viel Zeit anfragende von MASSIVER EAV Datenbanken verbringen. Jeder, der von EAV sagt Berichterstattung schwierig oder unmöglich ist, hat 1 von 2 Problemen, entweder sie haben ein sehr schlecht konzipiert EAV-System oder sie nicht verstehen, wie man Abfrage von einem. schöne Bericht-Lage, Daten aus einem EAV DB bekommen ist ganz einfach, wenn Sie es ein paar Mal gemacht haben. Es gibt keine Notwendigkeit für eine Berichtsdatenbank oder etwas Besonderes, nur ein paar gute Abfragen.

Wenn Sie einen EAV DB Gebäude sind verbringt viel Zeit entwerfen, das Design wird entweder Ihre Anwendung machen oder brechen und es wird ein Albtraum zu beheben oder Deal mit einem schlecht gestaltete einen Versuch sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top