Я хочу, чтобы пользователь мог искать товары в ценовом диапазоне. Пользователь должен иметь возможность использовать любую валюту (USD, EUR, GBP, JPY, ...) независимо от того, какая валюта установлена продуктом. Таким образом, цена продукта составляет 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';
Если пользователь ищет другую валюту, скажем, 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
(постоянный валютный курс, который берется, скажем, сегодня) и всегда рассчитывать против этого! А при отображении цены в евро, конечно, рассчитывайте курс по фактическому курсу. Я прав? Или есть проблема, которую я не вижу?