2012-03-10 17 views
6

पर अनुक्रमिक संख्याएं उत्पन्न करने का कुशल तरीका यह मानते हुए कि SQL Azure Federations पहचान गुण या SEQUENCEs का समर्थन नहीं करता है, रिकॉर्ड डालने पर अनुक्रमिक संख्याएं उत्पन्न करने का एक प्रभावी तरीका क्या होगा?SQL Azure Federations

उदाहरण के लिए, इन स्तंभों साथ एक मेज दिया:

CREATE TABLE [dbo].[Orders] (
    [TenantId] [uniqueidentifier] NOT NULL, 
    [OrderId] [uniqueidentifier] NOT NULL, 
    [OrderNumber] [int] NOT NULL 
    CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED (
     [TenantId] ASC, 
     [OrderId] ASC 
    ) 
) FEDERATED ON ([FederationKey] = [TenantId]) 

एक दिया किरायेदार के लिए डाला प्रत्येक आदेश के लिए, OrderID वृद्धि की जानी चाहिए। उदाहरण के लिए, टेंटेंट ए ऑर्डर आईडी के लिए 1, 2, 3 होगा ... और किरायेदार बी ऑर्डर आईडी के लिए एक स्वतंत्र अनुक्रम में 1, 2, 3 ... भी होगा। आदर्श रूप से कोई अंतराल नहीं होना चाहिए।

किरायेदार आईडी और ऑर्डर आईडी प्राथमिक कुंजी के घटक हैं। उनके मूल्य आवेदन द्वारा निर्धारित किए जाते हैं और वे अनुक्रम उत्पन्न करने के मुद्दे से संबंधित नहीं हैं; केवल ऑर्डर आईडी में व्यावसायिक अर्थ के साथ अनुक्रमिक संख्या है। इसके अलावा, TenantId संघ की वितरण कुंजी है।

This MSDN Blog article विकल्प 1 में अनुक्रमों को धारण करने वाली तालिका रखने और अनुक्रमों को बढ़ाने के लिए एक पृथक लेनदेन में संग्रहीत प्रक्रिया का उपयोग करने का एक दृष्टिकोण है। प्रत्येक किरायेदार के पास अनुक्रम के अंतिम उपयोग मूल्य वाले इस तालिका पर एक रिकॉर्ड होगा।

क्या यह स्केलेबिलिटी, विवाद, संसाधन लॉकिंग पर विचार करने वाला इष्टतम दृष्टिकोण होगा? एसक्यूएल एज़ूर फेडरेशन की सीमाओं पर विचार करते हुए कोई अन्य उपयोगी चाल?

उत्तर

2

यहां 2 अतिरिक्त विचार हैं।

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

और फिर आपके पास गरीबों का आदमी दृष्टिकोण है ... जो सितारों ने खुद को संरेखित किया है, बस आपको बस इतना ही आवश्यक हो सकता है। यदि आप आशावादी समेकन दृष्टिकोण प्राप्त करने के इच्छुक हैं, तो सम्मिलित करने के दौरान अगली संख्या का उपयोग करने का प्रयास करें (किसी दिए गए TenantId और OrderId के लिए पहले MAX आदेश संख्या चुनें), फिर सम्मिलित करें। यदि सम्मिलन विफल रहता है (क्योंकि आपने उस उद्देश्य के लिए TenantId, ऑर्डर नम्बर पर एक अनन्य अनुक्रमणिका जोड़ा है), तो ऑर्डर नम्बर में केवल 1 जोड़ें। असली मुद्दा यहां रीट्रीज़ की आवृत्ति है और इस दृष्टिकोण की संभावना विफल रही है। यदि आपके पास अपेक्षाकृत सुव्यवस्थित व्यावसायिक प्रक्रिया है तो यह वास्तव में असफल नहीं हो सकता है; यदि यद्यपि आपके पास कई मार्गों से निरंतर आदेश जोड़े गए हैं, तो यह एक अस्वीकार्य दृष्टिकोण हो सकता है।

+0

महान जवाब है, (एक अलग कनेक्शन का उपयोग कर रिकॉर्ड अपडेट करने के लिए संग्रहीत प्रक्रिया का उपयोग करके), आपका पहला विकल्प कुछ जटिलता की लागत पर बड़ी स्केलेबिलिटी और थ्रूपुट प्रदान करता है; दूसरा विकल्प काफी सरल है और प्रक्रिया सुव्यवस्थित होने पर पर्याप्त हो सकती है (उदाहरण के लिए एक संदेश कतार का उपयोग करना) या जब प्रत्येक किरायेदार के लिए नए आदेश निर्माण की दर बहुत अधिक नहीं होती है। –

2

यकीन नहीं कितना प्रयास अपने परिदृश्य फिट करने के लिए है, लेकिन साथ ही इस पर एक नजर है और यदि आप इसे ठीक कर सकते हैं देखने के लिए आवश्यक होगा: विकल्प मैं अपने सवाल में उद्धृत के अलावा SnowMaker – a unique id generator for Azure (or any other cloud hosting environment)

+1

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

+0

क्या आप अभी भी इसका उपयोग करने की सलाह देंगे? –