我想让用户可以在一个价格范围内搜索产品。无论产品设置哪种货币,用户都应该能够使用任何货币(美元,欧元,英镑,日元,...)。因此,产品价格为200美元,并且,如果用户搜索价格在100欧元至200欧元之间的产品,他仍然可以找到它。如何使其快速有效?
这是我到目前为止所做的。我保存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';
如果用户使用其他货币搜索,例如说美元,我们以欧元计算价格并搜索calculated_price
列。
SELECT * FROM "products" WHERE calculated_price > 100.0 AND calculated_price < 200.0;
这样,我们可以非常快速地比较价格,因为我们不需要计算每一行的实际价格,因为它只计算一次。
坏事是,至少每天我们都必须重新计算default_price
所有行的,因为货币汇率已更改。
有没有更好的方法来解决这个问题?
还没有其他聪明的解决方案吗?也许一些数学公式?我的想法calculated_price
是相对于某个变量的比率,X
并且当货币变化时,我们仅更新该变量X
,而不更新calculated_price
,因此我们甚至不需要更新任何内容(行)...也许某些数学家可以解决它像这样?
calculated_price
?我可以只存储initial_currency_value
(假设今天使用的恒定汇率),并始终以此为基础进行计算!当然,以欧元显示价格时,请根据实际汇率计算。我对吗?还是有我看不到的问题?