मैं मूल्य सीमा के भीतर उत्पादों को खोजने के लिए उपयोगकर्ता के लिए संभव बनाना चाहता हूं। उपयोगकर्ता को किसी भी मुद्रा (USD, EUR, GBP, JPY, ...) का उपयोग करने में सक्षम होना चाहिए, इससे कोई फर्क नहीं पड़ता कि उत्पाद किस मुद्रा द्वारा निर्धारित है। तो, उत्पाद की कीमत 200USD है और, यदि उपयोगकर्ता उन उत्पादों को खोजता है जिनकी लागत 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
(निरंतर मुद्रा दर जो ली जाती है, चलो कहते हैं, आज) और हमेशा उसी के खिलाफ गणना करें! और यूरो में कीमत प्रदर्शित करते समय, वास्तविक मुद्रा दर के खिलाफ गणना करें, निश्चित रूप से। क्या मैं सही हू? या कोई समस्या है जो मुझे दिखाई नहीं दे रही है?