Quero tornar possível ao usuário pesquisar produtos dentro de uma faixa de preço. O usuário deve poder usar qualquer moeda (USD, EUR, GBP, JPY, ...), independentemente da moeda definida pelo produto. Portanto, o preço do produto é 200USD e, se o usuário pesquisar os produtos que custam 100EUR - 200EUR, ele ainda poderá encontrá-lo. Como torná-lo rápido e eficaz?
Aqui está o que eu fiz até agora. Eu guardo o price
, currency code
e calculated_price
esse é o preço em euros (EUR), que é a moeda padrão.
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 o usuário estiver pesquisando com outra moeda, digamos USD, calculamos o preço em EUR e pesquisamos na calculated_price
coluna.
SELECT * FROM "products" WHERE calculated_price > 100.0 AND calculated_price < 200.0;
Dessa forma, podemos comparar preços muito rapidamente, porque não precisamos calcular o preço real de cada linha, porque é calculado uma vez.
O ruim é que pelo menos todos os dias temos que recalcular o valor default_price
de todas as linhas, porque as taxas de câmbio foram alteradas.
Existe uma maneira melhor de lidar com isso?
Não existe outra solução inteligente? Talvez alguma fórmula matemática? Eu tenho uma ideia de que calculated_price
é uma razão em relação a alguma variável X
e, quando a moeda muda, atualizamos apenas essa variável X
, não a calculated_price
, então nem precisamos atualizar nada (linhas) ... Talvez algum matemático possa resolvê-la como isso?
calculated_price
? Eu poderia simplesmente armazenar ainitial_currency_value
(taxa de câmbio constante hoje, digamos, hoje) e sempre calcular com base nisso! E ao exibir o preço em euros, calcule com base na taxa de câmbio real, é claro. Estou certo? Ou há um problema que não vejo?