Verwenden von MySql 5.7 JSON-Spalten für EAV

8

Ich entwickle ein E-Commerce-Produkt und konnte alle Funktionen implementieren. Die Benutzer müssen zusätzliche Attribute für ein Produkt erstellen. Im Moment habe ich zwei Möglichkeiten.

EAV

EAV ist weitgehend verpönt, scheint aber für Magento zu funktionieren. Aber nachdem ich alle Kopfschmerzen untersucht habe, die es verursacht, bin ich etwas zurückhaltend, es zu benutzen

Verwenden Sie JSON-Spalten in MySql 5.7

Dies ist ziemlich neu und ich habe nicht gesehen, dass es irgendwo anders implementiert wird, und ich fürchte vollständige Tabellenscans als Folge der Abfrage der JSON-Attribute. Aber nach dem Lesen dieses MySql 5.7 JSON scheinen sie die Verwendung von JSON zu empfehlen. und es wäre weniger lästig als so etwas wie diesen praktischen MySql-Schema-Rat zu implementieren .

Meine Frage ist, obgleich ich voreingenommen bin, die JSON-Spaltenmethode zum Speichern von Attributen zu verwenden, da NoSQL für mich keine Option ist, gibt es Nachteile, die schwerwiegender sind als die Verwendung von EAV-Tabellen.

Madawar
quelle
Welche Methode haben Sie gewählt?
Poc

Antworten:

2

Weder EAV noch die Auswahl einer JSON-Spalte sind in Ihrem Fall schlechte Ansätze, aber welche für Sie wirklich besser ist, hängt davon ab, was Sie mit den Daten tun möchten, sobald sie in der Datenbank gespeichert sind.

Wenn Sie nur ein Produkt mit benutzerdefinierten Attributen haben möchten und das Produkt als Ganzes lesen möchten, bietet der JSON-Weg eine bessere Leistung für Sie, da sich das gesamte Produkt in einer Tabelle befindet Sie können den abgerufenen JSON einfach aus der Datenbank dekodieren und im Frontend nach Belieben damit arbeiten.

Wenn Sie jedoch nicht nur das Produkt als Ganzes lesen möchten, sondern mit einem zukünftigen Einblick möglicherweise die Möglichkeit einführen möchten, Produkte mit bestimmten Attributen (z. B. Farbe) herauszufiltern, würde die Verwendung des EAV-Ansatzes die Leistung dieses Vorgangs wie Sie erhöhen könnte Produkte herausfiltern, deren Attributnamen direkt mit denen übereinstimmen, nach denen Sie suchen.

SELECT
    pa.ProductId
FROM
    product_attributes pa
WHERE
    pa.`Name` = "color"

Wenn Sie diese Funktion in der JSON-Spalte haben, beansprucht das Durchlaufen des JSON-Attributmodells mehr Ressourcen als der direkte Vergleich von Zeichenfolgen.


Als Entwickler des REST-API-Backends für mobile Anwendungen arbeite ich häufig damit, dem Benutzer einen Überblick über Push-Benachrichtigungen zu geben, die er über ein Benachrichtigungscenter im mobilen Client erhalten hat.

Da ich nicht vorhabe, die Daten häufig intensiv abzufragen, ist die JSON-Spalte völlig in Ordnung. Ich möchte dem Benutzer nur die Daten in verschiedenen Formaten zur Verfügung stellen, wenn er sie abfragt. Deshalb nehme ich die Daten aus der Datenbank und speichere sie dem Benutzer. Es ist sogar noch besser, da die Oberfläche der REST-APIs JSON ist, sodass ich nicht einmal zusätzliche Formatierungen vornehmen muss, wie dies bei einem EAV-Modell erforderlich wäre.

Andy
quelle