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?
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?