टेम्पोरल और संस्करणयुक्त पंक्तियाँ
वैध-समय और किसी समय विशेष की क्वेरी।
टेम्पोरल और संस्करणयुक्त पंक्तियाँ, CoddyKit पर SQL Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह SQL Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। SQL Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
कालिक तालिकाएँ क्या होती हैं
कालिक तालिकाएँ आपको समय के साथ डेटा में होने वाले बदलावों का लेखा रखने देती हैं। किसी बदलाव पर पंक्ति को अधिलेखित करने के बजाय, कालिक तालिका उस पंक्ति का हर संस्करण सुरक्षित रखती है और हर संस्करण के साथ वह समय-अवधि भी दर्ज करती है जिसमें वह मान्य था।
दो मुख्य अवधारणाएँ हैं: वैध समय (वह समय जब तथ्य वास्तविक दुनिया में सत्य था) और लेन-देन समय (वह समय जब डेटाबेस ने तथ्य दर्ज किया)। दोनों को मिलाने पर एक पूर्ण द्वि-कालिक तालिका मिलती है।
वैध समय बनाम लेन-देन समय
वैध समय बताता है कि कोई तथ्य वास्तविक दुनिया में कब सत्य था—उदाहरण के लिए, किसी कर्मचारी का वेतन 2020-01-01 से 2022-06-30 तक। लेन-देन समय वह समय है जब डेटाबेस की पंक्ति जोड़ी गई या समाप्त हुई। दोनों मिलकर दो प्रश्नों का उत्तर देते हैं: क्या सत्य था? और हमें यह कब पता चला?
अधिकांश व्यावहारिक उपयोग-स्थितियाँ वैध-समय का लेखा रखने से शुरू होती हैं, जिसे आप valid_from और valid_to स्तंभों का उपयोग करके हाथ से लागू कर सकते हैं।
वैध-समय तालिका बनाना
संस्करणित पंक्तियों को संग्रहीत करने का सबसे सरल तरीका valid_from और valid_to समय-मुहर वाले स्तंभ जोड़ना है। valid_to में NULL या भविष्य की बहुत दूर की तारीख, जैसे 9999-12-31, होने का अर्थ है कि पंक्ति अभी सक्रिय है।
CREATE TABLE employee_salary (
id SERIAL PRIMARY KEY,
employee_id INT NOT NULL,
salary NUMERIC(12, 2) NOT NULL,
valid_from DATE NOT NULL,
valid_to DATE
);
INSERT INTO employee_salary (employee_id, salary, valid_from, valid_to)
VALUES
(1, 50000, '2020-01-01', '2022-06-30'),
(1, 60000, '2022-07-01', NULL);वर्तमान संस्करण की क्वेरी करना
हर कर्मचारी की वर्तमान में सक्रिय पंक्ति खोजने के लिए उन पंक्तियों पर फ़िल्टर लगाएँ जिनमें valid_to IS NULL (जिसकी अंतिम सीमा निर्धारित नहीं है) हो, या जिनकी वैध परास में आज की तारीख आती हो। '9999-12-31' जैसे संकेतक मान का उपयोग करने से परास की तुलना सरल हो जाती है।
SELECT employee_id, salary
FROM employee_salary
WHERE valid_to IS NULL
ORDER BY employee_id;निर्दिष्ट-समय की क्वेरियाँ
निर्दिष्ट-समय की क्वेरी यह पूछती है: किसी विशेष समय-बिंदु पर डेटा कैसा था? आप उन पंक्तियों पर फ़िल्टर लगाते हैं जिनकी वैध समय-अवधि के भीतर दी गई समय-मुहर आती है। यह कालिक तालिकाओं की सबसे शक्तिशाली विशेषताओं में से एक है।
-- What was employee 1's salary on 2021-03-15?
SELECT employee_id, salary, valid_from, valid_to
FROM employee_salary
WHERE employee_id = 1
AND valid_from <= '2021-03-15'
AND (valid_to IS NULL OR valid_to > '2021-03-15');संस्करणित पंक्ति का अद्यतन
जब कोई तथ्य बदलता है, तो आप मौजूदा पंक्ति को उसी स्थान पर UPDATE नहीं करते। इसके बजाय, आप उसका valid_to निर्धारित करके मौजूदा पंक्ति को बंद करते हैं और नए मान वाली एक नई पंक्ति INSERT करते हैं। इससे पूरा इतिहास सुरक्षित रहता है।
-- Employee 1 gets a raise effective 2023-01-01
BEGIN;
-- Close the current open row
UPDATE employee_salary
SET valid_to = '2022-12-31'
WHERE employee_id = 1
AND valid_to IS NULL;
-- Insert the new version
INSERT INTO employee_salary (employee_id, salary, valid_from, valid_to)
VALUES (1, 72000, '2023-01-01', NULL);
COMMIT;वैधता अवधियों के लिए तारीख-परास का उपयोग
PostgreSQL का daterange प्रकार वैधता अवधि को एक ही स्तंभ के रूप में सुंदर ढंग से दर्शाता है। आप यह जाँचने के लिए @> (समाहित करने वाला) ऑपरेटर उपयोग कर सकते हैं कि कोई तारीख परास के भीतर आती है या नहीं, और उसी इकाई के लिए अतिव्यापी अवधियों को रोकने हेतु बहिष्करण प्रतिबंध जोड़ सकते हैं।
CREATE TABLE employee_salary_v2 (
id SERIAL PRIMARY KEY,
employee_id INT NOT NULL,
salary NUMERIC(12, 2) NOT NULL,
valid_period DATERANGE NOT NULL,
EXCLUDE USING GIST (employee_id WITH =, valid_period WITH &&)
);
INSERT INTO employee_salary_v2 (employee_id, salary, valid_period)
VALUES
(1, 50000, '[2020-01-01, 2022-07-01)'),
(1, 60000, '[2022-07-01, infinity)');तारीख-परास के साथ निर्दिष्ट-समय की क्वेरी
daterange वाले तरीके से निर्दिष्ट-समय की क्वेरी बहुत आसानी से पढ़ी जा सकती है। @> ऑपरेटर यह जाँचता है कि दी गई तारीख परास के भीतर समाहित है और निचली तथा ऊपरी सीमाओं को अपने-आप संभालता है।
-- What was employee 1's salary on 2021-03-15?
SELECT employee_id, salary, valid_period
FROM employee_salary_v2
WHERE employee_id = 1
AND valid_period @> '2021-03-15'::date;प्रणाली-संस्करणित तालिकाएँ (एसक्यूएल मानक)
SQL:2011 मानक ने प्रणाली-संस्करणित कालिक तालिकाएँ प्रस्तुत कीं। डेटाबेस row_start और row_end लेन-देन-समय वाले स्तंभों का प्रबंधन अपने-आप करता है। PostgreSQL में आप इसका अनुकरण करते हैं; SQL Server और MariaDB में यह SYSTEM VERSIONING के साथ अंतर्निहित है।
नीचे दिया गया उदाहरण इस अवधारणा के संदर्भ के रूप में SQL Server / MariaDB का वाक्य-विन्यास दिखाता है।
-- SQL Server / MariaDB syntax (reference)
CREATE TABLE dbo.Product (
ProductID INT PRIMARY KEY,
Name VARCHAR(100),
Price DECIMAL(10,2),
SysStart DATETIME2 GENERATED ALWAYS AS ROW START,
SysEnd DATETIME2 GENERATED ALWAYS AS ROW END,
PERIOD FOR SYSTEM_TIME (SysStart, SysEnd)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Product_History));कालिक संयोजन: दो तालिकाओं को समय के अनुसार मिलाना
एक सामान्य चुनौती समान समय-अवधियों वाली दो कालिक तालिकाओं को जोड़ना है। उदाहरण के लिए, कर्मचारी के वेतन को विभागीय नियुक्तियों के साथ जोड़ना, जबकि दोनों में वैध-समय की अवधियाँ हों। आप इकाई कुंजी और अतिव्यापन की शर्त पर संयोजन करते हैं; इसके लिए परासों पर && या स्पष्ट तारीख-तुलनाओं का उपयोग किया जाता है।
CREATE TABLE dept_assignment (
employee_id INT,
department VARCHAR(50),
valid_period DATERANGE
);
INSERT INTO dept_assignment VALUES
(1, 'Engineering', '[2020-01-01, infinity)'),
(1, 'Marketing', '[2019-01-01, 2020-01-01)');
-- Periods where employee 1 was in Engineering AND had salary > 55000
SELECT s.salary, d.department,
s.valid_period * d.valid_period AS overlap_period
FROM employee_salary_v2 s
JOIN dept_assignment d
ON s.employee_id = d.employee_id
AND s.valid_period && d.valid_period
WHERE s.employee_id = 1
AND s.salary > 55000;रिक्तियों और अतिव्यापनों को रोकना
कालिक तालिकाओं में डेटा की गुणवत्ता से जुड़ी दो सामान्य समस्याएँ हैं: रिक्तियाँ (ऐसी अवधियाँ जिनका कोई अभिलेख नहीं है) और अतिव्यापन (दो पंक्तियाँ जो एक ही समय में मान्य हैं)। && वाला बहिष्करण प्रतिबंध डेटाबेस स्तर पर अतिव्यापन रोकता है। रिक्तियों का पता लगाने के लिए क्वेरी से यह जाँचना पड़ता है कि कहीं कोई हिस्सा छूटा तो नहीं है।
-- Find gaps in salary history for employee 1
-- (periods where upper(prev) < lower(next))
SELECT
upper(a.valid_period) AS gap_start,
lower(b.valid_period) AS gap_end
FROM employee_salary_v2 a
JOIN employee_salary_v2 b
ON a.employee_id = b.employee_id
AND upper(a.valid_period) < lower(b.valid_period)
WHERE a.employee_id = 1
AND NOT EXISTS (
SELECT 1 FROM employee_salary_v2 c
WHERE c.employee_id = 1
AND lower(c.valid_period) > upper(a.valid_period)
AND lower(c.valid_period) < lower(b.valid_period)
)
ORDER BY gap_start;ज्ञान-परीक्षण
कालिक तालिकाओं और निर्दिष्ट-समय की क्वेरियों की अपनी समझ का परीक्षण करें।
पुनरावलोकन: कालिक और संस्करणित पंक्तियाँ
इस पाठ में आपने वैध-समय वाले स्तंभों और PostgreSQL के daterange प्रकार का उपयोग करके समय के साथ बदलने वाले डेटा का मॉडल बनाना सीखा। मुख्य बातें:
- ऐतिहासिक पंक्तियों को कभी अधिलेखित न करें—पुरानी पंक्ति को बंद करें और नया संस्करण जोड़ें।
- किसी भी पिछले समय-बिंदु का डेटा प्राप्त करने के लिए निर्दिष्ट-समय की क्वेरियाँ (
valid_from <= target AND valid_to > target) उपयोग करें। @>ऑपरेटर वालाdaterangeप्रकार कालिक क्वेरियों को संक्षिप्त और आसानी से पढ़ने योग्य बनाता है।&&(परास का अतिव्यापन) पर लगाए गए बहिष्करण प्रतिबंध डेटाबेस स्तर पर डेटा की अखंडता लागू करते हैं।- कालिक संयोजन उनकी वैध अवधियों का प्रतिच्छेदन करके दो इतिहासों को एक-दूसरे के साथ मिलाते हैं।
ये प्रणालियाँ घटना-स्रोतण, लेखा-परीक्षण दर्ज करने और उन सभी प्रणालियों की नींव हैं जहाँ ऐतिहासिक शुद्धता महत्वपूर्ण होती है।
एआई शिक्षक के साथ SQL सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 46
- पाठ
- 183
अक्सर पूछे जाने वाले प्रश्न
क्या “टेम्पोरल और संस्करणयुक्त पंक्तियाँ” पाठ निःशुल्क है?
हाँ—“टेम्पोरल और संस्करणयुक्त पंक्तियाँ” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और SQL Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। SQL Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“टेम्पोरल और संस्करणयुक्त पंक्तियाँ” में मैं क्या सीखूँगा?
वैध-समय और किसी समय विशेष की क्वेरी। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ SQL Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या SQL Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर SQL Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“टेम्पोरल और संस्करणयुक्त पंक्तियाँ” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस SQL Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर SQL Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- इतिहास क्यों सुरक्षित रखें
- केवल-जोड़े-जाने वाली इवेंट तालिकाएँ
- टेम्पोरल और संस्करणयुक्त पंक्तियाँ
- इवेंट से स्थिति का पुनर्निर्माण