पृष्ठभूमिएक "संस्था" विशिष्ट अनुक्रम
मैं अलग "बातें" (एक डोमेन विशिष्ट आइटम/संस्था/अधीन) है कि "बात" मालिकों (मानव) के लिए दिखाई दे रहे हैं की एक बहुत कुछ है। मालिक अपनी "चीजें" को एक संख्या के साथ पहचानने जा रहे हैं। इसके बजाए एक बड़ा "यादृच्छिक" नंबर दिखा रहा है, मैं उन्हें एक छोटी संख्या (विशेष रूप से 1 से शुरू होने वाला अनुक्रम) दिखाना चाहता हूं जो मनुष्यों के लिए आसान है। मालिक "मेरे फू 37" और "उसकी बार 128" के बारे में बात करने में बहुत सहज हैं। वहां "अनुक्रम" में अंतराल हो सकता है लेकिन संलग्न वस्तु को "चीज" के जीवनकाल के दौरान समान रहना पड़ता है। इसलिए मुझे "चीज़" उत्पन्न करने का एक तरीका चाहिए + मालिक विशिष्ट आईडी (जिसे वर्तमान में "दृश्य आईडी" कहा जाता है)।
"चीज़" + मालिक संयोजन की संख्या 10k + के पैमाने पर है। वर्तमान में नई "चीजें" गतिशील रूप से जेनरेट नहीं की जा सकती हैं लेकिन मालिक हो सकते हैं।
प्रति मालिक "चीज़" उदाहरणों की संख्या अपेक्षाकृत छोटी है, प्रति मालिक लगभग दसियों, लेकिन व्यापार नियमों से प्राप्त कोई हार्ड कैप नहीं है। नई "चीज़" उदाहरण अक्सर बनाए जाते हैं और हटा दिए जाते हैं।
माना विकल्पों
मैंने पाया एक में एक अच्छा चर्चा अतः Oracle Partitioned Sequence कि बहुत ज्यादा एक ही मुद्दा रहा है तुम्हारे पास के पते सवाल उठाते हैं।
अब तक मैं पर विचार किया है निम्नलिखित विकल्पों:
- मुझे लगता है कि एक मानक डेटाबेस अनुक्रम एक बिल्कुल ठीक हो सकती है, लेकिन है कि मुझे गतिशील रूप से "बात" + मालिक विशिष्ट दृश्यों की एक बड़ी संख्या बनाने के लिए की आवश्यकता होगी और डालने के दौरान अनुक्रम नाम को भी हल करें। (और मालिक चलाए जाने पर अनुक्रमों को छोड़ दें।) मुझे यकीन नहीं है कि अनुक्रमों की एक बड़ी संख्या बनाना एक अच्छा अभ्यास है (मेरे लिए 10k + डेटाबेस ऑब्जेक्ट्स एक बड़ी संख्या है)।
- मैंने कुख्यात
max(visible_id) + 1
भी कुख्यात माना लेकिन हम इसके साथ सामान्य समवर्ती मुद्दों में भाग लेंगे, इसलिए यह कोई नहीं है। - मालिक विशिष्ट आईडी को डेटाबेस में सेव न करें बल्कि इसके बजाय suggestedAdam Musch द्वारा इसे चुनें। यह एक अद्भुत विचार है लेकिन दुर्भाग्यवश आईडी को "चीज़" उदाहरण जीवनकाल के दौरान समान होना चाहिए।
- मालिकों को "चीज़" नाम देकर पूरी समस्या से बचें। लेकिन उन्हें इस विचार को बिल्कुल पसंद नहीं आया - "मुझे परेशान क्यों होना चाहिए, यह foo 16. कहना इतना आसान है।"!
प्रश्न
वहाँ इस मुद्दे के समाधान के लिए या मैं गतिशील दृश्यों का निर्माण शुरू समझने का कोई अन्य रास्ता नहीं है? अगर अनुक्रम उत्तर हैं तो कृपया बताएं कि क्या नुकसान हो सकता है (जैसे डीडीएल में निहित प्रतिबद्धता)।
मुझे ओरेकल 11 जीआर 2 और 12 सी समाधान दोनों में दिलचस्पी है (यदि वे अलग हैं)।
छद्म कोड सवाल वर्णन करने के लिए
create table foo (
id number primary key -- the key for computers
,owner_id number
,visible_id number -- the key for humans
,data_ varchar2(20)
);
create constraint foo_u1 unique foo(owner_id, visible_id);
-- primary key sequence
create sequence foo_id_seq;
insert into foo values(
foo_id_seq.nextval
,1
,1 -- what to put here ?
,'lorem ipsum'
);
insert into foo values(
foo_id_seq.nextval
,2
,1 -- what to put here ?
,'dolor sit amet'
);
select visible_id, data_ from foo where owner = 2 order by visible_id;
विकल्प 3 लागू क्यों नहीं है? चीजें उदाहरण हटा दिए जा सकते हैं? क्या होगा यदि उन्हें हटाए गए के रूप में चिह्नित करें (उदाहरण के लिए अतिरिक्त कॉलम के माध्यम से)? –
मैं यह देखने में असफल रहा हूं कि क्यों # 2 समेकन समस्याएं बनाएगा जब MAX (visual_id) किसी विशेष स्वामी के लिए बाध्य होता है (आप निश्चित रूप से पूरी तालिका को अधिकतम नहीं चाहते हैं)। क्या यह संभावना है कि मालिक एक ही समय में 1 से अधिक आवेदन उदाहरण से अपने आइटम अपडेट कर रहे हैं? ऐसा लगता है कि आपको टेबल, मालिक, चीज़िड पर प्राथमिक कुंजी की आवश्यकता है। थिंगिड को आपके द्वारा उत्पन्न किया जाना होगा, इसलिए मैं अपडेट/डालने/हटाने के लिए संग्रहीत प्रक्रिया का उपयोग करने का सुझाव दूंगा ताकि आप अनुक्रम का प्रबंधन कर सकें, हालांकि आप सीधे डीएमएल ऑपरेशंस को कॉल करने के बजाय – Matt
@ कॉन्स्टेंटिन सोरोकिन वेल ... क्योंकि, त्रुटि ... मैं बस इतना हो सकता हूं कि मैं उस विकल्प के लिए अंधेरा था। हां, मुझे पता है [सॉफ्ट डिलीट] (http://stackoverflow.com/q/2549839/272735) और हाँ मेरा पहला विचार यह है कि यहां काफी अच्छा फिट हो सकता है। मुझे इस विचार और लाभ और कमियों पर अधिक विचार करने की जरूरत है। – user272735