2010-12-17 5 views
3

Können Sie bitte sagen, wie Sie Werte von Attributen unterschiedlichen Typs als EAV speichern? Ich sehe jetzt 3 Optionen. 1. Um in einer Tabelle in verschiedenen Feldern zu speichern: entity_id attribute_id string_value number_value date_value. 2. Um Werte verschiedener Attributtypen in verschiedenen Tabellen zu speichern, z. B. string_attribute_values, numeric_attribute_values, date_attribute_values. 3. Speichern von Werten aller Typen als VARCHAR, aber diese Variante scheint unpassend, weil es z. B. durch Zahlenwert schwierig ist, sie zu filtern (sie werden als Strings verglichen) und lassen Sie beispielsweise Buchstaben in die Felder eingeben nur Ziffern sollten sein.Wie werden Werte von Attributen unterschiedlichen Typs als EAV gespeichert?

Ich nehme an, ich brauche jetzt: string, numeric (integer) und date type, aber vielleicht andere Typen erscheinen später.

Vielen Dank.

+0

Option 3 werden Sie auch Probleme geben, wenn es kommt zum Sortieren, ganz zu schweigen von der Leistungseinbuße, die man für jeden Wert von varchar in den richtigen Typ umwandeln muß. Wir versuchen unser erstes EAV-Design und wir gehen mit Option 2 – Kyle

+0

Ich versuche auch, mit Option 2 zu gehen. – Oleg

Antwort

1

In der RDBMS-Community ist EAV ein Antipattern. Für die "infinite Flexibilität", die durch die Verwendung von EAV erhalten wird, ist das SQL, das benötigt wird, um die Daten als Datensätze/Objekte zu rekonstruieren, wesentlich komplexer. Sie erhalten auch den "Vorteil", dass Sie keine der verfügbaren Datenintegritätstools verwenden können (Fremdschlüssel, Prüfbedingungen usw.). Im Laufe der Zeit bricht dieses Design unter seinem eigenen Gewicht zusammen.

Wenn Sie einen Anwendungsfall, wo die Datenelemente Teil der Super-Typ/Untertyp Beziehungen sind, aber sie haben nicht viel ändern, dann Modell Tabellen nach Ihren Bedürfnissen:

1.) Klasse Tabellenvererbung = bestimmte Untertyptabellen mit einem gemeinsamen übergeordneten Element. Dies ist am besten, wenn der Super-Typ und der Subtyp jeweils eine signifikante Anzahl eindeutiger Attribute aufweisen.

2.) Concrete Table Inheritance = Platzieren Sie die gemeinsamen Super-Typ-Spalten in jeder Tabelle des Untertyps. Dies funktioniert besser, wenn der Super-Typ nicht viele eigene Attribute hat, sondern die Subtypen.

3.) Single Table Inheritance = Platzieren Sie die Spalten für alle Untertypen in 1 Tabelle zusammen mit den Spalten des Super-Typs. Spalten, die nicht zum Untertyp einer bestimmten Zeile gehören, haben einen NULL-Wert. Dies funktioniert am besten, wenn jeder Untertyp nicht viele eindeutige Attribute aufweist oder mehrere Untertypen Spalten/Attribute teilen.

Sie können diese 3 ein wenig mischen und anpassen, aber ich würde empfehlen, mit einem dieser Designs zu bleiben.

Wenn Sie wirklich EAV verwenden müssen, verwenden Sie XML-Spalten in einem RDBMS, wenn ein relativ kleiner Anteil Ihrer Daten in Ihrem EAV-Design (im Vergleich zur Gesamtdatenbank) vorhanden ist. Wenn viele Ihrer Daten in einem EAV gespeichert werden, ist ein RDBMS nicht das Werkzeug, das Sie benötigen. Schauen Sie in die Dokument/NoSQL/Schlüssel-Wert-Datenbanken wie MongoDB, Cassandra, etc. RDBMSes, die EAV implementieren, wenn nicht früh, werden schließlich zu einem Albtraum der Kodierung.

Da das Datum Ihrer Frage, würde ich neugierig zu wissen, welche Route Sie gewählt haben und was Sie gelernt, was man nicht gemocht/mochte, usw.

+0

Klassentabelle, Contrete-Tabelle und Single-Table-Vererbung sind in meinem Fall nicht anwendbar. Die Verwendung von XML ist auch Antipattern (selbst wenn es 1 NF gibt, gibt es Probleme mit der Datenintegrität und Suche). Jetzt versuche ich EAV in diesem System für einen kleinen Teil davon zu verwenden. Um Werte von EAV zu speichern, verwenden Sie verschiedene Tabellen für verschiedene Typen: für Strings, Daten, Zahlen.Natürlich verursacht EAV auch einige Schwierigkeiten, aber ehrlich gesagt sehe ich momentan keine Alternative. Ich sah einen Mongodb, Couchdb und fand nicht, dass es mir in meinem Fall sehr helfen könnte. – Oleg

+0

Ich schätze Ihre Bedenken. Je begrenzter die Nutzung von EAV in einem RDBMS ist, desto besser sind Sie auf lange Sicht. Der Schlüssel ist, mit weit geöffneten Augen hineinzugehen. Sehen Sie sich auch einige der Beiträge in der zugehörigen Liste auf der rechten Seite dieser Seite an. Viele Meinungen da draußen. –

Verwandte Themen