2009-06-14 7 views
11

डेटाबेस चीजों के संबंध में अच्छी चीजों में से एक गिनती, योग, औसत इत्यादि जैसे कुल कार्यों में से एक है लेकिन ऐसा लगता है कि यदि आप जीएई का उपयोग कर रहे हैं, तो रिकॉर्ड डालने या अपडेट करने पर आपको गिनती, योग, औसत, आदि पूरी मेज के मूल्य। लेकिन क्या होगा यदि आपके पास कई सशर्त समूह हैं? यह देखते हुए एक व्यक्ति:क्या Google App Engine पर कुल फ़ंक्शन करने का कोई तरीका है?

class Person { 
    @Id 
    Integer age; 
    String city; 
} 

अगर मैं चाहता हूँ

  1. व्यक्तियों और
  2. औसत उम्र

यह है कि हर मैं बनाने के लिए, अद्यतन को सही या हटाना है की कुल संख्या एक व्यक्ति को मुझे दोनों योगों की गणना भी करनी चाहिए और उन्हें उसी तालिका में अलग-अलग कॉलम के रूप में स्टोर करना चाहिए। यदि मैं प्रति शहर कुल और औसत मूल्य भी चाहता हूं, तो क्या मुझे प्रत्येक शहर के लिए इन मानों को एक ही तालिका में अलग-अलग कॉलम के रूप में स्टोर करना चाहिए?

उत्तर

6

दाएं: जीएई स्टोरेज को सही तरीके से उपयोग करने के लिए, आपको अपने मॉडल के कुछ पहलुओं को चुनिंदा रूप से डी-सामान्य करने की आवश्यकता है, "अनावश्यक" डेटा को रखने के लिए, सामान्य रूप से डीबी में, आप फ्लाई पर फिर से इकट्ठा करेंगे, जैसे समेकन (समग्र और "द्वारा समूहित")।

हालांकि, अपने मामले में Person तालिका में ऐसे फ़ील्ड न जोड़ें - इससे थोड़ा सा अर्थ नहीं मिलता है! शहर के कॉलम (कुल योग के लिए शून्य/अनुपलब्ध) जैसे कॉलम के साथ एक और PersonAggregates तालिका बनाएं, गणना, कुल एज (बनाए रखने में आसान: गिनती से विभाजित कुल के रूप में किसी भी समय औसत गणना करें)।

+0

यह सॉफ्टवेयर देव समय और सीपीयू शुल्कों में अविश्वसनीय रूप से महंगा लगता है। मुझे लगता है कि Google अच्छे कारण के लिए डेटास्टोर से इस तरह से संपर्क करता है, लेकिन मेरी प्रारंभिक प्रतिक्रिया डरावनी है। एलेक्स, एक अच्छी सर्वोत्तम प्रथाओं या दस्तावेज क्या है जो आप मेरे जैसे एसक्यूएल-भारी लोगों को देखेंगे? –

+0

उत्कृष्ट सवाल, और मुझे यह देखकर खुशी हो रही है कि मैंने एकत्रीकरण के लिए एक तरह का निर्माण करके एक अच्छा दृष्टिकोण चुना है। हालांकि, जैसा कि @ जेडी कहते हैं, इस एकत्रीकरण को लागू करना महंगा और त्रुटि-प्रवण हो सकता है। मुझे इसके लिए कोई संपत्ति नहीं मिली है (जैसे 'totalAge = db.AggregateProperty (= Person.age)'। आपको क्या लगता है कि सबसे अच्छा तरीका है? – rds

+0

मुझे अभी http://code.google.com/ मिला appengine/लेख/sharding_counters.html – rds

3

अक्सर उपयोग किए जाने वाले योगों के लिए प्रत्येक अपडेट/डालने/हटाने पर उन्हें अपडेट करना सर्वोत्तम होता है।

आप शुरू से ही अपने आवेदन में इस तरह के समुच्चय नहीं बनाया गया है, तो आप Remote DataStore API के माध्यम से एक स्क्रिप्ट चलाने या एक सर्वर साइड cron job कि सभी संस्थाओं की प्रक्रिया और समुच्चय की गणना करेगा सेट कर सकते हैं। यह काफी आसान है, बस प्रति अनुरोध सीपीयू कोटा ध्यान में रखें।