Quiero que el usuario pueda buscar productos dentro de un rango de precios. El usuario debe poder usar cualquier moneda (USD, EUR, GBP, JPY, ...), sin importar la moneda que establezca el producto. Por lo tanto, el precio del producto es de 200 USD y, si el usuario busca los productos que cuestan 100EUR - 200EUR, aún puede encontrarlo. ¿Cómo hacerlo rápido y efectivo?
Esto es lo que he hecho hasta ahora. Almaceno el price
, currency code
y calculated_price
ese es el precio en euros (EUR) que es la moneda predeterminada.
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';
Si el usuario está buscando con otra moneda, digamos USD, calculamos el precio en EUR y buscamos en la calculated_price
columna.
SELECT * FROM "products" WHERE calculated_price > 100.0 AND calculated_price < 200.0;
De esta manera, podemos comparar precios muy rápido, porque no necesitamos calcular el precio real de cada fila, ya que se calcula una vez.
Lo malo es que al menos todos los días tenemos que volver a calcular default_price
para todas las filas, porque las tasas de cambio han cambiado.
¿Hay una mejor manera de lidiar con esto?
¿No hay alguna otra solución inteligente? Tal vez alguna fórmula matemática? Tengo una idea de que calculated_price
es una relación con alguna variable X
y, cuando la moneda cambia, actualizamos solo esa variable X
, no la calculated_price
, por lo que incluso no necesitamos actualizar nada (filas) ... Tal vez algún matemático pueda resolverlo ¿Me gusta esto?
calculated_price
? ¡Podría almacenar elinitial_currency_value
(tipo de cambio constante que se toma, digamos hoy) y siempre calcularlo contra eso! Y cuando muestre el precio en euros, calcule contra la tasa de cambio real, por supuesto. Estoy en lo cierto? ¿O hay un problema que no veo?