Je veux permettre à l'utilisateur de rechercher des produits dans une fourchette de prix. L'utilisateur doit pouvoir utiliser n'importe quelle devise (USD, EUR, GBP, JPY, ...), quelle que soit la devise définie par le produit. Ainsi, le prix du produit est de 200 USD et, si l'utilisateur recherche les produits qui coûtent entre 100 et 200 EUR, il peut toujours le trouver. Comment le rendre rapide et efficace?
Voici ce que j'ai fait jusqu'à présent. Je stocke le price
, currency code
et calculated_price
c'est le prix en Euros (EUR) qui est la devise par défaut.
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 l' utilisateur est à la recherche d'une autre monnaie, disons USD, nous calculons le prix en euros et chercher la calculated_price
colonne.
SELECT * FROM "products" WHERE calculated_price > 100.0 AND calculated_price < 200.0;
De cette façon, nous pouvons comparer les prix très rapidement, car nous n'avons pas besoin de calculer le prix réel pour chaque ligne, car il est calculé une fois.
La mauvaise chose est qu'au moins chaque jour, nous devons recalculer le default_price
pour toutes les lignes, car les taux de change ont été modifiés.
Y a-t-il une meilleure façon de gérer cela?
N'y a-t-il pas d'autre solution intelligente? Peut-être une formule mathématique? J'ai une idée que calculated_price
c'est un ratio par rapport à une variable X
et, lorsque la devise change, nous ne mettons à jour que cette variable X
, pas la calculated_price
, donc nous n'avons même pas besoin de mettre à jour quoi que ce soit (lignes) ... Peut-être qu'un mathématicien peut le résoudre comme ça?
calculated_price
à jour le tout? Je pourrais simplement stocker leinitial_currency_value
(taux de change constant qui est pris, disons, aujourd'hui) et toujours calculer par rapport à cela! Et lorsque vous affichez le prix en euros, calculez par rapport au taux de change réel, bien sûr. Ai-je raison? Ou il y a un problème que je ne vois pas?