Ich möchte dem Benutzer die Suche nach Produkten innerhalb einer Preisspanne ermöglichen. Der Benutzer sollte in der Lage sein, jede Währung (USD, EUR, GBP, JPY, ...) zu verwenden, unabhängig davon, welche Währung vom Produkt festgelegt wird. Der Produktpreis beträgt also 200 USD. Wenn der Benutzer nach Produkten sucht, die 100 bis 200 EUR kosten, kann er sie dennoch finden. Wie macht man es schnell und effektiv?
Folgendes habe ich bisher getan. Ich speichere das price
, currency code
und das calculated_price
ist der Preis in Euro (EUR), der die Standardwährung ist.
CREATE TABLE "products" (
"id" serial,
"price" numeric NOT NULL,
"currency" char(3),
"calculated_price" numeric NOT NULL,
CONSTRAINT "products_id_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "currencies" (
"id" char(3) NOT NULL,
"modified" timestamp NOT NULL,
"is_default" boolean NOT NULL DEFAULT 'f',
"value" numeric NOT NULL, -- ratio additional to the default currency
CONSTRAINT "currencies_id_pkey" PRIMARY KEY ("id")
);
INSERT INTO "currencies" (id, modified, is_default, value)
VALUES
('EUR', '2012-05-17 11:38:45', 't', 1.0),
('USD', '2012-05-17 11:38:45', 'f', '1.2724'),
('GBP', '2012-05-17 11:38:45', 'f', '0.8005');
INSERT INTO "products" (price, currency, calculated_price)
SELECT 200.0 AS price, 'USD' AS currency, (200.0 / value) AS calculated_price
FROM "currencies" WHERE id = 'USD';
Wenn der Benutzer mit einer anderen Währung sucht, sagen wir USD, berechnen wir den Preis in EUR und durchsuchen die calculated_price
Spalte.
SELECT * FROM "products" WHERE calculated_price > 100.0 AND calculated_price < 200.0;
Auf diese Weise können wir die Preise sehr schnell vergleichen, da wir nicht den tatsächlichen Preis für jede Zeile berechnen müssen, da er einmal berechnet wird.
Schlecht ist, dass wir zumindest jeden Tag die default_price
für alle Zeilen neu berechnen müssen , da die Wechselkurse geändert wurden.
Gibt es einen besseren Weg, um damit umzugehen?
Gibt es keine andere clevere Lösung? Vielleicht eine mathematische Formel? Ich habe die Idee, dass das calculated_price
ein Verhältnis zu einer Variablen ist, X
und wenn sich die Währung ändert, aktualisieren wir nur diese Variable X
, nicht die calculated_price
, sodass wir nicht einmal etwas (Zeilen) aktualisieren müssen ... Vielleicht kann es ein Mathematiker lösen so was?
quelle
calculated_price
überhaupt aktualisieren ? Ich könnte einfach deninitial_currency_value
(konstanten Wechselkurs, der heute angenommen wird) speichern und immer dagegen rechnen! Und wenn Sie den Preis in Euro anzeigen, rechnen Sie natürlich mit dem tatsächlichen Wechselkurs. Habe ich recht? Oder gibt es ein Problem, das ich nicht sehe?Ich hatte meine eigene Idee. Sagen Sie mir bitte, ob es tatsächlich funktionieren wird!
Das Problem.
Wenn das Produkt in die
products
Tabelle aufgenommen wird, wird der Preis in die Standardwährung (EUR) umgerechnet und in dercalculated_price
Spalte gespeichert .Wir möchten, dass der Benutzer Preise jeder Währung suchen (filtern) kann. Dazu wird der Eingangspreis in die Standardwährung (EUR) umgerechnet und mit der
calculated_price
Spalte verglichen .Wir müssen die Wechselkurse aktualisieren, damit die Benutzer nach neuen Wechselkursen suchen können. Das Problem ist jedoch, wie
calculated_price
effizient aktualisiert werden kann.Die Lösung (hoffentlich).
Nicht! :) :)
Die Idee ist , dass wir den gestrigen Wechselkurse (nehmen alle vom selben Tag ) in der
calculated_price
Verwendung nur diejenigen. Wie ... für immer! Keine täglichen Updates. Bevor wir die Preise vergleichen / filtern / suchen, müssen wir nur die heutigen Wechselkurse so nehmen, wie sie gestern waren.Also,
calculated_price
wir nur den Wechselkurs des Fixtermin verwenden (wir gewählt haben, sagen wir mal, gestern). Wir müssen den heutigen Preis in den gestrigen Preis umrechnen. Mit anderen Worten, nehmen Sie den heutigen Kurs und konvertieren Sie ihn in den gestrigen Kurs:Und das ist Tabelle der Währungen:
Auf diese Weise können Sie ein Produkt hinzufügen, das 200 USD kostet, und wie das
calculated_price
Get berechnet wird: vom USD zum neuesten EUR-Kurs und zum festen (alten) KursDies kann auch auf der Clientseite vorberechnet werden, und das werde ich tun - den Benutzereingabepreis auf den
calculated_price
kompatiblen Wert berechnen, bevor wir eine Abfrage durchführen, damit es gut alt verwendet wirdSELECT * FROM products WHERE calculated_price > 100.0 AND calculated_price < 200.0;
Fazit.
Diese Idee ist mir erst vor wenigen Stunden gekommen, und derzeit bitte ich Sie, zu prüfen, ob ich mit dieser Lösung Recht habe. Was denkst du? Wird das funktionieren? Oder habe ich mich geirrt?
Ich hoffe du verstehst das alles. Ich bin kein englischer Muttersprachler, es ist auch spät und ich bin müde. :) :)
AKTUALISIEREN
Nun, es sieht so aus, als würde es ein Problem lösen, aber ein anderes einführen. Schade. :) :)
quelle
rate_newest / rate_fixed
pro Währung unterschiedlich ist und diese Lösung nur das für das vom Benutzer ausgewählte Geld bei der Suche berücksichtigt. Ein Preis in einer anderen Währung würde nicht mit aktuellen Kursen verglichen. Die Antwort, die ich eingereicht habe, hatte ein ähnliches Problem, aber ich glaube, ich habe es in der aktualisierten Version behoben.