2008-09-19 20 views
10

तालिका 1: रसोई सिंक समेत सबकुछ। गलत स्वरूप में दिनांक (साल आखिरी है कि आप उस कॉलम पर सॉर्ट नहीं कर सकते हैं), VARCHAR के रूप में संग्रहीत नंबर, 'सड़क' कॉलम में पहला पता, प्रथम नाम कॉलम में पहला नाम और अंतिम नाम, अंतिम नाम कॉलम में शहर, अपूर्ण पते, पंक्तियां पिछले कुछ वर्षों में बदल गए नियमों के कुछ सेट के आधार पर डेटा को एक फ़ील्ड से दूसरे स्थान पर ले जाकर पंक्तियों को आगे बढ़ाएं, डुप्लिकेट रिकॉर्ड, अपूर्ण रिकॉर्ड, कचरा रिकॉर्ड ... आप इसे नाम दें ... ओह और निश्चित रूप से टाइमस्टैम्प या प्राथमिक नहीं दृष्टि में कुंजी कॉलम।परम MySQL विरासत डेटाबेस दुःस्वप्न

तालिका 2: सामान्यीकरण की कोई उम्मीद इस बच्चे को खोलने पर खिड़की से बाहर निकल गई। हमारे पास तालिका में पंक्तियों की प्रत्येक प्रविष्टि और अद्यतन के लिए एक पंक्ति है। तो डुप्लीकेट्स जैसे कल (800 एमबी लायक) और फोन 1 फोन 2 फोन 3 फोन 4 जैसे कॉलम नहीं हैं ... फोन 15 (उन्हें फोन नहीं कहा जाता है। मैं इसका इस्तेमाल उदाहरण के लिए करता हूं) फोरीगन कुंजी है .. अच्छी तरह से अनुमान लगाएं। तालिका 1

तालिका 3: में यह किस प्रकार का डेटा पंक्ति में था, इस पर निर्भर करता है कि यह तीन और उम्मीदवार हैं। अरे हाँ। "विदेशी कुंजी डैश, डॉट्स, संख्याओं और अक्षरों का एक वर्चर कॉलम संयोजन है! अगर वह मैच प्रदान नहीं करता है (जो अक्सर नहीं होता है) तो समान उत्पाद कोड का दूसरा कॉलम होना चाहिए। कॉलम जिनके नाम हैं उनके भीतर डेटा के साथ कोई सहसंबंध नहीं है, और अनिवार्य फोन 1 फोन 2 फोन 3 फोन 4 ... फोन 15। तालिका 1 से डुप्लिकेट किए गए कॉलम हैं और दृष्टि में टाइमस्टैम्प या प्राथमिक कुंजी कॉलम नहीं हैं।

तालिका 4: एक कार्य के रूप में वर्णित किया गया था प्रोजेस और किसी भी पल में बदलाव के अधीन है। यह दूसरों के लिए संक्षेप में समान है।

1 मीटर पंक्तियों के करीब यह एक बड़ी गड़बड़ है। सौभाग्य से यह मेरी बड़ी गड़बड़ी नहीं है। असल में मुझे इसे एक संग्रह से बाहर निकालना है प्रत्येक "ग्राहक" के लिए रिकॉर्ड।

प्रारंभ में मैंने तालिका 1 का एक चार चरण अनुवाद तैयार किया जिसमें प्राथमिक कुंजी जोड़कर सभी तिथियों को क्रमबद्ध प्रारूप में परिवर्तित किया गया। फिर प्रश्नों के कुछ और कदम जो फ़िल्टर किए गए डेटा लौटे, जब तक कि मेरे पास टेबल 1 नहीं था, जहां मैं इसे अन्य टेबलों से संग्रहित करने के लिए उपयोग कर सकता था। सप्ताह के काम के बाद मुझे कुछ चालों का उपयोग करके इसे एक कदम तक नीचे चला गया। तो अब मैं अपने ऐप को गड़बड़ पर इंगित कर सकता हूं और मिश्रित डेटा की एक अच्छी साफ मेज खींच सकता हूं। सौभाग्य से मुझे केवल अपने उद्देश्यों के लिए फोन नंबरों में से एक की आवश्यकता है ताकि मेरी तालिका को सामान्य बनाना कोई मुद्दा न हो।

हालांकि यह वास्तविक कार्य शुरू होता है, क्योंकि हर दिन सैकड़ों कर्मचारी इस डेटाबेस को जोड़ते/अपडेट/हटाते हैं, जिस तरह से आप कल्पना नहीं करना चाहते हैं और हर रात मुझे नई पंक्तियां पुनर्प्राप्त करनी होंगी।

चूंकि किसी भी तालिका में मौजूदा पंक्तियों को बदला जा सकता है, और चूंकि अद्यतन कॉलम पर कोई टाइमस्टैम्प नहीं है, इसलिए मुझे यह जानने के लिए लॉग का सहारा लेना होगा कि क्या हुआ है। बेशक यह मानता है कि एक बाइनरी लॉग है, जो नहीं है!

अवधारणा का परिचय लीड गुब्बारे की तरह नीचे चला गया। मैंने उन्हें यह भी बताया होगा कि उनके बच्चों को प्रयोगात्मक सर्जरी से गुजरना होगा। वे बिल्कुल हाई तकनीक नहीं हैं ... यदि आप एकत्र नहीं हुए थे ...

स्थिति थोड़ा नाजुक है क्योंकि उनके पास कुछ मूल्यवान जानकारी है जो मेरी कंपनी बुरी तरह से चाहता है। मुझे एक बड़े निगम के सीनियर मैनेजमेंट द्वारा भेजा गया है (आप जानते हैं कि वे कैसे हैं) "इसे करने के लिए"।

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

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

मैंने समस्या के बारे में स्पष्ट होने में सहायता के लिए यह लिखा है। अक्सर इसे किसी और को बताते हुए समाधान को और अधिक स्पष्ट बनाने में समस्या को स्पष्ट करने में मदद मिलती है। इस मामले में मुझे सिर्फ एक बड़ा सिरदर्द है!

आपके विचारों की बहुत सराहना की जाएगी।

उत्तर

1

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

1

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

0

आप एक स्टेजिंग डेटाबेस सिंक्रनाइज़ करने के लिए मातकिट के एमके-टेबल-सिंक टूल का उपयोग करने में सक्षम हो सकते हैं (आपका डेटाबेस केवल बहुत छोटा है)। यह "गड़बड़ी को डुप्लिकेट करेगा"

तब आप कुछ लिख सकते हैं, सिंक के बाद, अधिक से अधिक टेबलों का एक सेट उत्पन्न करने के लिए विभिन्न प्रश्न पूछते हैं जिन्हें आप रिपोर्ट कर सकते हैं।

मुझे कल्पना है कि यह प्रदर्शन की समस्या के बिना दैनिक आधार पर किया जा सकता है।

किसी अन्य सर्वर से इसे करने से मूल डेटाबेस को प्रभावित करने से बचेंगी।

एकमात्र समस्या जो मैं देख सकता हूं वह यह है कि यदि कुछ तालिकाओं में प्राथमिक कुंजी नहीं है।

+0

* एकमात्र समस्या जो मैं देख सकता हूं वह है यदि कुछ तालिकाओं में प्राथमिक कुंजी नहीं है। * - जो वे नहीं करते हैं ... आज और अधिक वार्ता के बाद उन्होंने मुझे बताया कि वे "शायद ही कभी" अपडेट अपडेट/हटाते हैं। .. जो भी था मतलब है। किसी अन्य डेटाबेस डेवलपर से बात करने में यह सही तरीके से करने का सबसे अच्छा (एकमात्र) तरीका प्रतीत होता है, हैश को हर एक डार्न पंक्ति है और हैश को एक टेबल में स्टोर करना है। फिर, हर रात प्रत्येक पंक्ति के लिए हैश बनाने वाले संपूर्ण डेटाबेस को फिर से पढ़ें और बस एक साधारण तुलना करें। मैं बस इसके चारों ओर एक रास्ता नहीं देख सकता। द्विआधारी लॉग फ़ाइलों को समझने की कोशिश करना खतरे से भरा होगा। –

2

मैं एक MySQL व्यक्ति नहीं हूं, इसलिए यह बाएं क्षेत्र से बाहर आ रहा है।

लेकिन मुझे लगता है कि लॉग फाइलें जवाब हो सकती हैं।

शुक्र है, आपको वास्तव में लॉग से 2 चीजें जानने की आवश्यकता है।

आपको रिकॉर्ड/पंक्ति की आवश्यकता है, और आपको ऑपरेशन की आवश्यकता है।

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

अगला, आपको ऑपरेशन की आवश्यकता है। विशेष रूप से यह पंक्ति पर ऑपरेशन डालें, अपडेट करें या हटाएं।

आप इस जानकारी को समय-समय पर समेकित करते हैं, और उसके बाद इसे चलाते हैं।

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

आपको फ़ील्ड मानों की परवाह नहीं है, वे केवल महत्वपूर्ण नहीं हैं। पूरी पंक्ति करो।

आप उम्मीद है कि "पार्स" करने के लिए द्विआधारी लॉग फाइल नहीं करना चाहिए था, MySQL पहले से ही है कि, तुम बस मिल जाती है और यह पता लगाने की उन्हें कैसे उपयोग करने के लिए की जरूरत है ऐसा करने के लिए दिनचर्या होना आवश्यक है (वहाँ भी कुछ आसान "लॉग ऑन डंप" हो सकता है उपयोगिता आप उपयोग कर सकते हैं)।

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

स्पष्ट रूप से यह लॉग फ़ाइलों को पढ़ने के क्रम में थोड़ा सा आर्केन ज्ञान लेता है, लेकिन शेष सीधे होना चाहिए। मुझे लगता है कि लॉग फाइलें टाइमस्टैम्प भी हैं, इसलिए आप पंक्तियों पर "आज से", या जो भी तिथि सीमा चाहते हैं, पर काम करने के बारे में जान सकते हैं।

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