Tôi muốn làm cho người dùng có thể tìm kiếm sản phẩm trong phạm vi giá. Người dùng sẽ có thể sử dụng bất kỳ loại tiền tệ nào (USD, EUR, GBP, JPY, ...), bất kể sản phẩm được đặt theo loại tiền nào. Vì vậy, giá sản phẩm là 200USD và, nếu người dùng tìm kiếm các sản phẩm có giá 100 EUR - 200 tỷ, anh ta vẫn có thể tìm thấy nó. Làm thế nào để làm cho nó nhanh và hiệu quả?
Đây là những gì tôi đã làm cho đến bây giờ. Tôi lưu trữ price
, currency code
và calculated_price
đó là cái giá bằng Euro (EUR) đó là tiền tệ mặc định.
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';
Nếu người dùng đang tìm kiếm bằng loại tiền khác, giả sử USD, chúng tôi sẽ tính giá bằng EUR và tìm kiếm calculated_price
cột.
SELECT * FROM "products" WHERE calculated_price > 100.0 AND calculated_price < 200.0;
Bằng cách này, chúng tôi có thể so sánh giá rất nhanh, vì chúng tôi không cần tính giá thực tế cho mỗi hàng, vì nó được tính một lần.
Điều tồi tệ là ít nhất mỗi ngày chúng ta phải tính lại default_price
cho tất cả các hàng, vì tỷ giá tiền tệ đã bị thay đổi.
Có cách nào tốt hơn để làm việc này không?
Không có giải pháp thông minh nào khác? Có lẽ một số công thức toán học? Tôi có một ý tưởng rằng calculated_price
tỷ lệ này là một tỷ lệ so với một số biến X
và khi tiền tệ thay đổi, chúng tôi chỉ cập nhật biến đó X
chứ không phải calculated_price
, vì vậy chúng tôi thậm chí không cần cập nhật bất cứ điều gì (hàng) ... Có lẽ một số nhà toán học có thể giải quyết nó như thế này?
calculated_price
tất cả? Tôi chỉ có thể lưu trữinitial_currency_value
(tỷ giá tiền tệ không đổi được thực hiện, giả sử, hôm nay) và luôn luôn tính toán với điều đó! Và khi hiển thị giá bằng Euro, tất nhiên, tính theo tỷ giá tiền tệ thực tế. Tôi có đúng không Hoặc có một vấn đề mà tôi không thấy?