2010-12-07 13 views
2

Ich habe das Gefühl, das wurde bereits beantwortet, aber ich weiß nicht die richtige Terminologie beteiligt und konnte nichts in meiner Suche finden.Reduzierung der Redundanz in Daten für die Speicherung in MySQL

Ich arbeite an einem Produktempfehlungssystem. Und ich habe eine Datenbank mit Artikeln, und ich gehe durch und ermittle, welche Artikel ähnlich sind. Zum Beispiel ist ItemID 1 ähnlich wie 5, 7 und 8. Das Problem ist, dass die Daten redundant sind. Wie ich Schleife durch das ganze Stück Satz werde ich mit so etwas wie dieses aufzuwickeln:

1 5,7,8
5 7,8,1
7 8,5,1
8 5,1 7

Was ist der beste Weg, um dies in MySQL zu speichern, so kann ich es abfragen und finden Sie die Elemente entweder 1, 5, 7 oder 8. Im wirklichen Leben wird es eine ungerade Anzahl von Elementen in jedem Satz. Ich mache mir mehr Gedanken um die Geschwindigkeit als um Speicherplatz, aber es scheint, als sollte es ein glückliches Medium geben, oder wenn ich Glück habe, ist das schnell und spart Platz.

Antwort

1

Dies wird als "Graph-Datenstruktur" bezeichnet. Die Zahlen (1,5,7,8) sind die Knoten. Jede Verbindung (1-5,1-7,1-8,5-7, etc.) sind die Kanten.

http://en.wikipedia.org/wiki/Graph_(data_structure)

In MySQL, sollten die Kanten pro Zeile als eine Kante speichern. Wenn jede Kante in beide Richtungen verbunden ist, sollten Sie jede Kante in beide Richtungen (d. H. 1-5 und 5-1) hinzufügen. Ich würde so der Tisch etwas Setup:

TABLE edges (
    id PRIMARY KEY AUTO_INC, 
    from INT, 
    to INT 
) 

Sie einen Index für wollen (aus), oder möglicherweise (von, bis) abhängig. Um alle Objekte zu finden, um einen Zusammenhang mit dem Sie suchen bei:

SELECT to FROM edges WHERE from = X; 

Sehr viele Verbesserungen an diesem einfachen Modell werden könnte, aber es ist ein Anfang.

Edit: Vielleicht einige dieser Spaltennamen sind Schlüsselwörter. Mein Fehler.

1

Anstatt eine Spalte für das Element und eine andere Spalte für eine Liste der Ähnlichkeiten, die dazu führen, dass jedes Element eine Zeile in der Tabelle enthält, sollten Sie jedes (Quell- und Ziel-) Paar in einer separaten Zeile speichern.

Anstelle von (1, {5,7,8}), (5, {7,8,1}) hätten Sie (1, 5), (1, 7), (1, 8), (5, 7), (5, 8), (5, 1). Um zu sehen, welche Elemente ähnlich wie in Punkt 8 sind, wählen Sie einfach Quelle aus, wo Ziel = 8 ist.

+0

+1 Gute Antwort. Willkommen bei SO Charley! –

1

Chris hat Recht und Unrecht zugleich. Er hat recht, dass es eine "Graph-Datenstruktur" ist, aber versäumt zu erwähnen, dass sein Ansatz Sie in mehrere Unterabfragen bringen würde, um ein Diagramm zu finden.

Bitte tun Sie sich einen Gefallen und werfen Sie einen Blick auf das Modell Nested Set. Vielleicht möchten Sie zu der MySQL manual gehen, um loszulegen.

Mit freundlichen Grüßen

+1

dies ist eine flexible Lösung, aber ich weiß nicht, ob es gut gilt, nur eine Ebene der Verschachtelung zu benötigen, was ich aus diesem Beitrag entnehme. außer dass es definitiv schneller ist, um n-Tier Kategorien zu bekommen. nachdem dies vorher getan wurde, erfordert es auch einen Grad der Wartung, um sicher zu sein, dass der Baum. Ich mag [das] (http: //articles.sitepoint.com/article/hierarchic-data-database) für ein vielleicht realistischeres Beispiel oder wie/warum Sie diese Lösung verwenden. – zanlok

+0

Ja, es ist nur eine Ebene tief, also funktioniert seine Lösung gut. – profitphp

Verwandte Themen