मैं दृष्टिकोण का उपयोग कर रहा हूं, जहां प्रत्येक ऑब्जेक्ट के साथ मैं कम से कम 1 उदाहरण तालिका कहलाता हूं, जहां मैं डेटा को समय के साथ बदलता रहता हूं। आम तौर पर ऐसी सारणी निम्नलिखित अवधारणा का पालन करती हैं:
- उनके पास
_HISTORY
नाम में प्रत्यय है;
- उनके पास 2 अतिरिक्त फ़ील्ड हैं,
start_dt
और end_dt
, ऑब्जेक्ट इंस्टेंस के जीवनकाल को इंगित करता है;
start_dt
NOT NULL
, end_dt
NULL
हो सकता है, जो इंगित करता है कि उदाहरण वर्तमान है और इसके समय में सीमित नहीं है;
- यह है, तो आप
31/Dec-2012 23:59:59
करने के लिए वर्तमान उदाहरण के end_dt
सेट और 1/Jan-2013 00:00:00
की start_dt
साथ एक नया रिकार्ड डालने की आवश्यकता आप चाहते हैं एक नई कंपनी का नाम 1/Jan-2013
से सक्रिय होने के लिए कहते हैं, भविष्य दिनांकित परिवर्तन सम्मिलित करने के लिए संभव है;
- कभी-कभी मैं
revision
फ़ील्ड भी जोड़ता हूं, यदि संशोधन को ट्रैक करना आवश्यक है।
इस तरह के डिज़ाइन के साथ उचित आरआई बाधाओं के लिए, मेरे पास हमेशा संस्करणों के लिए 2 टेबल होते हैं।
customer (customer_id INTEGER, PRIMARY KEY (customer_id));
customer_history (customer_id INTEGER, start_dt TIMESTAMP, end_dt TIMESTAMP,
name VARCHAR(50), sex CHAR(1), ...,
PRIMARY KEY (customer_id, start_dt));
customer_bank_history (customer_id INTEGER, start_dt TIMESTAMP, end_dt TIMESTAMP,
bank_id INTEGER, iban VARCHAR(34));
अन्य सभी स्थानों मैं customer(customer_id)
का उपयोग विदेशी कुंजी बनाने के लिए: कहो, Customer
obejct के लिए मैं टेबल के निम्नलिखित सेट है।वास्तविक ग्राहक विवरण पता कर रहा है सरल है:
SELECT c.customer_id, ch.name, ch.sex
FROM customer c
JOIN customer_history ch ON c.customer_id = ch.customer_id
AND now() BETWEEN ch.start_dt AND coalesce(end_dt, now());
मैं ऐसे डिजाइन क्यों पसंद करते हैं:
- मैं डिजाइन द्वारा डेटाबेस स्तर पर वस्तु उदाहरणों संस्करणीकृत है;
- मुझे कम टेबल बनाए रखना है;
- किसी भी ट्रिगर्स को छोड़ने/अक्षम करने के मामले में इतिहास खोना संभव नहीं है;
- मैं भविष्य में दिनांकित परिवर्तनों की आसानी से योजना बना और रखरखाव कर सकता हूं।
आशा है कि यह आपकी मदद करेगा।
इसलिए मुख्य सारणी में नवीनतम डेटा है। फिर "ऐतिहासिक" तालिकाओं में प्रत्येक संशोधन की प्रतियां होती हैं? क्या यह सामान्यीकरण तोड़ता है? – StackOverflowNewbie
हां, denormalization घटनाओं, यह सादगी के लिए कीमत है (इतिहास राज्य सरल 'INSERT', 'DELETE', मुख्य तालिका पर अद्यतन' से स्वचालित रूप से उत्पन्न होते हैं) और नवीनतम संशोधन का प्रदर्शन (उदाहरण के लिए मुख्य तालिका में डेटा के आधार पर अनुक्रमणिका होती है जबकि इतिहास की तारीख सूचकांक है)। यदि नवीनतम संशोधन के साथ काम करने के लिए मुख्य संशोधन नहीं है, तो यह दृष्टिकोण टूटा सामान्यीकरण से ग्रस्त हो सकता है। – vearutop