사용자가 가격 범위 내에서 제품을 검색 할 수 있도록하고 싶습니다. 사용자는 제품에 의해 설정된 통화에 관계없이 모든 통화 (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;
이러한 방식으로 모든 행의 실제 가격을 한 번 계산하기 때문에 계산할 필요가 없기 때문에 가격을 매우 빠르게 비교할 수 있습니다.
나쁜 점은 default_price
환율이 변경 되었기 때문에 적어도 매일 모든 행에 대해 를 다시 계산해야한다는 것입니다 .
이것을 처리하는 더 좋은 방법이 있습니까?
다른 영리한 솔루션이 없습니까? 아마도 수학 공식? 나는 calculated_price
변수가 일부 변수에 대한 비율 이라는 것을 알고 X
있으며 통화가 변경되면 우리가 X
아닌 해당 변수 만 업데이트 calculated_price
하므로 아무것도 업데이트하지 않아도됩니다 (행) ... 어쩌면 일부 수학자가 해결할 수 있습니다. 이처럼?
calculated_price
합니까? 나는 단지initial_currency_value
(오늘은 일정 통화 환율을) 저장하고 항상 그것에 대해 계산할 수 있습니다! 그리고 유로로 가격을 표시 할 때는 물론 실제 환율에 대해 계산하십시오. 내가 맞아? 아니면 보이지 않는 문제가 있습니까?