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?
sumber
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?Saya datang dengan ide saya sendiri. Katakan padaku apakah itu benar-benar akan berhasil!
Masalah.
Ketika produk ditambahkan dalam
products
tabel, harga akan dikonversi ke mata uang default (EUR) dan disimpan dalamcalculated_price
kolom.Kami ingin pengguna dapat mencari (memfilter) harga mata uang apa pun. Ini dilakukan dengan mengubah harga input ke mata uang default (EUR) dan membandingkannya dengan
calculated_price
kolom.Kami perlu memperbarui nilai mata uang, sehingga pengguna dapat mencari berdasarkan nilai mata uang baru. Tetapi masalahnya adalah - bagaimana memperbarui secara
calculated_price
efisien.Solusinya (semoga).
Jangan! :)
Idenya adalah bahwa kita mengambil harga mata uang kemarin ( semua tanggal yang sama ) dalam
calculated_price
penggunaan hanya orang-orang. Seperti ... selamanya! Tidak ada pembaruan harian. Satu-satunya hal yang kita butuhkan sebelum membandingkan / memfilter / mencari harga adalah dengan mengambil nilai tukar hari ini seperti kemarin.Jadi, di
calculated_price
kami hanya akan menggunakan kurs mata uang pada tanggal yang sudah ditentukan (kami telah memilih, katakanlah, kemarin). Yang kita perlukan adalah mengubah harga hari ini menjadi harga kemarin. Dengan kata lain, ambil kurs hari ini dan konversikan ke kurs kemarin:Dan ini adalah tabel mata uang:
Ini adalah cara menambahkan produk yang harganya 200 USD dan bagaimana
calculated_price
penghitungannya: dari USD ke kurs EUR terbaru dan ke kurs tetap (lama)Ini juga bisa pra-dihitung di sisi klien dan itulah yang akan saya lakukan - menghitung harga input pengguna ke nilai yang
calculated_price
kompatibel sebelum kami membuat kueri, sehingga akan ada yang digunakan lama yang baikSELECT * FROM products WHERE calculated_price > 100.0 AND calculated_price < 200.0;
Kesimpulan.
Ide ini datang kepada saya hanya beberapa jam yang lalu dan saat ini saya meminta Anda untuk memeriksa apakah saya benar tentang solusi ini. Bagaimana menurut anda? Apakah ini akan berhasil? Atau saya salah?
Saya harap Anda mengerti semua ini. Saya bukan penutur asli bahasa Inggris, juga sudah terlambat dan saya lelah. :)
MEMPERBARUI
Yah, sepertinya itu menyelesaikan satu masalah, tetapi memperkenalkan yang lain. Sangat buruk. :)
sumber
rate_newest / rate_fixed
perbedaan per mata uang, dan solusi ini hanya mempertimbangkan uang yang dipilih pengguna dalam pencarian. Harga apa pun dalam mata uang yang berbeda tidak akan dibandingkan dengan tarif terbaru. Jawaban yang saya kirimkan entah bagaimana memiliki masalah yang sama tetapi saya pikir saya telah memperbaikinya dalam versi yang diperbarui.