Kullanıcının fiyat aralığında ürün aramasını mümkün kılmak istiyorum. Ürün tarafından ayarlanan para birimi ne olursa olsun, kullanıcı herhangi bir para birimini (USD, EUR, GBP, JPY, ...) kullanabilmelidir. Yani, ürün fiyatı 200USD'dir ve kullanıcı 100EUR - 200EUR'a mal olan ürünleri ararsa, yine de bulabilir. Hızlı ve etkili nasıl yapılır?
İşte şimdiye kadar yaptığım şey. Ben depolamak price
, currency code
ve calculated_price
varsayılan para birimi olan Euro (EUR) 'fiyatını olduğunu.
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';
Kullanıcı başka bir para birimiyle arama yapıyorsa, diyelim ki USD, fiyatı EUR cinsinden hesaplıyoruz ve calculated_price
sütunda arama yapıyoruz .
SELECT * FROM "products" WHERE calculated_price > 100.0 AND calculated_price < 200.0;
Bu şekilde fiyatları çok hızlı bir şekilde karşılaştırabiliriz, çünkü her satır için gerçek fiyatı hesaplamamız gerekmez, çünkü bir kez hesaplanır.
Kötü olan şey, en azından her gün default_price
tüm satırlar için yeniden hesaplamamız gerektiğidir , çünkü döviz kurları değiştirilmiştir.
Bununla başa çıkmanın daha iyi bir yolu var mı?
Başka akıllı bir çözüm yok mu? Belki matematiksel bir formül? calculated_price
Bazı değişkenlere karşı bir oran olduğunu bir fikrim var ve X
para birimi değiştiğinde, sadece bu değişkeni güncelliyoruz X
, değil calculated_price
, bu yüzden bir şey (satırlar) güncellememiz bile gerekmiyor ... Belki bazı matematikçiler bunu çözebilir bunun gibi?
calculated_price
? Ben sadeceinitial_currency_value
(bugün alınan sabit döviz kuru, diyelim, bugün) depolamak ve her zaman buna karşı hesaplamak olabilir! Ve fiyatı Euro olarak görüntülerken, elbette gerçek döviz kuruna göre hesaplayın. Haklı mıyım? Yoksa görmediğim bir sorun mu var?