29

Ich entwerfe meine Datenbank/Domain für eine eCommerce-Anwendung und es fällt mir schwer herauszufinden, wie man Produkte speichert.Sollte ich EAV-Modell verwenden?

Die Website wird eine breite Palette von Produkten, Stifte, Riemen, Tattoos, Regenschirme, alles verkaufen. Jedes dieser Produkte teilt einige gemeinsame Attribute, Höhe, Breite, Länge, Gewicht usw., aber einige Produkte haben spezielle Daten. Zum Beispiel haben Stifte verschiedene Tintenfarben und Spitzen/Deckel und Broschüren können verschiedene Arten von Falten haben. Bisher habe ich mir über 20 zusätzliche Attribute ausgedacht, aber diese Attribute können nur für 1% der Produkte auf der Website gelten.

Also frage ich mich, ob es angemessen ist, ein EAV-Modell zu implementieren, um die zusätzlichen Daten zu behandeln. Wenn Kunden die Website im Frontend betrachten, wird eine Filterleiste wie bei eBay und autosales.com.au angezeigt. (Also denke daran, es wird ein gutes Stück der Abfrage)

Ich denke nicht, dass es praktisch ist, Class Table Vererbung zu implementieren, da das System flexibel bleiben muss. Das liegt daran, dass wir in der Zukunft mit neuen Produkttypen mehr Attribute haben können.

Die andere Sache, die ich in Betracht gezogen habe, ist die Verwendung einer NoSQL-Datenbank (wahrscheinlich MongoDB), aber ich habe wenig Erfahrung mit diesen Arten von Datenbanken, wird es sogar mein Problem lösen?

Bewertung von Optionen:

  1. Einzelprodukte Einheit mit vielen Spalten
  2. Separate Attribute Einheit (EAV)
  3. Switch to Schema-weniger Persistenz

ich in das bin Prozess des Erstellens eines Prototyps mit einer Attributsentität, um zu sehen, wie flexibel es ist, und Testen der Leistung und wie außer Kontrolle geraten wird.

EDIT: Ich bin natürlich offen für andere Lösungen.

+6

Gibt es einen besonderen Grund, warum Sie eine E-Commerce-App von Hand erstellen? Es könnte schwierig, gefährlich und vielleicht ein wenig unnötig sein ... –

+0

Nur gefunden [diese Frage] (http://stackoverflow.com/questions/870808/entity-attribute-value-database-vs-strict-relational-model- E-Commerce-Frage), die so ähnlich zu sein scheint wie das, was Sie fragen. – BenV

+1

@BenV, während die Frage ähnlich ist, werden die Antworten wahrscheinlich ganz anders sein, besonders in Bezug auf Magento. Magento hatte anfangs wirklich Probleme mit der EAV-Leistung, aber sie haben dies durch vorsichtiges Caching (Abfrage, Modell, HTML-Block und ganze Seite) und optionale Denormalisierung gelöst. Dies sind neue Entwicklungen, seit diese Frage gestellt wurde, und es wäre würdig, die Frage in diesem Zusammenhang, IMHO, erneut zu stellen. –

Antwort

64

Große Frage, aber natürlich gibt es keinen "einen wahren Weg". Laut @BenV verwendet Magento das EAV-Modell. Meine Erfahrung damit war überwältigend positiv, jedoch stolpert es andere Nutzer. Einige Überlegungen:

1. Leistung. EAV erfordert komplexe Joins mit mehreren Tabellen, um Ihr Objekt mit den relevanten Attributen zu füllen. Das verursacht einen Leistungseinbruch. Dies kann jedoch durch sorgfältiges Caching (auf allen Ebenen des Stacks, einschließlich Query-Caching) und den selektiven Einsatz der Denormalisierung gemildert werden. Mit Magento können Administratoren ein denormalisiertes Modell für Kategorien und Produkte auswählen, bei denen die Anzahl der SKUs dies rechtfertigt (im Allgemeinen zu Tausenden). Dies wiederum erfordert Beobachter, die eine Neuindizierung auslösen (immer gut!) Und Aktualisierungen an den "flachen" denormalisierten Tabellen, wenn sich Produktdaten ändern. Dies kann auch geplant oder manuell ausgelöst werden, wenn der Administrator dazu aufgefordert wird.

2. 3rd Party User-Komplexität Wenn Sie jemals an andere Benutzer diese Anwendung zur Verfügung stellen möchten machen, viele EAV zu komplex und Sie tun am Ende mit viel Gemecker und uninformiert Missbrauch auf den Benutzer finden Foren (Ref Magento !!).

3. Zukünftige Erweiterbarkeit und Plugin-Architektur. Es besteht kein Zweifel, dass das EAV-Modell wirklich zu seinem Recht kommt, wenn die Erweiterbarkeit ein Faktor ist. Es ist sehr einfach, dem Modell neue Attribute hinzuzufügen, während das Risiko minimiert wird, bestehende ORM- und Controller-Codes zu zerstören.

4. Änderungen des Datentyps EAV macht es etwas schwieriger, Attributdatentypen zu ändern. Wenn Ihr ursprüngliches Design einen bestimmten Attribut-Datentyp aufruft, der sich in Zukunft ändert (z. B. int zu varchar), bedeutet dies, dass Sie alle Datensätze für dieses Attribut in die entsprechende Tabelle migrieren müssen, die dem neuen Datentyp entspricht. Natürlich würden Puristen vorschlagen, dass du das Design zum ersten Mal richtig machst, aber die Realität dringt manchmal ein!

5. Manueller Produktimport Eine Sache, die EAV fast unmöglich macht, ist die Einfuhr von Produkten (oder andere Einrichtungen) in die Datenbank mit SQL und/oder phpMyAdmin-Stil CSV/XML. Sie müssen ein Importer-Modul schreiben, das die strukturierten Daten akzeptiert und sie über die Model-Ebene der Anwendung an die Datenbank weiterleitet. Das trägt zu Ihrer Komplexität bei.

+0

Ausgezeichnete Antwort. – timdev

+1

Ich glaube nicht, dass die Leistung ein Hauptproblem sein wird, Doctrine 2 hat bereits einen Abfrage-Cache, und ich werde mein eigenes Level implementieren. Darüber hinaus ist es wichtig, daran zu denken, dass die Attribute nur Hauptzweck haben: 1. Filtern von Produktlisten 2. Anzeigen auf einer Produktseite. Die in den Attributen enthaltenen Daten sind nur Metadaten und nicht notwendig, damit die Anwendung funktioniert.Ich denke, sie sind ein bisschen wie Tags, in diesem Fall scheint EAV praktisch. – Cobby

+2

@Cobby Jonathan's Standpunkt zum Caching steht. Wie generieren Sie Summen für die Filter? Wie können Sie Seiten für eine große Anzahl von Kunden effizient bedienen? Wenn Sie darauf bestehen, das selbst zu erstellen, tun Sie sich zumindest einen Gefallen und überprüfen Sie die Änderungen, die Magento an ihr EAV-System vorgenommen hat, um eine Skalierung zu ermöglichen. –

0

Der Open-Source-Einkaufswagen Magento ermöglicht benutzerdefinierte Attribute für ihre Produkte mit einem EAV-Design. Sie können ihr Datenbankschema here auschecken.

+1

Ja, ich habe bereits ihr Datenbank-Design überprüft, was ist worauf ich meinen Prototypen aufbaue. Meine Frage ist nicht über die Implementierung von EAV ... Ich weiß bereits, wie man es benutzt. Meine Frage betrifft die architektonische Praktikabilität der Verwendung von EAV in einer Produktionsumgebung. – Cobby

0

Ich würde vorschlagen, dass Sie sich Doctrine 2 ORM mit OXM-Plugin dafür näher betrachten (https://github.com/doctrine/oxm). Es wird Ihr Problem mit verschiedenen Attributen lösen. Natürlich müssen Sie Indizes für durchsuchbare benutzerdefinierte Attribute erstellen, aber ich glaube nicht, dass dies ein Problem sein wird :)

Wenn Sie sich nicht um die Anzahl der Community-Mitglieder kümmern, können Sie auch MongoDB verwenden .

Verwandte Themen