Voglio consentire all'utente di cercare prodotti all'interno di una fascia di prezzo. L'utente dovrebbe essere in grado di utilizzare qualsiasi valuta (USD, EUR, GBP, JPY, ...), indipendentemente dalla valuta impostata dal prodotto. Quindi, il prezzo del prodotto è di 200 USD e, se l'utente cerca i prodotti che costano 100EUR - 200EUR, potrebbe ancora trovarlo. Come renderlo veloce ed efficace?
Ecco cosa ho fatto fino ad ora. Conservo il price
, currency code
e calculated_price
quello è il prezzo in Euro (EUR) che è la valuta di default.
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';
Se l'utente sta cercando un'altra valuta, diciamo USD, calcoliamo il prezzo in EUR e cerchiamo la calculated_price
colonna.
SELECT * FROM "products" WHERE calculated_price > 100.0 AND calculated_price < 200.0;
In questo modo possiamo confrontare i prezzi molto velocemente, perché non abbiamo bisogno di calcolare il prezzo effettivo per ogni riga, perché viene calcolato una volta.
La cosa brutta è che almeno ogni giorno dobbiamo ricalcolare il default_price
per tutte le righe, perché i tassi di cambio sono stati cambiati.
C'è un modo migliore per affrontare questo?
Non c'è qualche altra soluzione intelligente? Forse qualche formula matematica? Ho un'idea che calculated_price
sia un rapporto rispetto ad una variabile X
e, quando la valuta cambia, aggiorniamo solo quella variabile X
, non la calculated_price
, quindi non abbiamo nemmeno bisogno di aggiornare nulla (righe) ... Forse un matematico può risolverlo come questo?
calculated_price
tutto? Potrei semplicemente memorizzare ilinitial_currency_value
(tasso di cambio costante che viene preso, diciamo, oggi) e calcolare sempre contro quello! E quando si visualizza il prezzo in euro, calcolare ovviamente il tasso di cambio effettivo. Ho ragione? O c'è un problema che non vedo?