2012-03-27 15 views
7

द्वारा ऑर्डर करें मैं एक ऐसी वेबसाइट बना रहा हूं जिसमें एक इच्छा सूची है। मैं एज़ूर टेबल स्टोरेज में इच्छा सूची को स्टोर करना चाहता हूं, लेकिन यह भी चाहता हूं कि उपयोगकर्ता अपनी इच्छा सूची को सॉर्ट करने में सक्षम हो, इसे देखते समय, कई अलग-अलग तरीकों - डेट जोड़ा गया, डेट जोड़ा गया, आइटम नाम इत्यादि। मैं पेजिंग को भी कार्यान्वित करना चाहता हूं जो मुझे विश्वास है कि मैं निरंतर टोकन का उपयोग करके कार्यान्वित कर सकता हूं।Azure टेबल संग्रहण:

जैसा कि मैं इसे समझता हूं, "ऑर्डर बाय" लागू नहीं किया गया है और तालिका भंडारण से परिणाम लौटाए जाने वाले क्रम विभाजन कुंजी और पंक्ति कुंजी पर आधारित हैं। इसलिए यदि मैं पेजिंग और सॉर्टिंग को कार्यान्वित करना चाहता हूं, तो मैं अलग-अलग विभाजन कुंजी/पंक्ति कुंजी के साथ इच्छा सूची को कई बार संग्रहीत करके इसे कार्यान्वित करने का सबसे अच्छा तरीका है?

इस साधारण मामले में, यह संभावना है कि इच्छा सूची बड़ी नहीं होगी और मैं वास्तव में सूची में दिखाई देने वाली अधिकतम संख्या को प्रतिबंधित कर सकता हूं, फिर पेजिंग से छुटकारा पाएं और स्मृति में सॉर्ट करें। हालांकि, मेरे पास अधिक जटिल मामले हैं जिन्हें मुझे पेजिंग और सॉर्टिंग को लागू करने की भी आवश्यकता है।

उत्तर

8

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

एक वैकल्पिक समाधान, अस्थायी रूप से आपकी पंक्तियों को एसक्यूएल एज़ूर में चरणबद्ध करना होगा और वहां एक ऑर्डर लागू करना होगा। यह प्रभावी हो सकता है यदि आपका परिणाम सेट स्मृति में काम करने के लिए बहुत बड़ा है। सर्वोत्तम परिणामों के लिए अस्थायी तालिका में आवश्यक अनुक्रमणिका होना आवश्यक होगा।

+0

मैं स्मृति में तरह की तरह करने के लिए झुका रहा हूं और बाद में इसके बारे में चिंता कर रहा हूं अगर यह बोतल की गर्दन बन जाए। – s1mm0t

+0

... हालांकि आपका दूसरा सुझाव दिलचस्प है। क्या आपने कभी ऐसा कुछ किया है? विभिन्न भंडारण के बीच डेटा स्थानांतरित करना खुद को ऐसा कुछ लगता है जो धीमा होगा। – s1mm0t

+0

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

2

इस सूची का उपयोग कर .NET में यह सब क्यों नहीं करें।

इस प्रकार के आवेदन के लिए मैंने सोचा होगा कि एसक्यूएल एज़ूर अधिक उपयुक्त होगा।

+0

इच्छा सूची के मामले में एक सूची/IENumerable हो सकता है उपयुक्त है, लेकिन मेरे पास अन्य समान स्क्रीन हैं जहां 1000 के परिणाम हो सकते हैं।मैं स्मृति में यह सब नहीं करना चाहता हूं। मैं लागत के कारण इस मामले में एसक्यूएल एज़ूर के पक्ष में टेबल स्टोरेज का उपयोग कर रहा हूं। – s1mm0t

+0

1000 पंक्तियों के लिए मेमोरी बिल्कुल नहीं है। साथ ही जब आप लागत लाभ निर्धारित करते हैं तो आपको अपने समय के बारे में सोचना होगा। यदि आप SQL Azure का उपयोग करने से प्रति माह एक घंटे या अधिक समय बचाने जा रहे हैं, तो यह SQL Azure का उपयोग करने के लिए कहीं अधिक लागत प्रभावी है। जब तक आप बड़े डेटा से निपट नहीं रहे हैं और मेरा मतलब है, एसक्यूएल एज़ूर पर टेबल स्टोरेज का लागत लाभ समान नहीं है। –

+0

मैंने आपको प्लस +1 दिया। यह हमेशा लागत या आकार के बारे में नहीं है। एक बहु किरायेदार आवेदन के लिए जहां आप भंडारण तालिका बनाने वाले डेटा को अलग करना चाहते हैं, डेटाबेस बनाने से आसान और तेज़ है। – Paparazzi

-1

कुछ इस तरह मेरे लिए ठीक काम किया:

List<TableEntityType> rawData = 
    (from c in ctx.CreateQuery<TableEntityType>("insysdata") 
    where ((c.PartitionKey == "PartitionKey") && (c.Field == fieldvalue)) 
    select c).AsTableServiceQuery().ToList(); 
List<TableEntityType> sortedData = rawData.OrderBy(c => c.DateTime).ToList(); 
+5

यह स्मृति – BritishDeveloper

+0

में पंक्तियों को सॉर्ट करेगा, यह मूल प्रश्न को अनदेखा करता है जिसमें स्कोप में पेजिंग शामिल है, न केवल सॉर्टिंग। –

0

Azure संग्रहण lexicographical क्रम में संस्थाओं, प्राथमिक और माध्यमिक सूचकांक सूचकांक के रूप में पंक्ति कुंजी के रूप में विभाजन कुंजी द्वारा अनुक्रमित रहता है। सामान्य रूप से आपके परिदृश्य के लिए ऐसा लगता है जैसे UserId विभाजन कुंजी के लिए एक अच्छा फिट होगा, इसलिए आपके पास प्रत्येक क्वेरी के लिए अनुकूलित करने के लिए पंक्ति कुंजी है।

यदि आप चाहते हैं कि उपयोगकर्ता शीर्ष पर नवीनतम इच्छा सूची को देखना चाहें, तो आप लॉग पूंछ पैटर्न का उपयोग कर सकते हैं, जहां आपकी पंक्ति कुंजी उल्टा तिथि होगी जब दिनांक सूची उपयोगकर्ता की इच्छा सूची में दर्ज की गई थी। https://docs.microsoft.com/en-us/azure/storage/storage-table-design-guide#log-tail-pattern

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

जब आप डेटा लिख ​​रहे हैं तो आप डेटा को denormalize करना चाहते हैं और इन अलग पंक्ति कुंजी स्कीमा के साथ कई लिखते हैं। चूंकि आपके पास उपयोगकर्ता आईडी के समान विभाजन कुंजी होगी, इसलिए आप उस चरण में बैच डालने का ऑपरेशन कर सकते हैं और स्थिरता के बारे में चिंता न करें क्योंकि एज़ूर टेबल बैच ऑपरेशंस परमाणु हैं।

विभिन्न पंक्तिकी स्कीमा को अलग करने के लिए, आप प्रत्येक को एक कॉन्स स्ट्रिंग मान के साथ प्रीपेड करना चाह सकते हैं। उदाहरण के लिए आपके उलटा टिकों की पंक्ति कुंजी मान की तरह "इनवर्टेडटिक्स_ [इनवर्टेडडेट टाइमटाइमऑफ द विशलिस्ट]" और आपके आइटम नाम पंक्ति कुंजी मान "ItemName_ [ItemNameOfTheWishList]"

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