Frage

Ich habe eine "Farben" Tabelle in meiner Datenbank.

Der Benutzer gibt eine Farbe, um den Benutzeroberfläche Trog, und die Back-End-sucht für die meist ähnlich aussehende Farbe in der Farben-Tabelle vorhanden, um den Abstand der Farben in dem HCL Raum berechnet werden.

Ich werde einen Caching-Algorithmus implementieren, die den Abstand zwischen zuvor berechneten Farbabständen gespeichert werden sollen, wiederholte mathematische Operationen zu vermeiden.

Was ist der beste Tabellenlayout für einen solchen Zweck?

War es hilfreich?

Lösung

Wie Osama sagte, das sieht aus wie vorzeitige Optimierung. Basierend auf Ihrer Beschreibung des Algorithmus, würde ich:

  • Pre-Berechnung der HCL-Vektoren für alle Farben in der Datenbank und eine Tabelle speichern, die eine Farbe-ID zu seinem HCL Vektor-Karten.
  • sollte die Tabelle gespeichert wird mit den MySQL Spatial Erweiterungen , die Sie für Nachbarn eines Punktes abfragen lassen.
  • Wenn eine neue Farbe gewählt wird, verwandelt es zu HCL und Abfrage für Nachbarn des Punktes in HCL Raum.
  • Wenn das Caching überhaupt benötigt wird, würde ich grobkörnig Farben zwischenzuspeichern, so gibt es eine gewisse Chance, dass die Benutzer eine zuvor ausgewählte Farbe erneut.

Andere Tipps

Sie können dies tun:

table colors(r,g,b)
table colordistance(user_r,user_g,user_b,r,g,b,distance)

, aber erwarten Sie Ihre Benutzer die gleichen Zahlen eingeben halten ??? Die maximale Anzahl der Zeilen in dieser Tabelle ist 16777216, wenn Sie die nächste Farbe enthalten.

Ich vermute immer noch, dass der Zugriff auf die Datenbank ist langsamer als die Berechnung, so dass ich denke an das Zitat „ vorzeitige Optimierung ist die Wurzel allen Übels “.

ich es ohne Caching der Berechnung laufen würde, bis ich es als ein tatsächliches Problem.

Ich gehe davon aus, dass Ihre Farbe „Entfernungen“ berechnet werden als so etwas wie:

sqrt((r1-r2)^2 + (g1-g2)^2 + (b1-b2)^2)

Unter der Annahme, dass Sie verwenden 8-Bit-Pixel, gäbe es (256 ^ 3) ^ 2 verschiedene Zuordnungen in der Tabelle. Das ist eine Menge von Tabellenbereich. (Man könnte es wahrscheinlich viel kompakt, aber ... den nächsten Punkt sehen.)

Die andere Sache, die Sie beachten müssen, ist die Kosten für einen Datenbank-Lookup einen Farbabstand im Vergleich zu den Kosten zu tun, um die Berechnung zu finden. Meine Vermutung wäre, dass eine Datenbankabfrage eine Millisekunde oder mehr, aber die Metrik Berechnung sollte 1 Mikrosekunde oder weniger nehmen nehmen würde.

Alles in allem eine Datenbanktabelle mit klingt wie eine wirklich schlechte Idee zu mir.

Hier ist, was ich empfehlen:

table colors(color_id, color_name, r, g, b)

table color_distances(color_1_id, color_2_id, distance)

Indizes: PRIMARY (color_1_id, color_2_id) INDEX (color_1_id, Entfernung, color_2_id)

color_distances würden alle möglichen color_id Kombinationen enthalten, und würden nur bei Bedarf aktualisiert werden.

Auswahl wäre dann einfach:

SELECT similar_colors.*
FROM colors as similar_colors, color_distances
WHERE color_distances.color_1_id = <selected_color_id>
ORDER BY color_distances.distance ASC

Ich bin nicht allzu vertraut mit HCL, sondern auf der Grundlage der Beschreibung unter Farbe: : Ähnlichkeit :: HCL es scheint, dass zwei Farben als Eingang für Abstand benötigt werden

.

Also ich zumindest zwei Sätze von RGB denken würde und der nach Abstand zwischen ihnen gespeichert werden soll. Ich bin von Ihrem Anwendungsfall nicht sicher, aber wenn die Palette von Möglichkeiten ausgewählt ist, können Sie die Benutzer-Auswahl als auch gespeichert werden sollen.

Es scheint, dass es nur wenn eine endliche Anzahl von Kombinationen sein würde? Es scheint, wie Sie die Mathematik für jede Kombination einmal tun könnten, und nur eine Lookup-Tabelle haben?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top