2010-05-05 13 views
9

मैं छोटे वेब प्रणाली (यूआरएल shortcutting) nonsql कैसेंड्रा डीबी का उपयोग कर निर्माण करने के लिए कोशिश कर रहा हूँ के साथ autoincrement/अनुक्रम अनुकरण, समस्या मैं ढेर आईडी ऑटो पीढ़ी है।आईडी CassandraDB/MongoDB आदि

क्या कोई इस समस्या से पहले ही खड़ा था?

धन्यवाद।

पीएस UUID मेरे लिए काम नहीं करता है, मुझे 0 से Long.MAX_VALUE (जावा) से सभी नंबरों का उपयोग करने की आवश्यकता है।

कारण है कि मैं GUID आईडी के साथ ठीक नहीं कर रहा हूँ अपने आवेदन के दायरे के अंदर है: तो मैं कुछ है कि वास्तव में एसक्यूएल अनुक्रम

UPDATED तरह काम करता है की क्या ज़रूरत है।

मेरा ऐप हिस्सा shortcutting यूआरएल है, और मैं यूआरएल के रूप में संभव के रूप में कम करने की जरूरत है है। तो मैं अगले दृष्टिकोण का पालन करता हूं: मैं 0 से शुरू होने वाली संख्याएं ले रहा हूं और इसे बेस 64 स्ट्रिंग को परिवर्तित कर रहा हूं। तो परिणामस्वरूप मेरे पास mysite.com/QA जैसे यूआरएल है (जहां क्यूए बेस 64 स्ट्रिंग है)।

यह मैं सिर्फ ऑटो की संख्या बढ़ आईडी, परिवर्तित URL पर और 100-percents यकीन था ले लिया, एसक्यूएल डीबी का उपयोग कर लागू करने के लिए बहुत आसान था, उस यूआरएल अद्वितीय है।

+0

में विस्तार से समझाया क्यों UUIDs नहीं किया जा सकता है और आप nonsql-डेटाबेस क्यों उपयोग करना चाहिए कृपया। शायद हम आपकी समस्या को एक और तरीके से हल कर सकते हैं। – Espo

उत्तर

3

AutoIncrement आईडी स्वाभाविक अच्छी तरह पैमाने पर नहीं है के रूप में वे एक ही स्रोत की जरूरत संख्या उत्पन्न करने के लिए:

निम्नलिखित कैसे आप कुछ भाषाओं में UUIDs उत्पन्न है। यही कारण है कि मोंडोडीबी जैसे शर्देबल/प्रतिकृति डेटाबेस लंबे समय तक उपयोग करते हैं, वस्तुओं के लिए GUID- जैसे पहचानकर्ता। आपको इतनी बुरी कीमतों की इतनी बुरी जरूरत क्यों है?

आप परमाणु वेतन वृद्धि का उपयोग कर, पुराने मूल्य को बनाए रखना यह करने के लिए सक्षम हो सकता है, लेकिन मुझे यकीन है कि नहीं हूँ। यह केवल एकल सर्वर सेटअप तक ही सीमित होगा।

+0

की तरह काम करता है, मेरी समस्या स्रोत की अच्छी समझ के लिए धन्यवाद। कृपया अद्यतन प्रश्न विवरण देखें, धन्यवाद – abovesun

+0

क्या उन्हें लगातार होना है? "1. एमएक्सएक्स (लांग) में यादृच्छिक संख्या चुनें और डालें"। सुनिश्चित करें कि फ़ील्ड में एक अद्वितीय अनुक्रमणिका है। यदि सम्मिलन विफल रहता है, तो एक अलग यादृच्छिक मान के साथ पुनः प्रयास करें। यह परमाणु और सुरक्षित है। और जब तक आपका डीबी आकार 2^31 :) – wump

+0

के पास नहीं जाता है, तो शायद यह दृष्टिकोण मेरे लिए इतना बुरा नहीं है, सच कह रहा है कि मुझे यकीन नहीं है कि कैसंड्रा में एसक्यूएल अद्वितीय बाधा का एनालॉग है, कम से कम मैं इसे अनुकरण करने के लिए नहीं मिला। लेकिन मैंने अभी तक कड़ी मेहनत की कोशिश नहीं की :) – abovesun

-1

मुझे यकीन नहीं है कि मैं आपका अनुसरण करता हूं। आप किस भाषा का उपयोग कर रहे हैं? क्या हम यूयूआईडी के बारे में बात कर रहे हैं?

java.util.UUID.randomUUID(); // (Java) variant 2, version 4 

import uuid // (Python) 
uuid.uuid1() // version 1 
+0

UUID मेरे लिए काम नहीं करता है, मुझे 0 से Long.MAX_VALUE (जावा) से सभी नंबरों का उपयोग करने की आवश्यकता है। तो मुझे कुछ समस्या की आवश्यकता है जो वास्तव में एसक्यूएल अनुक्रम – abovesun

4

कैसंद्रा के बारे में नहीं पता, लेकिन मोंगो के साथ आप परमाणु अनुक्रम प्राप्त कर सकते हैं (यह स्केल नहीं करेगा, लेकिन अगर यह क्वेरी शेड किए गए क्षेत्र में है, तो यहां तक ​​कि किनारे वाले वातावरण में भी काम करेगा)।

यह findandmodify आदेश का उपयोग करके किया जा सकता है।

 
> db.runCommand({ "findandmodify" : "sequences", 
        "query" : { "name" : "postid"}, 
        "update" : { $inc : { "id" : 1 }}, 
        "new" : true }); 

यह आदेश atomically अद्यतन वापस आ जाएगी:

के पर विचार हम एक विशेष संग्रह sequences नामित है, तो आप इस के समान कोड का इस्तेमाल कर सकते हैं और हमने पोस्ट की संख्या (postid नाम) के लिए एक दृश्य करना चाहते हैं (new) स्थिति के साथ एक साथ दस्तावेज। कमांड सफलतापूर्वक पूरा होने पर value फ़ील्ड में लौटा हुआ दस्तावेज़ शामिल है।