2012-12-30 59 views
8

डायनेमोडीबी के लिए नया।डायनेमो डीबी + स्टोर वैल्यू आइटम या JSON

मैं प्राथमिक कुंजी 'उपयोगकर्ता आईडी', समग्र कुंजी 'डेटटाइम' के साथ एक तालिका बना रहा हूं और फिर मेरे पास निम्न मान के रूप में निम्नलिखित है (नोट: मुझे नीचे दिए गए डेटा में किसी भी विशिष्टता से पूछने की आवश्यकता नहीं है - बस लिखें और इसे पढ़ने):

UserID1 
UserID2 
Message 
DateTime 

सवाल:

  1. वहाँ अलग आइटम के रूप में या एक JSON स्ट्रिंग के रूप में इन 4 मूल्यों के भंडारण में किसी भी लाभ है?
  2. उपयोगकर्ता आईडी 1 और संग्रहीत मूल्य में डेटाटाइम भी प्राथमिक/समग्र कुंजी बनाता है - क्या मैं सही मानता हूं कि डेटा/मूल्य में इन्हें संग्रहीत करने में कोई बात नहीं है क्योंकि मैं इसे घुमाते समय वापस की गई कुंजी से एक्सेस कर सकता हूं?

उत्तर

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

  2. हां।

+0

बस संदर्भ शब्दावली का पालन करने के: विशेषताओं का एक सबसेट को पुनः प्राप्त = प्रोजेक्शन – Alireza

6

तो अपने विकल्प हैं:

Hash Key | Range Key | Attributes 
---------------------------------- 
user id | utc time | json data 
---------------------------------- 
user123 | 1357306017 | {UserID1:0, UserID2:0, Message:"", DateTime:0} 

या

Hash Key | Range Key | Attributes 
-------------------------------------------------------------- 
user id | utc time | UserID1 | UserID2 | Message | DateTime 
-------------------------------------------------------------- 
user123 | 1357306017 | 0  | 0  | ""  | 0 

दोनों व्यवहार्य विकल्प हैं, और चुनाव कैसे आप आप एक है, तो डेटा को पढ़ने के लिए, चाहते करने के लिए नीचे आता है प्रत्येक आइटम के लिए विशेषता, तो आप व्यक्तिगत रूप से उन विशेषताओं का अनुरोध कर सकते हैं।

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

भाग दो के लिए, वास्तव में, आप सही हैं, आपको गुणों के हिस्से के रूप में उपयोगकर्ता आईडी और दिनांक समय को फिर से स्टोर करने की आवश्यकता नहीं है क्योंकि वे हैश और रेंज कुंजी हैं, जो अनुरोध करते समय लौटाए जाते हैं।

3

डायनेमो डीबी अब जेसन ऑब्जेक्ट को सीधे भंडारण का समर्थन करता है। पढ़ें: http://aws.amazon.com/blogs/aws/dynamodb-update-json-and-more/

+0

इस है ब्लॉग पोस्ट अब से बाहर है? इसमें कोड कहीं और नहीं देखा गया है जिसे मैंने कहीं भी देखा है –

6
  1. आप अलग AttributeValues ​​के रूप में JSON ब्लॉब में प्रविष्टियों की दुकान सकता है। DynamoDB ने JSON दस्तावेज़ समर्थन को पेश करने से पहले, आपके विकल्प अलग-अलग विशेषताओं तक सीमित थे, या एक "स्ट्रिंग" विशेषता जहां आप उन विशेषताओं के JSON प्रतिनिधित्व को संग्रहीत करते थे। अब जब अमेज़ॅन ने डायनेमो डीबी को जेएसओएन दस्तावेज़ समर्थन पेश किया है, तो आप सीधे इस तरह के विस्तृत विशेषता मानचित्रों को आइटम में स्टोर कर सकते हैं। DynamoDB के लिए नया जावा दस्तावेज़ एसडीके JSON मानों को जोड़ने इस तरह का उपयोग करता है का उपयोग करना, Item.withJSON() विधि,:

    DynamoDB dynamodb = new DynamoDB(client); 
    Table messagesTable = dynamodb.getTable("MESSAGES"); 
    
    // create the item 
    Item item = new Item().withString("UserID", "user123").withString("DateTime", "1357306017") 
        .withJSON("Details", "{ \"UserID1\": 0, \"UserID2\": 0, \"Message\": \"my message\", \"DateTime\": 0}"); 
    
    // put the item 
    messagesTable.putItem(item); 
    
    // get the item 
    Item itemGet = messagesTable.getItem(new KeyAttribute("UserID", "user123"), new KeyAttribute("DateTime", "1357306017")); 
    
  2. मैं Pooky से सहमत में हैश + रेंज कुंजी नकल करने की कोई जरूरत नहीं है कि विवरण मानचित्र।आइटम प्राप्त करने के लिए आपको GetItem का उपयोग करने के लिए इन दोनों की आवश्यकता है।

+1

क्या आपके पास जावास्क्रिप्ट के लिए जेएसओएन दस्तावेज़ पोस्ट करने के लिए नमूना या कोड स्निपेट है। साथ ही, मैं जेएसओएन का उपयोग कर जावास्क्रिप्ट के बारे में वेबसाइट में दस्तावेज़ नहीं ढूंढ सकता। मैंने इस नई सुविधा के बारे में एक हफ्ते पहले जारी किया था। – riseres

2

आप हमेशा अपना डेटा JSON के रूप में संग्रहीत कर सकते हैं और इसे आसानी से पूछ सकते हैं।

{ 
    sequence: "number", 
    UserID1: "id", 
    UserID2: "id", 
    Message: "message text", 
    DateTime: "1234567890" 
} 

मैं यह सोचते हैं रहा है कि अपने उद्देश्य संदेश प्रणाली के कुछ प्रकार है। इस मामले में, UserID1 & UserID2 हैश कुंजी नहीं हो सकता है क्योंकि आपके पास स्पष्ट रूप से डुप्लिकेट प्रविष्टियां होंगी (उदाहरण के लिए UserID1 में एक से अधिक संदेश हैं)।

आपके पास एक अनुक्रमणिका हो सकती है, जो कि एक प्रकार का सत्र आईडी है।

फिर आप संरचना के [डेटटाइम] भाग पर एक द्वितीयक अनुक्रमणिका बना सकते हैं ताकि आप उस सत्र के लिए संदेशों से पूछ सकें जो किसी दिए गए समय टिकट से पुराने हैं।

0

DynamoMapper के साथ आप जावा में ऐसा कर सकता है:

@DynamoDBTable(tableName = "myClass") 
public class MyClass { 

    @DynamoDBHashKey(attributeName = "id") 
    private String id; 

    @DynamoDBRangeKey(attributeName = "rangeKey") 
    private long rangeKey; 

    @DynamoDBTypeConvertedJson 
    private Content content; 

} 

और सामग्री वर्ग हो सकता है:

public class Content { 

    @JsonProperty 
    private List<Integer> integers = new ArrayList(); 

    @JsonProperty 
    private List<String> strings = new ArrayList(); 

}