2009-09-30 8 views
6
नहीं

मैं एक एकीकरण परियोजना जिसमें मैं रिकॉर्ड , बदल लेकिन केवल एक के आधार पर के लिए क्वेरी करने के लिए सक्षम होना चाहिए के लिए डेटाबेस स्कीमा है या नहीं उस रिकॉर्ड के भीतर फ़ील्ड का दिया गया सेट।का ट्रैक रखने के लिए एक डेटाबेस रिकॉर्ड हैश को लागू करने में एक रिकॉर्ड या बदल गया है

तो, उदाहरण के लिए, यहां एक उदाहरण तालिका है:

ग्राहकों

  • आईडी
  • नाम
  • फोन
  • फैक्स
  • शेष

मुझे उन अभिलेखों को लाने के लिए पूछताछ करने की आवश्यकता है जिनके नाम, फोन या फ़ैक्स फ़ील्ड बदल गए हैं। हालांकि, अन्य क्षेत्रों के खाते में नहीं, यानी, लिया जाना चाहिए अगर बस बकाया राशि फ़ील्ड में परिवर्तन मेरी क्वेरी खींच नहीं चाहिए कि में रिकॉर्ड (इस प्रकार, एक टाइमस्टैम्प क्षेत्र है कि जब कभी भी रिकॉर्ड संशोधित किया गया है अद्यतन करता काम नहीं करता है)।

इसके अलावा, इसे कई अलग-अलग डेटाबेस और प्लेटफॉर्म पर चलाना पड़ता है, इसलिए ट्राइगर्स या कुछ समान रूप से एक विकल्प नहीं है जब तक कि वे MySQL, PostgreSQL, SQL सर्वर, और SQLLite पर नहीं चलेंगे।

फ़ील्ड्स को किसी तृतीय-पक्ष एप्लिकेशन द्वारा संशोधित किया गया है जिसे मैं संशोधित नहीं कर सकता, इसलिए मैं केवल ध्वज नहीं जोड़ सकता और तीसरे पक्ष के एप्लिकेशन को किसी भी प्रासंगिक फ़ील्ड को संशोधित करते समय ध्वज को TRUE पर सेट कर सकता हूं।

मेरा प्रारंभिक समाधान प्रासंगिक फ़ील्ड के एक HASH की गणना करना और इसे 'LastHash' या किसी नए फ़ील्ड में संग्रहीत करना है। फिर, मैं वर्तमान में रिकॉर्ड में मौजूद डेटा के लिए प्रासंगिक फ़ील्ड के हैश की गणना कर सकता हूं, और यदि यह संग्रहीत LastHash से मेल नहीं खाता है, तो मुझे पता है कि यह बदल गया है।

यह बहुत गन्दा लगता है ... लेकिन ऐसा लगता है जैसे यह काम करेगा। क्या कोई बेहतर तरीका है? यदि नहीं, तो क्या हैश को लागू करने का कोई अच्छा तरीका है, इसलिए यह उन परिवर्तनित रिकॉर्ड्स को निकालने के लिए कुशल और बहुत समय लेने वाला नहीं है?

संपादित

कुछ स्पष्टीकरण: अपने आवेदन दोनों और अन्य अनुप्रयोग अद्यतन और इन तालिकाओं में सम्मिलित करें। मैं कर सकता हूं मेरा आवेदन प्रारंभिक हैश की गणना करता है। मैं अन्य एप्लिकेशन को इसकी गणना नहीं कर सकता हूं।

टाइमस्टैम्प कॉलम जो स्वचालित रूप से जब भी एक रिकॉर्ड परिवर्तन सक्षम होते हैं स्वचालित रूप से अपडेट होते हैं, तो वे विभिन्न कॉलम प्रकारों या बहुत ही सरल ट्रिगर्स का उपयोग करके सभी डेटाबेस सिस्टम में दोहराने के लिए पर्याप्त आसान होते हैं।

अतिरिक्त प्रश्न

हैशिंग जाना ... जिस तरह से कुशल हैश एल्गोरिथ्म कि हमेशा के लिए नहीं ले इन रिकॉर्ड के सभी पर गणना करने के लिए होगा किसी भी प्रकार वहाँ है है? एमडी 5 या एसएचए 1 काम कर सकता है, लेकिन ऐसा लगता है कि वे sllloowwww होंगे।

+1

ट्रिगर्स के उपयोग के बिना उस हैश को कैसे डालें/अपडेट करें या ऐप को ऐप को संशोधित करें? –

+0

संपादित करें: मैं अपना आवेदन प्रारंभिक हैश की गणना कर सकता हूं। मैं अन्य एप्लिकेशन को इसकी गणना नहीं कर सकता हूं। –

उत्तर

2

यह एक कठिन है। आपको अभी भी स्कैन (या इंडेक्स स्कैन) टेबल करना होगा, क्योंकि आपको नए हैश की गणना करना है और पुराने हैश को संग्रहीत करना है।

यदि क्रॉस-प्लेटफ़ॉर्म चिंताओं के कारण ट्रिगर्स संभव नहीं हैं, तो हो सकता है कि आप डेटाबेस इंजन को वर्तमान हैश की गणना कर सकें (यानी लगातार गणना की गई कॉलम - प्रभावी रूप से ट्रिगर की तरह)। हालांकि यह क्रॉस-प्लेटफ़ॉर्म समस्या भी है! फिर यदि आप वर्तमान हैश और आपके हैश को अनुक्रमित करते हैं, तो यह अपेक्षाकृत आसान खोज है।

क्या आप कम से कम टाइमस्टैम्प फ़ील्ड का उपयोग कर सकते हैं ताकि आपको जांचने के लिए आवश्यक हैश की संख्या को कम किया जा सके?

याद रखने की एक और बात यह है कि एक परिपूर्ण हैश फ़ंक्शन जैसी कोई चीज़ नहीं है, इसलिए आपको संभावित रूप से झूठी नकारात्मकताएं मिल सकती हैं (अनजान हैश टकराव एक परिवर्तन की पहचान नहीं करता है)। क्या वह (खगोलीय रूप से छोटा) जोखिम लेने लायक है?

+0

हैश के साथ टाइमस्टैम्प का उपयोग करने का विचार एक अच्छा है, मुझे यह पसंद है। यह प्रदर्शन को बेहतर रखना चाहिए। मुझे लगता है कि हैश टकराव ढूंढने की संभावना बहुत कम है। अगर मैं पाया कि एमडी 5 पर्याप्त नहीं था तो मैं SHA1 या कुछ का उपयोग कर सकता था। –

+0

यदि आपको आवश्यकता नहीं है तो एक तरफा क्रिप्टोग्राफ़िक हैश का उपयोग न करें। एमडी 5 और एसएचए 1 (हालांकि कमजोर) क्रिप्टोग्राफिक हैंश के रूप में डिजाइन किए गए हैं। सीआरसी 32 या सीआरसी 64 जैसे कुछ का उपयोग करना अधिक प्रदर्शनकारी होगा। – scotru

+0

@ स्कॉट्रू - सीआरसी का उपयोग परिवर्तन-ट्रैकिंग के लिए नहीं किया जाना चाहिए। मैं इस टिप्पणी पर इसका आधार बना रहा हूं: http://stackoverflow.com/a/7509974/1631910 – tomosius

0

मैं मानकीकृत करता हूं कि आपका एप्लिकेशन एक अंतर के लिए कैसे जांचता है, न कि डेटाबेस इसे कैसे लागू करता है। किसी विशेष कॉलम के साथ दृश्य का उपयोग करने जैसा कुछ प्रयास करें जो परिवर्तन को दर्शाता है। फिर एक वास्तविकता को देखने के लिए प्रत्येक डेटाबेस में लागू उचित चाल का उपयोग करें। कोड जो इस अंतर की जांच करने पर निर्भर करता है, वही दृश्य और कॉलम का उपयोग करके वही होगा।

+0

स्तंभों को दो तालिकाओं में विभाजित करना * एक विकल्प नहीं है। मैं उस डेटाबेस परिवर्तन को समायोजित करने के लिए अन्य तृतीय-पक्ष एप्लिकेशन को नहीं बदल सकता। –

+0

@ किथ पामर, बस प्रश्न को दोबारा पढ़ें –

संबंधित मुद्दे