ฉันต้องการให้ผู้ใช้สามารถค้นหาผลิตภัณฑ์ภายในช่วงราคาได้ ผู้ใช้ควรสามารถใช้สกุลเงินใดก็ได้ (USD, EUR, GBP, JPY, ... ) ไม่ว่าผลิตภัณฑ์จะมีการตั้งค่าสกุลเงินใดก็ตาม ดังนั้นราคาผลิตภัณฑ์คือ 200 ดอลล่าร์สหรัฐฯและหากผู้ใช้ค้นหาผลิตภัณฑ์ที่มีค่าใช้จ่าย 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
(อัตราแลกเปลี่ยนคงที่ที่สมมติว่าวันนี้) และคำนวณกับมันเสมอ ! และเมื่อแสดงราคาเป็นสกุลเงินยูโรให้คำนวณเทียบกับอัตราสกุลเงินจริง ฉันถูกไหม? หรือมีปัญหาที่ฉันไม่เห็น?