2011-03-28 10 views
5

के साथ प्रीकंप्यूटेड औसत की गणना और भंडारण कहें कि मेरे पास उत्पादों का एक सेट है और प्रत्येक उत्पाद में समीक्षाओं का एक सेट है। प्रत्येक समीक्षा में स्कोर होता है। मुझे अक्सर स्कोर की औसत आवश्यकता होगी तो मुझे वास्तविक समीक्षा की आवश्यकता होगी। औसत पर प्रीकंप्यूटिंग करने और इसे हाइबरनेट के साथ संग्रहीत करने के सर्वोत्तम अभ्यास/साफ तरीके हैं।हाइबरनेट

मैं वर्तमान में समीक्षा तालिका जोड़ने और उत्पाद तालिका में समम कॉलम की समीक्षा करने और गिनती और योग को अपडेट करने के लिए अतिरिक्त समीक्षा विधि को रिगिंग करने की सोच रहा हूं।

मुझे ऐसा करने के क्लीनर तरीके से सुनकर बहुत खुशी होगी।

उत्तर

2

मैं आपकी मूल तालिका पर एक सममूल्य कॉलम रखने के खिलाफ सलाह दूंगा। यदि दो प्रतिस्पर्धी अनुरोध योग कॉलम को अपडेट करने का प्रयास करते हैं, तो कोई असफल हो जाएगा या आप एक स्टेल पढ़ने के साथ योग को क्लॉबरिंग करने का जोखिम उठाएंगे (जब तक कि सिस्टम में उच्च ट्रैफ़िक न हो ...)।

प्रश्नों की आवश्यकता काफी सरल हैं और किसी भी सभ्य db थोड़ी देर (आलसी छद्म एसक्यूएल/HQL) के लिए अच्छा प्रदर्शन प्रस्तुत करना चाहिए:

1) एक उत्पाद के लिए एक विशेष औसत समीक्षा स्कोर:

select sum(score)/count from reviews where product_id = ? 

2) उत्पादों की सूची और उनके औसत समीक्षा स्कोर

select product_name, sum(r.score)/count(r.score) 
from products p 
join reviews r 
group by product_name 

पहले प्रश्न के लिए सुनिश्चित करें कि आप समीक्षा मेज पर product_id पर सूचकांक के कुछ प्रकार किया हुआ है।

हाइबरनेट का उपयोग करके, आप एचक्यूएल या Criteria objects के माध्यम से प्रक्षेपण प्रश्नों का उपयोग कर सकते हैं। यदि यह पर्याप्त तेज़ नहीं है, तो मैं second level caching and query caching पर देखता हूं।

show_sql और टेस्टटेस्टटेस्ट चालू करें यह सुनिश्चित करने के लिए कि हाइबरनेट केवल एक बार डेटाबेस को मार रहा है, और जब नए आइटम जोड़े/अपडेट किए जाते हैं तो आपका कैश अमान्य हो जाता है।

+0

मैं इस के साथ या एक समीक्षा के साथ बंडल करने वाला ट्रिगर जा रहा हूं, जिसमें समीक्षा जोड़ने या अपडेट करने के बाद उत्पाद को CacheMode.REFRESH के साथ प्राप्त किया जा रहा है। – user472749

+0

वास्तव में दूसरे स्तर के कैश से बेदखल करने का एक बेहतर तरीका है। http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-sessioncache – user472749

0

मुझे लगता है कि एक बेहतर तरीका है, हर समय चलाने के लिए एक पृष्ठभूमि प्रक्रिया है और फिर समीक्षा तालिका के आधार पर उत्पाद तालिका में गिनती और कुल रेटिंग के लिए यह अद्यतन करें।

एक और विचार ट्रिगर का उपयोग करना है जब भी समीक्षा/रेटिंग तालिका में कोई अपडेट होता है, यह इसे ध्यान में रखेगा (टाइम स्टाम्प का उपयोग करके) और उत्पाद तालिका अपडेट करेगा।

+0

मेरा विचार इस आधार पर आधारित है कि आपके एप्लिकेशन को जो भी करना है उसका पालन करें। यह कुल या विश्लेषिकी के समान कुछ है, उदाहरण के लिए इसे अलग से संभाला जाना चाहिए। कुछ अन्य दिन आपको "पिछले महीने में रेटिंग वृद्धि" की आवश्यकता हो सकती है, इसलिए हम इस तरह की कार्यक्षमता को हमारे नियमित अपडेट कोड से दूर रखना पसंद कर सकते हैं। – Ankur

+0

यदि कोई ट्रिगर इस्तेमाल किया गया था तो क्या दूसरे डेटा कैश में पुराना डेटा नहीं रहेगा? – user472749

+0

@ user472749 मुझे समझ में नहीं आता कि आप क्या पूछ रहे हैं, अगर हम ट्रिगर का उपयोग करते हैं तो यह उत्पाद तालिका में गिनती को +1 करने के लिए गिनती करेगा और रेटिंग + रेटिंग के लिए रेटिंग करेगा ताकि अगली बार डेटा तालिका से डेटा प्राप्त किया जा सके और औसत गणना की जा सके यह सही होगा। – Ankur

0

Hibernate query caching जाने का रास्ता हो सकता है। अन्यथा, अपने मूल विचार के साथ जाओ।