2012-11-27 42 views
5

मैं अमेज़ॅन के एडब्ल्यूएस और जावा के लिए इसकी एपीआई के लिए बिल्कुल नया हूं, इसलिए मुझे बिल्कुल यकीन नहीं है कि मैं क्या कर रहा हूं करने की कोशिश कर रहा होगा। असल में, मैं एक डेटाबेस स्थापित करने की कोशिश कर रहा हूं जो किसी उपयोगकर्ता द्वारा एस 3 बाल्टी पर अपलोड होने पर प्रोजेक्ट की आईडी, इसकी स्थिति, साथ ही बाल्टी और स्थान को स्टोर करेगा। मुझे जो समस्या हो रही है, वह उन सभी प्रोजेक्ट आईडी की एक सूची प्राप्त कर रहा है जिनके पास स्थिति विशेषता के तहत "तैयार" की स्थिति है। "तैयार" स्थिति वाली किसी भी परियोजना को बाद में संदर्भ के लिए सरणी या सरणी सूची में लोड होने की आवश्यकता होती है। कोई सिफारिशें?अमेज़ॅन डायनेमो डीबी के गुणों के साथ आइटम प्राप्त करने के लिए ... (जावा एपीआई)

उत्तर

4

ऐसा करने का तरीका स्कैन API का उपयोग करना है। हालांकि, इसका मतलब है कि डायनेमो को आपकी तालिका में प्रत्येक आइटम को देखने की आवश्यकता होगी, और जांचें कि इसकी विशेषता "स्थिति" "तैयार" के बराबर है या नहीं। इस ऑपरेशन की लागत बड़ी होगी, और आपकी मेज में प्रत्येक आइटम को पढ़ने के लिए आपको चार्ज करेगी।

कोड कुछ इस तरह दिखेगा:

Condition scanFilterCondition = new Condition() 
    .withComparisonOperator(ComparisonOperator.EQ.toString()) 
    .withAttributeValueList(new AttributeValue().withS("ready")); 
Map<String, Condition> conditions = new HashMap<String, Condition>(); 
conditions.put("status", scanFilterCondition); 

ScanRequest scanRequest = new ScanRequest() 
    .withTableName("MasterProductTable") 
    .withScanFilter(conditions); 

ScanResult result = client.scan(scanRequest); 

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

इस के लिए कोड कुछ ऐसा दिखाई देगा:

QueryRequest queryRequest = new QueryRequest() 
    .withTableName("ProductByStatus") 
    .withHashKeyValue(new AttributeValue().withS("ready")); 

QueryResult result = client.query(queryRequest); 

इस दृष्टिकोण के लिए नकारात्मक पक्ष यह है कि आप दो तालिकाओं को अद्यतन करने के लिए जब भी आप स्थिति क्षेत्र को अद्यतन किया है, और आप यह सुनिश्चित करें कि आप उन्हें में रखना करने की आवश्यकता सिंक। डायनेमो लेनदेन की पेशकश नहीं करता है, इसलिए आपको उस मामले के लिए तैयार रहना होगा जहां मास्टर प्रोजेक्ट टेबल का अपडेट सफल होता है, लेकिन आपकी माध्यमिक स्थिति तालिका नहीं होती है। या ठीक इसके विपरीत।

आगे के संदर्भ के लिए: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.html

+0

यह लगता है कि यह चाल करेंगे। प्रक्रिया को पहले ही झरना प्रकार के वर्कफ़्लो में संभाला जा चुका है, इसलिए यदि इसका कोई भी भाग अंतिम चरण (जो इस स्थिति को अपडेट करेगा) से पहले विफल हो जाता है, तो यह प्रारंभिक रूप से समाप्त हो जाता है, इसलिए स्थिति केवल तभी अपडेट हो जाएगी जब सब कुछ सफल हो। सहायता के लिए धन्यवाद! – DGolberg

+0

डेढ़ साल बाद, मुझे इसके लिए एक उत्थान मिलता है, लेकिन मुझे दोषी लगता है: डायनेमो डीबी ने माध्यमिक इंडेक्स जारी किए हैं, जो इस उद्देश्य के लिए बनाई गई हैं, बिना किसी अन्य तालिका को प्रबंधित करने की जटिलता के। उनकी जाँच करो! –

+0

लॉल, मैंने देखा कि साथ ही पोस्ट को अपडेट करने पर भी विचार कर रहा था। लेकिन हाँ, द्वितीयक सूचकांक अच्छा है ... हालांकि अभी भी ऐसे उदाहरण हैं जहां आपका मूल उत्तर अभी भी लागू होता है। इस पोस्ट में दिलचस्पी रखने वाले किसी भी व्यक्ति को यह तय करते समय दस्तावेज को पढ़ना सुनिश्चित करें कि क्या वे आपके लिए सबसे अच्छे हैं, खासकर "प्रलेखन के सूचकांक का उपयोग करें" खंड यदि आप सोच रहे हैं कि क्यों (यहां उपलब्ध दस्तावेज: http://docs.aws .amazon.com/amazondynamodb/नवीनतम/developerguide/GuidelinesForLSI.html)। – DGolberg

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^