ユーザーが価格帯で商品を検索できるようにしたい。ユーザーは、製品で設定されている通貨に関係なく、任意の通貨(USD、EUR、GBP、JPYなど)を使用できる必要があります。したがって、製品価格は200USDであり、ユーザーが100EUR-200EURの価格の製品を検索した場合でも、ユーザーはそれを見つける可能性があります。それを速く効果的にするには?
これが私が今までやってきたことです。私は保存price
、currency code
およびcalculated_price
デフォルトの通貨であるユーロ(EUR)での価格です。
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';
ユーザーが他の通貨(USDなど)で検索している場合、価格をEURで計算し、calculated_price
列を検索します。
SELECT * FROM "products" WHERE calculated_price > 100.0 AND calculated_price < 200.0;
この方法では、価格を1回だけ計算するため、すべての行の実際の価格を計算する必要がないため、価格を非常に高速に比較できます。
悪いことにdefault_price
、通貨レートが変更されているため、少なくとも毎日、すべての行のを再計算する必要があります。
これに対処するより良い方法はありますか?
他に賢い解決策はありませんか?たぶんいくつかの数式ですか?私はという考え持っているcalculated_price
いくつかの変数に対する比率であるX
と、とき通貨の変更、我々は変数ことだけ更新しX
、ではないcalculated_price
私たちも、アップデートは何も(行)には必要ありませんので、...たぶんいくつかの数学者はそれを解決することができますがこのような?
calculated_price
ですか?私はinitial_currency_value
(実際に使用されている一定の通貨レート)を保存し、それに対して常に計算することができます!もちろん、ユーロで価格を表示する場合は、実際の通貨レートに対して計算してください。私は正しいですか?または、私が見ない問題がありますか?