Nehmen wir an, die Produktentität des Shops weist gemeinsame Merkmale wie Name, Beschreibung, Bild, Preis usw. auf, die an vielen Orten an der Logik beteiligt sind und (halb) einzigartige Merkmale aufweisen, wie Uhr und Wasserball, die durch ganz unterschiedliche Aspekte beschrieben werden würden . Ich denke also, dass EAV für die Speicherung dieser (halb-) einzigartigen Funktionen geeignet wäre?
Die Verwendung einer EAV-Struktur für hat mehrere Auswirkungen, die Kompromisse darstellen.
Sie tauschen weniger Platz für die Zeile aus, weil Sie nicht über 100 Spalten verfügen, die null
für komplexere Abfragen und Modelle stehen.
Ein EAV zu haben bedeutet normalerweise, dass der Wert eine Zeichenfolge ist, in die man beliebige Daten einfügen kann. Dies hat dann Auswirkungen auf die Gültigkeits- und Beschränkungsprüfung. Betrachten Sie die Situation, in der Sie die Anzahl der verwendeten Batterien in die EAV-Tabelle eingetragen haben. Sie möchten eine Taschenlampe finden, die Batterien der Größe C verwendet, aber weniger als 4 davon.
select P.sku
from
products P
attrib Ab on (P.sku = Ab.sku and Ab.key = "batteries")
attrib Ac on (P.sku = Ac.sku and Ac.key = "count")
where
cast(Ac.value as int) < 4
and Ab.value = 'C'
...
Hier ist zu beachten, dass Sie keinen vernünftigen Index für den Wert verwenden können. Sie können auch nicht verhindern, dass jemand etwas eingibt, das dort keine Ganzzahl ist, oder eine ungültige Ganzzahl (verwendet '-1' Batterien), da die Wertespalte immer wieder für andere Zwecke verwendet wird.
Dies hat dann Auswirkungen auf den Versuch, ein Modell für das Produkt zu schreiben. Hier finden Sie die schöne typisierten Werte haben ... aber du bist auch ein haben , Map<String,String>
gerade dort mit allen möglichen Sitz Sachen drin. Dies hat dann weitere Auswirkungen auf die Serialisierung in XML oder Json und die Komplexität des Versuchs, Validierungen oder Abfragen für diese Strukturen durchzuführen .
Einige Alternativen oder Modifikationen des zu berücksichtigenden Musters bestehen darin, anstelle eines Freiformschlüssels eine andere Tabelle mit gültigen Schlüsseln zu haben. Dies bedeutet, dass Sie anstelle von Zeichenfolgenvergleichen in der Datenbank die Gleichheit von Fremdschlüssel-IDs überprüfen. Das Ändern des Schlüssels selbst erfolgt an einer Stelle. Sie haben einen bekannten Satz von Schlüsseln, was bedeutet, dass sie als Aufzählung durchgeführt werden können.
Sie können auch verknüpfte Tabellen haben, die Attribute einer bestimmten Produktklasse enthalten. Eine Lebensmittelabteilung könnte einen anderen Tisch haben, dem mehrere Attribute zugeordnet sind, die das Baumaterial nicht benötigt (und umgekehrt).
+----------+ +--------+ +---------+
|Grocery | |Product | |BuildMat |
|id (fk) +--->|id (pk) |<---+id (fk) |
|expiration| |desc | |material |
|... | |img | |... |
+----------+ |price | +---------+
|... |
+--------+
Es gibt Zeiten, in denen besonders eine EAV-Tabelle erforderlich ist.
Stellen Sie sich vor, Sie schreiben nicht nur ein Inventarsystem für Ihr Unternehmen, in dem Sie jedes Produkt und jedes Attribut kennen. Sie schreiben jetzt ein Inventarsystem, um es an andere Unternehmen zu verkaufen. Sie können nicht jedes Attribut jedes Produkts kennen - sie müssen sie definieren.
Eine Idee, die herauskommt, ist "wir lassen den Kunden die Tabelle modifizieren", und das ist nur schlecht (Sie kommen in die Metaprogrammierung für Tabellenstrukturen, weil Sie nicht mehr wissen, wo sich diese befinden, sie können die Struktur auf königliche Weise durcheinander bringen oder beschädigt werden In der Anwendung haben sie Zugriff darauf, um falsche Dinge zu tun, und die Auswirkungen dieses Zugriffs werden erheblich. In MVC4 gibt es mehr zu diesem Pfad : Wie erstelle ich ein Modell zur Laufzeit?
Stattdessen erstellen Sie die Verwaltungsschnittstelle zu einer EAV-Tabelle und lassen zu, dass diese verwendet wird. Wenn der Kunde einen Eintrag für 'Polkadots' erstellen möchte, wird dieser in die EAV-Tabelle eingetragen, und Sie wissen bereits, wie Sie damit umgehen müssen.
Ein Beispiel hierfür ist im Datenbankmodell für Redmine zu sehen. Sie können die Tabelle custom_fields und die Tabelle custom_values sehen. Dies sind Teile des EAV, mit denen das System erweitert werden kann.
Beachten Sie, dass Sie sich die KV-Variante von NoSQL (Cassandra, Redis, Mongo, ...) ansehen sollten, wenn Ihre gesamte Tabellenstruktur eher wie EAV als wie relational aussieht . Beachten Sie, dass diese häufig mit anderen Kompromissen in ihrem Design einhergehen, die möglicherweise nicht dem entsprechen, wofür Sie sie verwenden. Sie sind jedoch speziell mit der Absicht einer EAV-Struktur entworfen.
Möglicherweise möchten Sie SQL vs NoSQL für ein Bestandsverwaltungssystem lesen
Wenn Sie diesem Ansatz mit einer dokumentenorientierten NoSQL-Datenbank (couch, mongo) folgen, können Sie jedes Inventarelement als Dokument auf einer Festplatte betrachten. Das Aufrufen aller Elemente in einem einzelnen Dokument geht schnell. Darüber hinaus ist das Dokument so strukturiert, dass Sie jede einzelne Sache schnell herausziehen können. Auf der anderen Seite kann das Durchsuchen aller Dokumente nach Dingen, die einem bestimmten Attribut entsprechen, eine geringere Leistung haben (vergleiche 'grep' mit allen Dateien) ... es ist alles ein Kompromiss.
Ein anderer Ansatz wäre LDAP, bei dem eine Basis mit allen zugehörigen Elementen vorhanden ist, auf die dann jedoch auch zusätzliche Objektklassen für die anderen Elementtypen angewendet werden. (siehe Systeminventarisierung mit LDAP )
Wenn Sie diesen Weg einmal eingeschlagen haben, werden Sie vielleicht etwas finden, das genau zu dem passt, wonach Sie suchen ... obwohl alles mit gewissen Kompromissen verbunden ist.