टीएल; डीआर एक बहुत ही खराब संरचित डेटाबेस (स्तंभों की पुनरावृत्ति, कोई पारस्परिक संबंध, और डुप्लिकेट डेटा के साथ) के बीच बहुत अधिक डेटा माइग्रेट करने का सबसे अच्छा तरीका क्या है, एक और अत्यधिक संगठित और संबंधपरक संरचना के लिए? - लंबे पढ़ने के बारे में खेद है!डेटाबेस सामग्री को एक बहुत ही खराब संरचना से माइग्रेट करने के लिए सर्वोत्तम प्रथाओं में एक बहुत तार्किक है?
मैंने हाल ही में एक बहुत जटिल नौकरी ली है। यह एक पूरी कंपनी के वेब-आधारित आईटी मंच को फिर से लिख रहा है। मुझे डर है कि मैं बहुत अधिक विवरण नहीं दे सकता क्योंकि हम पुराने डेवलपर को नहीं जानते हैं (उसके पास कंपनी के सिर के खिलाफ एक रूपक बंदूक है, जिसमें वह अकेला है जो जानता है कि चालान पीढ़ी जैसी महत्वपूर्ण चीजें कैसे करें, और अधिक से अधिक पैसा मांग रहा है)।
बड़ी समस्या यह है कि पूरे वेब प्लेटफॉर्म (सभी कर्मचारियों और सभी ग्राहकों द्वारा उपयोग किया जाता है) को उस व्यक्ति द्वारा कोडित किया गया था जो कौशल शौकिया से कम था। यह ~ 300 व्यक्तिगत कोड फाइलों से बना है। कोई टेम्पलेट लाइब्रेरी नहीं है - यह सब कुछ फाइल में हार्डकोड किया गया है। कोई तार्किक डेटाबेस संरचना नहीं है - यह व्यावहारिक रूप से बनाया गया था क्योंकि वह साथ गया था। कोई सुरक्षा नहीं है - यह चौंकाने वाला है। वैसे भी, हम इस पूरे मंच को ~ 3-महीने की अवधि में फिर से लिखेंगे।
हालांकि मालिक कहते हैं कि सुबह में यह लाइव हो जाता है, कोई भी ग्राहक डेटा कहीं भी खोया नहीं जा सकता है। पूरी डेटाबेस सामग्री को सीधे कॉपी किया जाना है। डेटाबेस की संरचना वर्तमान में इतनी खराब है कि काम करना लगभग असंभव है, लेकिन इस सप्ताह हम (स्क्रिप्ट करने की कोशिश कर रहे हैं!) कुछ नई लिपियों को हमारे नए, अत्यधिक रिलेशनल ढांचे पर माइग्रेट करने के लिए लिखेंगे जो कि अधिक तार्किक है। सवाल यह है कि ऐसा करने का सबसे अच्छा तरीका क्या है?
एक उदाहरण पते है। पुराने डेटाबेस में, पते का उपयोग लगभग 12 टेबल (44 कुल ...) में किया जाता है। हमारे, हमारे पास एक addresses
तालिका है जो चीजों को साफ रखने के लिए अन्य तालिकाओं (उदा। address_id
) द्वारा पार-संदर्भित किया जाएगा। मुख्य समस्या यह है कि उसकी आधे तालिकाओं में, पते line1
, line2
, town
, city
, आदि के रूप में संग्रहीत हैं, जो ठीक है, लेकिन दूसरे छमाही में उनके पास केवल address
फ़ील्ड है जो पूरी चीज को स्टोर करता है!
एक दूसरा उदाहरण दिनांक है - year
, month
, day
, hour
, minute
- कुछ तालिकाओं में वह सेकंड के बाद से-युग की तारीख, दूसरों MySQL NOW()
तारीखों में, और दूसरों में वह सचमुच यह पंक्ति प्रति 6 स्तंभों में संग्रहीत करता है , second
- आउच ...
इस से निपटने की कोशिश कर के बारे में जाने के लिए एक अच्छा तरीका क्या है? हम हमारे टेबल पर गौर करना चाहिए और बाहर काम जहां हम हमारे में से उसकी डेटा खींचने के लिए की जरूरत है, या हम इस रिवर्स चाहिए और उसकी टेबल को देखो और बाहर काम जहां उनके डेटा हमारा में जाने की जरूरत है?
प्रोग्रामिंग दृष्टिकोण से, हमें इससे कैसे निपटना चाहिए? बहुत से डेटा को डायनामिक स्वरूपण (उदा। तिथियों) की आवश्यकता होती है, इसलिए हम एक समय में एक पंक्ति को डेटा खींचने, इसे सही तरीके से स्वरूपित करने, फिर हमारी स्क्रिप्ट में सही स्थानों पर फिर से डालने की सोच रहे थे।
स्पीड और प्रश्नों की दक्षता नहीं एक मुद्दा हमारे लिए, के रूप में हम केवल (परीक्षण के बाद) एक बार इस चलाने के लिए, हमारे स्थानीय मशीनों पर की आवश्यकता होगी है।एसक्यूएल डंप होने पर उनका डेटाबेस वर्तमान में ~ 800 एमबी है, लेकिन फिर से इसका बहुत बेकार परीक्षण डेटा है, या सिर्फ पूरी तरह से अनावश्यक है।
इससे निपटने के लिए सबसे अच्छे तरीके पर कोई विचार? संदर्भ के लिए हमारे सिस्टम को PHP में फिर से लिखा जाएगा ताकि किसी भी PHP- आधारित अनुशंसाएं अच्छी होंगी। डेटाबेस वर्तमान में (और अभी भी होगा) MySQL में है।
+1 मैं वर्तमान में उस कंपनी के लिए वेबसाइट लिख रहा हूं जिसके लिए मैं काम करता हूं और ~ 500,000 पंक्तियों का उनका डेटाबेस एक पूर्ण गड़बड़ है, इसलिए अगर किसी के पास कुछ जवाब हैं तो यह बहुत अच्छा होगा। – Bojangles
"लेख" का आधा बुरा आदमी के बारे में है :) – Karolis
[प्रश्न 3094126] (http://stackoverflow.com/questions/3094126) चर्चा करता है कि पते कैसे स्टोर करें। एक मास्टर एड्रेस टेबल रखना आपको उसी कारण से काट देगा, एक मास्टर ग्राहक तालिका आपको प्रतिबिंबित करेगी [उत्तर 2 9 5 9 2 9 9 प्रश्न 648463 पर प्रश्न] (http://stackoverflow.com/questions/648463/best-way-to-model- ग्राहक का पता/2995299 # 2995299)।बोर्क के लिए –