Saya ingin memungkinkan pengguna untuk mencari produk dalam kisaran harga. Pengguna harus dapat menggunakan mata uang apa pun (USD, EUR, GBP, JPY, ...), apa pun mata uang yang ditentukan oleh produk. Jadi, harga produk adalah 200 USD dan, jika pengguna mencari produk yang harganya 100EUR - 200EUR, ia masih dapat menemukannya. Bagaimana cara membuatnya cepat dan efektif?
Inilah yang telah saya lakukan sampai sekarang. Saya menyimpan price
, currency code
dan calculated_price
itu adalah harga dalam Euro (EUR) yang merupakan mata uang default.
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';
Jika pengguna mencari dengan mata uang lain, katakanlah USD, kami menghitung harga dalam EUR dan mencari calculated_price
kolom.
SELECT * FROM "products" WHERE calculated_price > 100.0 AND calculated_price < 200.0;
Dengan cara ini kita dapat membandingkan harga dengan sangat cepat, karena kita tidak perlu menghitung harga aktual untuk setiap baris, karena dihitung sekali.
Yang buruk adalah bahwa setidaknya setiap hari kita harus menghitung ulang default_price
untuk semua baris, karena nilai tukar mata uang telah berubah.
Apakah ada cara yang lebih baik untuk melakukan ini?
Apakah tidak ada solusi pintar lainnya? Mungkin beberapa rumus matematika? Saya punya ide bahwa calculated_price
ini adalah rasio terhadap beberapa variabel X
dan, ketika mata uang berubah, kami hanya memperbarui variabel itu X
, bukan calculated_price
, jadi kami bahkan tidak perlu memperbarui apa pun (baris) ... Mungkin beberapa ahli matematika dapat menyelesaikannya seperti ini?
calculated_price
sama sekali? Saya hanya bisa menyimpaninitial_currency_value
(kurs mata uang konstan yang diambil, katakanlah, hari ini) dan selalu menghitung terhadap itu! Dan saat menampilkan harga dalam Euro, hitung terhadap nilai tukar mata uang aktual, tentu saja. Apakah saya benar? Atau ada masalah yang tidak saya lihat?