Я хочу, чтобы пользователь мог искать товары в ценовом диапазоне. Пользователь должен иметь возможность использовать любую валюту (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
(постоянный валютный курс, который берется, скажем, сегодня) и всегда рассчитывать против этого! А при отображении цены в евро, конечно, рассчитывайте курс по фактическому курсу. Я прав? Или есть проблема, которую я не вижу?Я пришел с моей собственной идеей. Скажите, если это действительно сработает, пожалуйста!
Эта проблема.
Когда товар добавляется в
products
таблицу, цена конвертируется в валюту по умолчанию (EUR) и сохраняется вcalculated_price
столбце.Мы хотим, чтобы пользователь мог искать (фильтровать) цены по любой валюте. Это делается путем преобразования входной цены в валюту по умолчанию (EUR) и сравнения ее со
calculated_price
столбцом.Нам нужно обновить курсы валют, чтобы пользователи могли осуществлять поиск по свежему курсу валюты. Но проблема в том, как
calculated_price
эффективно обновить .Решение (надеюсь).
Не надо! :)
Идея заключается в том, что мы берем вчерашние курсы валют ( все на одну и ту же дату ), а
calculated_price
используем только те. Как ... навсегда! Нет ежедневных обновлений. Единственное, что нам нужно, прежде чем мы сравним / отфильтруем / отыщем цены, - это взять сегодняшние курсы валют, как они были вчера.Итак,
calculated_price
мы будем использовать только курс валюты с фиксированной датой (мы выбрали, скажем, вчера). Нам нужно будет преобразовать сегодняшнюю цену во вчерашнюю цену. Другими словами, возьмите текущий курс и конвертируйте его в вчерашний курс:А это таблица валют:
Это как добавить продукт, который стоит 200 долларов США и как
calculated_price
рассчитывается доход: от доллара США к новейшему курсу евро и к фиксированному (старому) курсуЭто также может быть предварительно рассчитано на стороне клиента, и это то, что я собираюсь сделать - вычислить цену ввода пользователя до
calculated_price
совместимого значения, прежде чем мы сделаем запрос, так что будет использоваться старый добрыйSELECT * FROM products WHERE calculated_price > 100.0 AND calculated_price < 200.0;
Заключение.
Эта идея пришла ко мне всего несколько часов назад, и в настоящее время я прошу вас проверить, прав ли я насчет этого решения. Как вы думаете? Это сработает? Или я ошибся?
Я надеюсь, вы понимаете все это. Я не являюсь носителем английского языка, также уже поздно, и я устал. :)
ОБНОВИТЬ
Ну, похоже, это решает одну проблему, но представляет другую. Жаль. :)
источник
rate_newest / rate_fixed
разные для каждой валюты, и это решение учитывает только одно для выбранных пользователем денег в поиске. Любая цена в другой валюте не будет сравниваться с современными курсами. Ответ, который я представил, каким-то образом имел похожую проблему, но я думаю, что я исправил ее в обновленной версии.