Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

डेटाबेस में ऐतिहासिक लुकअप मानों को सर्वोत्तम तरीके से कैसे प्रबंधित करें?

वर्जनिंग नामक एक तकनीक है जो कई वर्षों से है लेकिन कई कारणों से काफी हद तक अनुपयोगी है। हालांकि, एक ऐसी ही तकनीक है जिसे मैं वर्जन नॉर्मल फॉर्म कहता हूं जिसे मैंने बहुत उपयोगी पाया है। कर्मचारी तालिका का उपयोग करते हुए एक उदाहरण यहां दिया गया है।

सबसे पहले, स्थिर तालिका बनाई जाती है। यह मुख्य निकाय तालिका है और इसमें निकाय के बारे में स्थिर डेटा होता है। स्टेटिक डेटा वह डेटा होता है जो इकाई के जीवन के दौरान बदलने की उम्मीद नहीं करता है, जैसे कि जन्म तिथि।

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 =सत्य जब कंपनी में वापस लौटता है तो ब्याज के समय उस मूल्य की जांच की अनुमति देगा और कर्मचारियों को अनदेखा कर देगा जब वे कर्मचारी नहीं रह गए थे, भले ही वे बाद में लौट आए।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Windows 10 Professional पर Oracle 12c मानक संस्करण स्थापित करना

  2. TNS-12519 w/o अधिकतम प्रक्रियाएं पहुंच गईं

  3. Sql:दो तिथियों के बीच का अंतर

  4. आरएमएएन बैकअप कमांड

  5. NHibernate के साथ एक ही ASP.NET ऐप में Oracle और SQL सर्वर दोनों का समर्थन करने के लिए सिफारिशें