5

मेरे वर्तमान रेल एप्लिकेशन में, मैं "created_at" फ़ील्ड द्वारा मॉडल को सॉर्ट करके शेड्यूलिंग टकराव का समाधान कर रहा हूं। हालांकि, मुझे एहसास हुआ कि एक फॉर्म से कई मॉडल डालने पर यह अनुमति देता है, created_at बार सभी ठीक वही हैं!क्या कोई आपके डेटाबेस में ऑटो-वृद्धिशील प्राथमिक कुंजी पर भरोसा कर सकता है?

यह सर्वोत्तम प्रोग्रामिंग प्रथाओं का एक प्रश्न है: क्या आपका आवेदन आपके डेटाबेस में आपके आईडी कॉलम पर निर्भर करता है ताकि प्रत्येक INSERT के साथ सृजन के क्रम प्राप्त करने के लिए आपके और अधिक से अधिक वृद्धि हो सके? इसे एक और तरीका रखने के लिए, क्या मैं अपने आईडी कॉलम द्वारा अपने डेटाबेस से बाहर पंक्तियों के समूह को सॉर्ट कर सकता हूं और आश्वासन दिया जा सकता है कि यह सृजन आदेश के आधार पर एक सटीक प्रकार है? और क्या यह मेरे आवेदन में एक अच्छा अभ्यास है?

उत्तर

1

यह आपके डेटाबेस विक्रेता पर निर्भर करता है।

MySQL मुझे विश्वास है कि ऑटो वृद्धि कुंजी को पूरी तरह से आदेश देते हैं। एसक्यूएल सर्वर मुझे यकीन नहीं है कि यह करता है या नहीं, लेकिन मुझे विश्वास है कि यह करता है।

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

निर्मित समय और फिर आईडी के लिए एक विकल्प हो सकता है।

+0

मुझे अनावश्यकता का विचार पसंद है, एक करके क्रमबद्ध करना और फिर माध्यमिक प्रकार के लिए आईडी का उपयोग करना। । । धन्यवाद! – BushyMark

+0

ओरेकल अनुक्रमों को गैर-आरएसी प्रतिष्ठानों के लिए आदेश दिया जाता है, जो उनमें से अधिकांश हैं। –

2

उत्पन्न पहचान संख्या अद्वितीय होगी। चाहे आप Segences का उपयोग करते हैं, जैसे PostgreSQL और Oracle में या यदि आप MySQL के ऑटो-वृद्धि जैसे अन्य तंत्र का उपयोग करते हैं।

हालांकि, अनुक्रमों को अक्सर थोक में अधिग्रहित किया जाता है, उदाहरण के लिए 20 संख्याएं। तो PostgreSQL के साथ आप यह निर्धारित नहीं कर सकते कि पहले कौन सा फ़ील्ड डाला गया था। आईडी के सम्मिलित रिकॉर्ड्स में अंतराल भी हो सकता है।

इसलिए आपको किसी कार्य के लिए जेनरेट किए गए आईडी फ़ील्ड का उपयोग नहीं करना चाहिए ताकि डेटाबेस कार्यान्वयन विवरणों पर भरोसा न किया जा सके।

आदेश निष्पादन के दौरान एक बनाया या अद्यतन क्षेत्र पैदा बहुत बाद में creation-, या अपडेट-समय द्वारा छँटाई के लिए बेहतर है। उदाहरण के लिए:

INSERT INTO A (data, created) VALUES (smething, DATE()) 
UPDATE A SET data=something, updated=DATE() 
0

मेरा मानना ​​है कि आपके सवाल का जवाब हां में है ... अगर मैं लाइनों के बीच पढ़ें, मुझे लगता है कि आप चिंतित हैं कि प्रणाली फिर से उपयोग कर सकते हैं पहचान पत्र संख्या में 'लापता' हो रहे हैं अनुक्रम, और इसलिए यदि आपने आईडी संख्याओं के रूप में 1,2,3,5,6,7 का उपयोग किया था, तो मुझे पता चलने वाले सभी कार्यान्वयन में, अगला आईडी नंबर हमेशा 8 (या संभवतः उच्चतर) होगा, लेकिन मैं ' किसी भी डीबी के बारे में पता नहीं है जो रिकॉर्ड आईडी आईडी 4 को याद करने और समझने की कोशिश करेगा, इसलिए उस आईडी नंबर का पुनः उपयोग करने का प्रयास करें।

हालांकि मैं SQL सर्वर से सबसे परिचित हूं, मुझे नहीं पता कि कोई विक्रेता जो अनुक्रम में अंतराल को कोशिश और भरता है - अप्रयुक्त आईडी की उस सूची को रखने के ऊपरी हिस्से के बारे में सोचें, हमेशा ट्रैक रखने के विपरीत अंतिम I संख्या का उपयोग किया गया, और जोड़ना 1.

मैं कहूंगा कि आप सुरक्षित रूप से अगले आईडी असाइन किए गए नंबर पर सुरक्षित रूप से भरोसा कर सकते हैं - केवल अद्वितीय नहीं।

0

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

निर्माण के समय की स्थापना के लिए, तुम सिर्फ एक डिफ़ॉल्ट मान इस

CREATE TABLE foo (
    id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL; 
    created TIMESTAMP NOT NULL DEFAULT NOW(); 
    updated TIMESTAMP; 
    PRIMARY KEY(id); 
) engine=InnoDB; ## whatever :P 

अब, कि निर्माण के समय का ख्याल रखता है की तरह उपयोग कर सकते हैं। अद्यतन समय के साथ मैं इस तरह एक के बाद अद्यतन ट्रिगर सुझाव है (बेशक आप एक अलग प्रश्न में यह कर सकते हैं, लेकिन ट्रिगर, मेरी राय में, एक बेहतर समाधान है - अधिक पारदर्शी):

DELIMITER $$ 
CREATE TRIGGER foo_a_upd AFTER UPDATE ON foo 
FOR EACH ROW BEGIN 
    SET NEW.updated = NOW(); 
END; 
$$ 
DELIMITER ; 

और इससे हो जाना चाहिए।

संपादित करें: हाय मुझे है। मूर्खता से मैंने यह निर्दिष्ट नहीं किया है कि यह mysql के लिए है, फ़ंक्शन नामों (अर्थात्, 'अब') और अन्य सूक्ष्म itty-bitty में कुछ अंतर हो सकते हैं। EJB के जवाब देने के लिए

+1

ओपी ने जो कहा है उसे अनदेखा कर रहे हैं: उसके पास पहले से ही create_at फ़ील्ड है और यह वही है जब एक ही समय में कई आइटम डाले जाते हैं, इसलिए उनका प्रश्न। – cletus

+0

यह वास्तव में प्रतीत होता है कि विचार की मेरी ट्रेन, जो जंगली रूप से स्वस्थ है, वह एक साइड ट्रैक पर भटक गई है। माफ़ कीजिये। आप निश्चित रूप से सही हैं। Create_at द्वारा पहले सॉर्ट करना और फिर आईडी द्वारा, शायद सबसे आसान समाधान है (भले ही यह संभवतः सही क्रम की गारंटी नहीं देता है, यह केवल गारंटी देता है कि समान बनाए गए मानों वाली पंक्तियों को प्रत्येक क्रम में वापस कर दिया जाएगा पहर)। – shylent

0

एक चेतावनी:

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

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

0

यह शायद डीबी इंजन निर्भर है। मैं जांचता हूं कि आपका डीबी अनुक्रमों को कैसे लागू करता है और यदि कोई दस्तावेज समस्या नहीं है तो मैं आईडी पर भरोसा करने का फैसला करूंगा।

उदा। Postgresql sequence ठीक है जब तक आप अनुक्रम कैश पैरामीटर के साथ खेलते हैं।

एक संभावना है कि अन्य प्रोग्रामर गलत आईडी कॉलम के साथ विभिन्न डीबी से मैन्युअल रूप से रिकॉर्ड बना या कॉपी करेगा। हालांकि मैं समस्या को सरल बना दूंगा। कम संभावना वाले मामलों से परेशान न हों जहां कोई डेटा अखंडता को मैन्युअल रूप से नष्ट कर देगा। आप सब कुछ के खिलाफ रक्षा नहीं कर सकते हैं।

मेरी सलाह अनुक्रम उत्पन्न आईडी पर भरोसा करना और अपनी परियोजना को आगे बढ़ाना है।

0

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

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