/ / NHibernate में अंतहीन, उपयोगकर्ता के अनुकूल आईडी को कैसे कार्यान्वित करें? - asp.net, oracle, nhibernate

NHibernate में अंतराल, उपयोगकर्ता के अनुकूल आईडी को कैसे कार्यान्वित करें? - asp.net, oracle, nhibernate

मैं एक आवेदन डिजाइन कर रहा हूं जहां मेरा Order वस्तुओं को अनुक्रमिक और उपयोगकर्ता के अनुकूल होना चाहिए Id खेत। मैं "से परहेज कर रहा हूँ HiLo इसके बजाय उत्पन्न होने वाले बड़े अंतराल के कारण एल्गोरिदम (देखें यहाँ)। सहज रूप में, Guid मूल्य मेरे कॉर्पोरेट उपयोगकर्ता केले जायेंगे। मैं इसके प्रमुख नुकसान के कारण ओरेकल अनुक्रमों से भी बच रहा हूं:

(से: एनएचबेर्नेट पीओआईडी जेनरेटर ने खुलासा किया)

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

> कुछ कमियां हैं निम्नलिखित:

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

उनके बीच प्रमुख अंतराल के बिना उपयोगकर्ता के अनुकूल आईडी लागू करने पर कोई विचार / अनुभव?

संपादित करें:

  • यूजर फ्रेंडली Id फ़ील्ड वे हैं जिनके कॉर्पोरेट उपयोगकर्ता याद कर सकते हैं और यहां तक ​​कि चर्चा कर सकते हैं और / या किसी विशेष बातचीत के बारे में बात कर रहे हैं Order इसके कोड से, उदा। "मैं" यह जानकर फोन कर रहा हूं कि ऑर्डर # 1625 क्यों अस्वीकार कर दिया गया था। "
  • The Id doesn "t होना चाहिए सख्ती gapless, लेकिन मैं चिंतित हूं कि मेरे उपयोगकर्ताओं को भ्रमित हो जाएगा जब वे १००, २०१, ३०५ जैसे अंतराल देखते हैं ।मेरी पुरानी परियोजनाओं के लिए, मैं वर्तमान में Oracle दृश्यों का उपयोग कर NHibernate को लागू करने के लिए जो कुछ समय कुछ दृश्यों खो जब अपवाद फेंक दिया जाता है, लेकिन अभी तक उंहें रखने के लिए एक जगह साफ आदेश ।उंहें नकारात्मक पक्ष यह है कि वे कैसे काम की इकाई को तोड़ने के लिए डेटाबेस के लिए अतिरिक्त हिट में हर परिणाम Save आदेश के साथ या बिना Session.Flush.

उत्तर:

उत्तर № 1 के लिए 1

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

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

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