वर्जनिंग नामक एक तकनीक है जो कई वर्षों से है लेकिन कई कारणों से काफी हद तक अनुपयोगी है। हालांकि, एक ऐसी ही तकनीक है जिसे मैं वर्जन नॉर्मल फॉर्म कहता हूं जिसे मैंने बहुत उपयोगी पाया है। कर्मचारी तालिका का उपयोग करते हुए एक उदाहरण यहां दिया गया है।
सबसे पहले, स्थिर तालिका बनाई जाती है। यह मुख्य निकाय तालिका है और इसमें निकाय के बारे में स्थिर डेटा होता है। स्टेटिक डेटा वह डेटा होता है जो इकाई के जीवन के दौरान बदलने की उम्मीद नहीं करता है, जैसे कि जन्म तिथि।
create table Employees(
ID int auto_generated primary key,
FirstName varchar( 32 ),
Hiredate date not null,
TermDate date, -- last date worked
Birthdate date,
... -- other static data
);
यह महसूस करना महत्वपूर्ण है कि प्रत्येक कर्मचारी के लिए एक प्रविष्टि होती है, ठीक वैसे ही जैसे किसी तालिका में होती है।
फिर संबंधित संस्करण तालिका। यह स्थिर तालिका के साथ 1-मी संबंध स्थापित करता है क्योंकि एक कर्मचारी के लिए कई संस्करण हो सकते हैं।
create table Employee_versions(
ID int not null,
EffDate date not null,
char( 1 ) IsWorking not null default true,
LastName varchar( 32 ), -- because employees can change last name
PayRate currency not null,
WorkDept int references Depts( ID ),
..., -- other changable data
constraint PK_EmployeeV primary key( ID, EffDate )
);
संस्करण तालिका नोट में एक प्रभावी तिथि है लेकिन मेल खाने वाला अब-प्रभावी फ़ील्ड नहीं है। ऐसा इसलिए है क्योंकि एक बार एक संस्करण प्रभावी हो जाता है, यह तब तक प्रभावी रहता है जब तक कि बाद के संस्करण द्वारा प्रतिस्थापित नहीं किया जाता है। ID और EffDate का संयोजन अद्वितीय होना चाहिए ताकि एक ही कर्मचारी के लिए दो संस्करण नहीं हो सकते जो एक ही समय में सक्रिय हों, और न ही एक संस्करण के समाप्त होने और अगला संस्करण शुरू होने के समय के बीच कोई अंतर हो सकता है।
अधिकांश प्रश्न कर्मचारी डेटा के वर्तमान संस्करण को जानना चाहेंगे। यह कर्मचारी के लिए स्थिर पंक्ति को उस संस्करण के साथ जोड़कर प्रदान किया जाता है जो अभी प्रभावी है। इसे निम्न क्वेरी के साथ पाया जा सकता है:
v1.ID =e.ID और v1.EffDate =पर कर्मचारी ejoin कर्मचारी_संस्करण v1 सेselect ...
from Employees e
join Employee_versions v1
on v1.ID = e.ID
and v1.EffDate =(
select Max( v2.EffDate )
from EmployeeVersions v2
where v2.ID = v1.ID
and v2.EffDate <= NOW()
)
where e.ID = :EmpID;
यह एक और केवल एक संस्करण लौटाता है जो सबसे हाल के दिनों में शुरू हुआ था। दिनांक जाँच में <=असमानता का उपयोग करना (v2.EffDate <= NOW()
) भविष्य में प्रभावी तिथियों की अनुमति देता है। मान लीजिए कि आप जानते हैं कि एक नया कर्मचारी अगले महीने के पहले दिन शुरू होगा या वेतन में वृद्धि अगले महीने की 13 तारीख को निर्धारित है, यह डेटा समय से पहले डाला जा सकता है। ऐसी "प्रीलोडेड" प्रविष्टियों पर ध्यान नहीं दिया जाएगा।
सबक्वायरी को अपने पास न आने दें। सभी खोज फ़ील्ड अनुक्रमित हैं इसलिए परिणाम काफी तेज़ है।
इस डिजाइन में काफी लचीलापन है। उपरोक्त क्वेरी वर्तमान और अतीत के सभी कर्मचारियों का नवीनतम डेटा लौटाती है। आप TermDate
की जांच कर सकते हैं सिर्फ वर्तमान कर्मचारियों को पाने के लिए क्षेत्र। वास्तव में, चूंकि आपके ऐप्स में बहुत सारे स्थान केवल वर्तमान कर्मचारियों की वर्तमान जानकारी में रुचि रखते हैं, इसलिए वह क्वेरी एक अच्छा दृश्य बनाएगी (अंतिम where
को छोड़ दें) खंड)। ऐप्स को यह जानने की कोई आवश्यकता नहीं है कि ऐसे संस्करण मौजूद हैं।
यदि आपके पास कोई विशेष तिथि है और आप उस डेटा को देखना चाहते हैं जो उस समय प्रभावी था, तो v2.EffDate <= NOW()
बदलें। सबक्वेरी में v2.EffDate <= :DateOfInterest
।
अधिक विवरण यहां एक स्लाइड प्रस्तुति में और एक अपूर्ण दस्तावेज़ यहां पाया जा सकता है।
डिज़ाइन की थोड़ी विस्तारशीलता दिखाने के लिए, ध्यान दें कि एक IsWorking
है संस्करण तालिका में संकेतक और साथ ही स्थिर तालिका में समाप्ति तिथि। जब कोई कर्मचारी कंपनी छोड़ता है, तो अंतिम तिथि स्थिर तालिका में डाली जाती है और नवीनतम संस्करण की एक प्रति IsWorking
के साथ डाली जाती है false
पर सेट करें संस्करण तालिका में डाला गया है।
कर्मचारियों के लिए कुछ समय के लिए कंपनी छोड़ना और फिर से काम पर रखना काफी आम है। स्थिर तालिका में सिर्फ तारीख के साथ, उस तारीख को वापस NULL पर सेट करके प्रविष्टि को फिर से सक्रिय किया जा सकता है। लेकिन किसी भी समय के लिए "पीछे मुड़कर देखें" क्वेरी जब वह व्यक्ति अब कर्मचारी नहीं था तो परिणाम लौटाएगा। इस बात का कोई संकेत नहीं होगा कि उन्होंने कंपनी छोड़ दी थी। लेकिन एक संस्करण जिसमें IsWorking
. है =कंपनी छोड़ते समय झूठा और IsWorking
=सत्य जब कंपनी में वापस लौटता है तो ब्याज के समय उस मूल्य की जांच की अनुमति देगा और कर्मचारियों को अनदेखा कर देगा जब वे कर्मचारी नहीं रह गए थे, भले ही वे बाद में लौट आए।