2016-05-06 7 views
17

में प्राथमिक कुंजी आईडी के लिए ऑटो वृद्धि का उपयोग कैसे करें मैं डायनेमोडब के लिए नया हूं। जब मैं डायनेमोड के साथ putitem का उपयोग करता हूं तो मैं ऑटो वृद्धि आईडी मान चाहता हूं।डाइनेमोड

ऐसा करना संभव है?

+0

की संभावित डुप्लिकेट पर टाइमस्टैम्प + यादृच्छिक इंस्टाग्राम के Sharding आईडी पीढ़ी से प्रेरित उपयोग कर रहा है [DynamoDB में एक UUID बनाने के लिए?] (Http://stackoverflow.com/प्रश्न/11721308/कैसे-टू-मेक-ए-यूयूआईडी-इन-डायनेमोडब) – Clarkie

+0

या यह एक http://stackoverflow.com/questions/13264236/dynamodb-auto-incremented-id-server-time-ios-sdk – Clarkie

उत्तर

18

डायनेमोडीबी इसे बॉक्स से बाहर नहीं प्रदान करता है। आप अपने आवेदन में कुछ उत्पन्न कर सकते हैं जैसे यूयूआईडी जो अधिकांश सिस्टम के लिए "अद्वितीय" होना चाहिए।

मैंने देखा कि आप Node.js का उपयोग कर रहे थे (मैंने आपका टैग हटा दिया)। node-uuid

README

var uuid = require('node-uuid'); 
var uuid1 = uuid.v1(); 
var uuid2 = uuid.v1({node:[0x01,0x23,0x45,0x67,0x89,0xab]}); 
var uuid3 = uuid.v1({node:[0, 0, 0, 0, 0, 0]}) 
var uuid4 = uuid.v4(); 
var uuid5 = uuid.v4(); 
+0

एफडब्ल्यूआईडब्ल्यू मैं डायनेमो के साथ इस दृष्टिकोण (हैश कुंजी के रूप में यूयूआईडी) का उपयोग करता हूं और यह बहुत अच्छा काम करता है। – rpmartz

+1

यह उत्तर सही उत्तर के रूप में चिह्नित किया जाना चाहिए। यह ध्यान देने योग्य भी है कि क्यों: आप चाबियों का एक समान वितरण चाहते हैं, और ऑटो-वृद्धि से गैर-वर्दी वितरण होता है। अधिक जानकारी के लिए यह आलेख देखें: https://forums.aws.amazon.com/thread.jspa?messageID=312527 और यहां एडब्ल्यूएस दस्तावेज़: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ BestPractices.html –

8

यह DynamoDB में विरोधी पैटर्न जो भर में कई विभाजन/टुकड़े/सर्वर पैमाने पर करने का निर्माण होता है है से उदाहरण: यहाँ एक पुस्तकालय है कि UUID सुविधा प्रदान करता है है। डायनेमोडीबी स्केलिंग सीमाओं के कारण ऑटो-वृद्धि प्राथमिक कुंजी का समर्थन नहीं करता है और एकाधिक सर्वरों पर गारंटी नहीं दी जा सकती है।

बेहतर विकल्प एकाधिक सूचकांक से प्राथमिक कुंजी को इकट्ठा करना है। प्राथमिक कुंजी 2048 बाइट तक हो सकती है। वहाँ कुछ विकल्प हैं:

  1. उपयोग अपने प्रमुख के रूप में UUID - संभवतः समय आधारित UUID जो यह अद्वितीय, समान रूप से वितरित करता है और समय मूल्य वहन करती है
  2. उपयोग यादृच्छिक रूप से जनरेट नंबर या टाइमस्टैम्प + यादृच्छिक (संभवतः बिट स्थानांतरण) की तरह: ts < < 12 + random_number
  3. अन्य सेवा या DynamoDB ही वृद्धिशील विशिष्ट आईडी उत्पन्न करने के लिए उपयोग करें (अतिरिक्त कॉल की आवश्यकता है)

कोड के बाद ऑटो जाएगा डायनेमो डीबी में वृद्धि काउंटर और फिर आप इसे प्राथमिक कुंजी के रूप में उपयोग कर सकते हैं।

var documentClient = new AWS.DynamoDB.DocumentClient(); 
var params = { 
    TableName: 'sampletable', 
    Key: { HashKey : 'counters' }, 
    UpdateExpression: 'ADD #a :x', 
    ExpressionAttributeNames: {'#a' : "counter_field"}, 
    ExpressionAttributeValues: {':x' : 1}, 
    ReturnValues: "UPDATED_NEW" // ensures you get value back 
}; 
documentClient.update(params, function(err, data) {}); 
// once you get new value, use it as your primary key 

मेरा व्यक्तिगत पसंदीदा http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram

var EPOCH = 1300000000000; 
function generateRowId(subid) { 
    var ts = new Date().getTime() - EPOCH; // limit to recent 
    var randid = Math.floor(Math.random() * 512); 
    ts = (ts * 64); // bit-shift << 6 
    ts = ts + subid); 
    return (ts * 512) + (randid % 512); 
} 
var newPrimaryHashKey = "obj_name:" + generateRowId(4); 
+0

क्या आप अपने दूसरे बिंदु और अंत में कोड के बारे में अधिक जानकारी जोड़ सकते हैं? क्या 'subId' एक शर्ड आईडी या कुछ होना चाहिए? – andrhamm

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

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