Theory
पिछला bill number क्या था?
Meera जो हर bill छापती है उसे एक unique number चाहिए: 1, 2, 3... कागज़ पर वह पिछला पर्चा देखती है और एक जोड़ती है। पर अब उसका चचेरा भाई भी एक दूसरे counter से bills छापता है, और दो बार उन्होंने दोनों ने number 48 पकड़ लिया, दो अलग sales, वही bill number। audit के वक़्त अफ़रा-तफ़री।
'आख़िरी इस्तेमाल किया number' पर हाथ से नज़र रखना उसी पल टूटता है जब एक से ज़्यादा व्यक्ति एक साथ insert करें। Databases इसे एक sequence से हल करते हैं: एक object जिसका इकलौता काम है अगला number देना, सुरक्षित रूप से, जो भी पूछे। कभी कोई duplicate नहीं।
Theory
बैंक में token dispenser
एक व्यस्त बैंक ग्राहकों से 'कौन आख़िरी था' याद रखने को नहीं कहता। एक token मशीन 41, 42, 43... एक प्रति दबाव देती है, जो भी अगला दबाए उसे। दो लोग लगभग एक ही पल दबाते हैं? उन्हें फिर भी अलग tokens मिलते हैं, मशीन कभी वही number दो बार नहीं देती। एक sequence database numbers के लिए वही token dispenser है: दबाइए (पूछिए), अगली unique value पाइए, गारंटीशुदा।
Practical
A sequence for bill numbers
-- Create the dispenser (Oracle syntax)
CREATE SEQUENCE bill_seq
START WITH 1
INCREMENT BY 1;
-- Ask for the next number each time you insert a bill
INSERT INTO bills (bill_no, item)
VALUES (bill_seq.NEXTVAL, 'Sugar'); -- gets 1
INSERT INTO bills (bill_no, item)
VALUES (bill_seq.NEXTVAL, 'Tea'); -- gets 2
-- MySQL does the same with AUTO_INCREMENT on the column:
-- bill_no INT AUTO_INCREMENT PRIMARY KEYTheory
यह कैसे काम करता है
CREATE SEQUENCE dispenser बनाता है; NEXTVAL अगला number माँगता है (और dispenser को आगे बढ़ाता है); CURRVAL मौजूदा वाले पर झाँकता है।
Options इसे tune करते हैं: START WITH (पहला number), INCREMENT BY (कदम, आम तौर पर 1), MAXVALUE, और CYCLE (max के बाद फिर शुरू)।
ज़्यादातर databases primary key IDs अपने-आप भरने को sequences इस्तेमाल करते हैं, तो आप उन्हें कभी हाथ से नहीं गढ़ते। MySQL वही idea एक column keyword में लपेटता है: AUTO_INCREMENT। अलग syntax, एक-सा मक़सद: unique, अपने-आप बढ़ते numbers।
Quiz
जब दो counters एक ही समय पर bills insert करते हैं, तो Meera के हाथ से 'आख़िरी bill number' पर नज़र रखने से एक sequence बेहतर क्यों है?
- एक sequence गारंटी देता है कि हर request को एक unique number मिले, एक साथ inserts के बावजूद
- एक sequence bills तेज़ी से छापता है
- हाथ से numbering कम storage इस्तेमाल करती है
- एक sequence दो bills को सुरक्षित रूप से एक number साझा करने देता है
Show the answer
एक sequence गारंटी देता है कि हर request को एक unique number मिले, एक साथ inserts के बावजूद
समस्या concurrency थी: दो users एक साथ 'अगला number' पकड़ते हुए दोनों वही आख़िरी value पढ़ते हैं और वही अगला चुनते हैं, एक duplicate। एक sequence DBMS द्वारा प्रबंधित होता है ताकि एक साथ पहुँच के बावजूद भी per request एक unique number दे, token-dispenser गारंटी। यह concurrency-सुरक्षा ठीक वजह है कि databases हाथ की numbering को हराते हैं (DBMS का concurrency काम याद कीजिए)।
Think first
क्या एक sequence numbers छोड़ता है?
Meera देखती है कि उसके bill numbers 47 से 49 पर कूद गए, number 48 गायब है। उसे एक bug का डर है। एक sequence में एक gap क्या असल में एक समस्या है? सोचिए कि NEXTVAL क्या गारंटी देता है।
Show the answer
नहीं, gaps सामान्य और हानिरहित हैं। एक sequence uniqueness और वृद्धि की गारंटी देता है, एक अटूट क्रम की नहीं। एक number NEXTVAL से 'इस्तेमाल' होकर फिर छोड़ा जा सकता है (एक रद्द sale, एक rolled-back insert), एक gap छोड़ते हुए। एक primary key या bill number के लिए जो मायने रखता है वह यह कि numbers unique हों, कभी यह नहीं कि वे लगातार हों। पूरी तरह gap-रहित sequences की उम्मीद एक आम ग़लतफ़हमी है।
Watch out
Marks कहाँ कटते हैं
यह सोचना कि एक sequence कोई gaps नहीं की गारंटी देता है, यह uniqueness की गारंटी देता है, लगातारपन की नहीं (rollbacks gaps छोड़ते हैं)। NEXTVAL (आगे बढ़ाता और अगला लौटाता है) को CURRVAL (बस झाँकता है) से गड्डमड्ड करना। और MySQL समकक्ष न जानना, एक column पर AUTO_INCREMENT। exam-योग्य बिंदु है क्यों sequences मौजूद हैं: स्वचालित, unique, concurrency-सुरक्षित numbering जो हाथ की tracking नहीं दे सकती।
Theory
आप sequences से घिरे हैं
Amazon पर हर order ID, IRCTC पर हर ticket number, Gri-Learn database में हर row ID, एक sequence (या AUTO_INCREMENT) ने इसे बनाया। यह अदृश्य plumbing है जिसे आप अब समझते हैं। पूरा subject पूरा करने को एक lesson बचता है: views, सहेजी हुई queries जो virtual tables की तरह बर्ताव करती हैं। आगे, और आख़िरी: views बनाना और वे असली tables से कैसे अलग हैं।
Summary
Key takeaways
- एक sequence एक database object है जो unique, बढ़ते numbers अपने-आप बनाता है।
- primary keys और bill/invoice numbers के लिए इस्तेमाल होता है ताकि आप कभी आख़िरी वाले पर हाथ से नज़र न रखें।
- CREATE SEQUENCE इसे बनाता है; NEXTVAL अगली value देता है; CURRVAL मौजूदा पर झाँकता है।
- यह concurrency-सुरक्षित है: कई users एक साथ insert करें तब भी कोई duplicate numbers नहीं।
- Gaps हो सकते हैं (rollbacks से) और हानिरहित हैं; यह uniqueness की गारंटी देता है, लगातारपन की नहीं। MySQL AUTO_INCREMENT इस्तेमाल करता है।
- याद रखने का hook: एक बैंक token dispenser, अगले unique number के लिए दबाइए।