2011-10-17 17 views
6

हम एक बड़े अनुप्रयोग विकसित कर रहे हैं जो व्यापार से संबंधित हैं। आप इन अनुप्रयोगों को कुछ ईआरपी, सीआरएम, आदि के समान पा सकते हैंगतिशील व्यवसाय ऑब्जेक्ट्स/डेटा संस्करण कैसे करें?

अब हमारे पास एक आवश्यकता है कि हमें उपयोगकर्ता द्वारा संस्करणित किए जाने वाले सभी डेटा की आवश्यकता है।

उदाहरण के लिए: कुछ समय पर, उपयोगकर्ता को यह देखने की आवश्यकता होगी कि किसी विशेष खरीद आदेश का परिवर्तन इतिहास क्या है?

मैं एक बहुत ही सामान्य संस्करण हैंडलर (कठोर नहीं) की तलाश में हूं, जो कुछ व्यवसाय डेटा विशेषताओं को बदलने के मामले में भी मामलों को संभाल सकता है। यह एकल संस्करण हैंडलर किसी भी प्रकार की व्यावसायिक वस्तुओं/डेटा के साथ काम करने में सक्षम होना चाहिए।

इन्हें संभालने के लिए सबसे अच्छा प्रोग्रामिंग/डेटाबेस डिज़ाइन क्या होगा।

कोई विचार या राय?

पीएस: मैंने कुछ प्रोग्रामिंग टैग जोड़े हैं क्योंकि मैं प्रोग्रामर को इस धागे का मनोरंजन करने और उनके विचार देने के लिए चाहता हूं।

संपादित करें: मैं एक बहुत ही अनुकूलित तरीके की तलाश में हूं, कुछ हद तक एक धारावाहिक/डंपिंग तरीके से वस्तुओं को संग्रहीत करने के बजाय संग्रहित भिन्नता के समान है।

+0

मैंने जेनेरिक टैग को हटा दिया। कृपया जेनेरिक टैग विवरण पढ़ें। – Saintali

+0

समाधान इस बात पर निर्भर करता है कि आपकी ऑब्जेक्ट्स को पहले स्थान पर कैसे संग्रहीत किया जाता है। क्या आप एक रिलेशनल डेटाबेस का उपयोग कर रहे हैं? अन्य मौलिक बिंदु यह है कि संस्करण वाली वस्तुओं का उपयोग कैसे किया जा रहा है? क्या यह सिर्फ एक लॉग है या क्या आपको आवेदन के पुराने राज्यों को उसी तरह पेश करने में सक्षम होना चाहिए जैसा आप वर्तमान के लिए करते हैं? –

+0

@ निकोला मुसाट्टी -> हां यह एक संबंधपरक डेटाबेस होगा। हां, हमें पुराने राज्यों को पेश करने में सक्षम होना आवश्यक होगा। और वस्तुएं इसके गुणों के साथ हैं, जो कि बच्चे की वस्तुएं भी आगे हो सकती हैं। – linuxeasy

उत्तर

4

purely functional आलसी डेटा संरचनाओं को अपनाने का सही समय हो सकता है।

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

उदाहरण के लिए, आपके पास Order उदाहरण है जिसमें OrderItem एस की एक सूची है और आपको उस सूची में एक विशिष्ट OrderItem जोड़ने की आवश्यकता है।क्या आप इस मामले में क्या एक नई सूची, बारी में से cons 'नए OrderItem वर्ष सूची में ing बनाई गई है जिसके द्वारा की जगह अपने आइटम की सूची से Order का नया उदाहरण पैदा हो गई।

मुझे चित्रों में आगे उदाहरण दें। कल्पना कीजिए एक भंडारण वस्तुओं की (यह रैम या संबंधपरक डेटाबेस, कुछ भी हो):

 
Address | Object    | Created by 
--------+--------------------+------------------------------------------ 
    1000 | list of OrderItems | empty list constructor 
    1001 | Order    | Order constructor, uses address 1000 
        ...   
    1300 | OrderItem   | ... 
    1501 | list of OrderItems | cons of addr 1300 to addr 1000 
    1502 | Order    | replace order_items in addr 1001 by addr 1501 

इस तरह से डेटा भंडारण के बहुत संरचना लगातार है (क्रिस ओकासाकी, his thesis में इस पर बताते हैं उदाहरण के लिए)। आप अपने निर्माण इतिहास का पालन करके किसी ऑब्जेक्ट के किसी भी संस्करण को पुनर्स्थापित कर सकते हैं; संस्करण छोटा हो जाता है। बस मुख्य बिंदु याद रखें: डेटा को म्यूटेट न करें, इसके बजाय नए उदाहरण बनाएं।

0

यदि आप आक्रामक नहीं कर रहे हैं (मैं सामान्य रूप से आक्रामक के साथ प्रतिस्पर्धा के रूप में देखता हूं), तो मुझे लगता है कि आपका विकल्प पूर्ण क्रमबद्धता करना है। प्रत्येक संस्करण पर आप ऑब्जेक्ट का एक स्नैपशॉट लेते हैं और इसे उचित रूप से क्रमबद्ध करते हैं।

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

+0

क्रमबद्ध करना ठीक है, लेकिन मुझे लगता है कि एक बहुत ही अनुकूलित समाधान नहीं है। अगर यह संग्रहीत विभिन्न संस्करणों के अंतर होने के करीब कुछ था, तो दिलचस्प होगा। – linuxeasy

+0

@linuxeasy आप इसे स्टोर करने के बजाए स्टोर करने के लिए स्टोर करने के तरीके के बारे में जानने के लिए और अधिक चक्र लगाएंगे। Knuth क्या करेंगे? –

+0

हम पहले की व्यावसायिक वस्तुओं और वर्तमान व्यावसायिक वस्तुओं के बीच मतभेदों को संग्रहित करेंगे। हम यह पता लगाने की कोशिश नहीं करेंगे कि क्या स्टोर करना है और क्या नहीं, लेकिन हम एक सामान्य ढांचे को विकसित करने की दिशा में देख रहे हैं जो स्वचालित रूप से ऐसा करेगा। और इसलिए सवाल, सबसे प्रभावी जेनेरिक एल्गोरिदम क्या होगा। भिन्नता को हाइलाइट करने जैसे कई फायदे भी हैं। इसलिए, हालांकि यह डंपिंग की तुलना में थोड़ा जटिल है, लेकिन इसमें स्मृति की बचत और मतभेदों को हाइलाइट करने के मामले में भी इसके फायदे हैं। – linuxeasy

0

असल में आप किसी मौजूदा ऑब्जेक्ट और नई ऑब्जेक्ट के फ़ील्ड की तुलना करने और अंतर को बनाए रखने में सक्षम होना चाहिए।

आमतौर पर यह अत्यधिक संवेदनशील संस्थाओं के लिए किया जाएगा ताकि उस विशेष पंक्ति/खाते में हुए बदलावों की संख्या को ट्रैक किया जा सके। यदि यह सभी तालिकाओं के लिए किया जाता है तो यह एक ओवरकिल होगा। अंतर अलग-अलग इतिहास तालिका में असीमित रूप से जारी रखा जा सकता है जो ऑनलाइन तालिकाओं के समान डिज़ाइन से मेल खाता है।

+0

बराबर विधि तर्क ले सकती है और इस उद्देश्य के लिए फ़ील्ड की तुलना कर सकती है। http://en.wikibooks.org/wiki/Java_Programming/Comparing_Objects जारी रहने से पहले यदि हम मौजूदा इकाई से तुलना कर सकते हैं तो हम अंतर को अलग-अलग इतिहास के रूप में सहेज सकते हैं। – r0ast3d

+0

ठीक है, पहली बात, यदि आप यह निर्दिष्ट कर सकते हैं कि इसे करने का सबसे अच्छा तरीका क्या होना चाहिए। दूसरा, जटिल वस्तुओं पर विचार करें जैसे कि ऑब्जेक्ट्स जिसमें ऑब्जेक्ट्स शामिल हैं। उदाहरण के लिए: खरीद-आदेश एक वस्तु है और खरीद-ऑर्डर-आइटम बाल वस्तु है। खरीद-आदेश के प्रत्यक्ष विशेषताओं का अंतर बनाया जा सकता है। खरीद-आदेश-वस्तुओं में अंतर के बारे में क्या? इनके अपने गुण होंगे। और वहां केवल 1 नहीं बल्कि कई खरीद-ऑर्डर-आइटम होंगे। आप किस डीबी संरचना का उपयोग करने के लिए सबसे अच्छा विचार करेंगे?लिंक के माध्यम से भी जा रहा है, मुझे यह बहुत सामान्य समाधान नहीं लगता है। – linuxeasy

+0

क्या परिवर्तन आदेश निर्धारित करने के लिए खरीद आदेश वस्तुओं की तुलना बराबर के हिस्से के रूप में नहीं की जा सकती है? मुझे लगता है कि खरीद आदेश आइटम pruchase आदेश इकाई का हिस्सा है। बाल इकाई बराबर भी लागू कर सकती है। या अधिक सामान्य समाधान के लिए एक साधारण प्रतिबिंब उपयोगिता भी फ़ील्ड की तुलना करने में मदद कर सकती है और फिर इसे फिर से प्रयास करने में मदद कर सकती है। – r0ast3d

1

Hibernate Envers की रेखाओं के साथ कुछ - एक इकाई लेखा परीक्षा समाधान, आपकी आवश्यकताओं के लिए एक उपयुक्त फिट प्रतीत होता है।

0

मुझे अतीत में ऐसा कुछ करना पड़ा है।

मुझे पता चला कि स्क्रैच से शुरू होने का सबसे आसान तरीका ऑब्जेक्ट डेटा तालिका में एक अतिरिक्त कॉलम जोड़ना था जो प्रतिस्थापन ऑब्जेक्ट की अनुक्रमणिका रखता था। यदि मूल्य शून्य था तो मुझे पता था कि यह नवीनतम संस्करण था। इसका मतलब यह भी था कि वस्तुओं को कभी भी हटाया नहीं गया था, हालांकि बाद में मैंने functioanlity जोड़ा जो पिछले इतिहास को हटाने की अनुमति देगा।

प्रभावशाली रूप से सूचकांक प्रश्न में ऑब्जेक्ट का संस्करण संख्या बन जाता है और नवीनतम संस्करण के लिए डीबी को कोई भी क्वेरी क्वालीफायर WHERE NextVersionIndex=0 का उपयोग करेगी।

यदि स्क्रैच से शुरू नहीं होता है तो इन मूल्यों को स्टोर करने के लिए अतिरिक्त तालिका जोड़कर इसे लाइव सिस्टम में लागू किया जा सकता है - ऑब्जेक्ट इंडेक्स, पिछला संस्करण अनुक्रमणिका, अगला संस्करण अनुक्रमणिका।

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