क्या गैर CRUD दृष्टिकोण के उदाहरण हैं?


14

मैं एक प्रोग्रामर हूं, लेकिन एक आर्काइविस्ट के रूप में भी काम किया है। आर्काइविस्ट के रूप में यह डेटा रखने के बारे में बहुत कुछ है।

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

क्या इसके लिए कोई शब्द है? मूल रूप से केवल डेटा बनाना और पढ़ना? क्या इस दृष्टिकोण के उदाहरण हैं?


1
Is there a term for this? Basically only creating and reading data?ज़रूर है: CR; P
yannis

7
उपयोगकर्ता के दृष्टिकोण से, वह अभी भी CRUD है। मैं कार्यान्वयन की उस शैली के लिए किसी विशिष्ट लेबल से अवगत नहीं हूं, लेकिन मुझे लगता है कि MANY अनुप्रयोगों में यह आम है। (स्टैक एक्सचेंज एक अच्छा उदाहरण है ...)
मार्क ई। हासे

आप एक बात देखना चाह सकते हैं जिसका नाम है द इम्पीडेंस मिसमैच इज़ फॉल्ट
एंटोन बार्कोवस्की

+1 कुछ बिंदु पर, कोई व्यक्ति रिपोर्ट चाहता है और यह डेटा पर रिपोर्ट बनाने के लिए बहुत कठिन है जो मौजूद नहीं है क्योंकि यह अस्तित्व से बाहर "अपडेट" था। मैं आपका दृष्टिकोण बहुत आगे की सोच रहा हूं।
चक कॉनवे

2
आप डेटामिक के बारे में एक बात देखना भी चाह सकते हैं: infoq.com/pretations/The-Design-of-Datomic
मार्जन

जवाबों:


16

हटाए गए के रूप में एक रिकॉर्ड चिह्नित करना नरम हटाने के रूप में जाना जाता है । मैंने अपडेट करने के लिए एक वैकल्पिक वाक्यांश कभी नहीं सुना है, लेकिन मुझे लगता है कि यह आपके पुराने रिकॉर्ड को सॉफ्ट-डिलीट करने और नया बनाने का कारण है।

यह ध्यान दिया जाना चाहिए, यह एक विवादास्पद तकनीक है। लिंक देखें: कॉन बनाम प्रो


11

एक परिवर्तन इतिहास को बनाए रखने के साथ समस्याओं में से एक यह है कि यह डेटाबेस को बंद कर देता है और नाटकीय रूप से इसका आकार बढ़ा सकता है (उपयोग पैटर्न के आधार पर)। इसलिए एक अच्छा विचार ऑडिट ट्रेल को एक अलग स्थान पर संग्रहीत करना होगा, और वास्तविक एप्लिकेशन तालिकाओं को केवल प्रासंगिक डेटा के साथ आबाद रखना होगा। इसलिए हर बार एक CRUD ऑपरेशन एप्लिकेशन द्वारा किया जाता है, परिवर्तन ऑडिट टेबल में दर्ज किया जाता है, और CRUD ऑपरेशन एप्लिकेशन टेबल (कोई सॉफ्ट डिलीट नहीं) पर किया जाता है।

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


3
इस। इसके अलावा, संदर्भात्मक अखंडता एक बुरा सपना बन जाती है; आप "इस तालिका में एक रिकॉर्ड इस अद्वितीय-कुंजी के साथ नहीं है जिसे नष्ट नहीं किया गया है" के लिए एक विदेशी कुंजी निर्दिष्ट नहीं कर सकते। नए डेटा के साथ इस "वर्किंग कॉपी" को अपडेट करने से पहले, आप एक रिकॉर्ड की कॉपी के लिए डेटा को जारी करके एक अलग तालिका में अपडेट होने वाले हैं, लेकिन अभी भी आपके पास डेटा से निपटने के लिए बड़े पैमाने पर डेटा है।
19

5

EventSourcing उस पैटर्न की तरह लगता है जिसे आप खोज रहे होंगे।

आइए एक सरल "कार" ऑब्जेक्ट का उपयोग करके एक उदाहरण लेते हैं जिसे हम (छद्म सी # कोड निम्न) के रंग का ट्रैक रखना चाहते हैं।

public class Car {
  public string Color { get; set; }
  public Car() { this.Color = "Blue"; }
}

एक CRUD कार्यान्वयन के साथ जब हम कार के रंग को अपडेट करते हैं तो पिछला रंग खो जाएगा।

MyCar.Color = "Red";
MyCar.Save();  // Persist the update to the database and lose the previous data

जानकारी का यह नुकसान मुझे लगता है कि आप सबसे अधिक से बचने के लिए क्या करना चाहते हैं (इसलिए अद्यतन और सीआरयूडी का हिस्सा हटाने के लिए नापसंद)।

अगर हम कार क्लास को फिर से लिखना चाहते थे, तो इसके बदलाव के बारे में घटनाओं पर प्रतिक्रिया देने के बजाय, यह इस तरह दिख सकता है:

public class Car {
    public string Color { get; private set; } // Cannot be set from outside the class

    public void ApplyEvent(CarColorChangedEvent e) {
      this.Color = e.Color;
    }
}

अब हम इस ऑब्जेक्ट का रंग कैसे अपडेट करेंगे? हम एक CarColorChanged घटना बना सकते हैं !

var evnt = new CarColorChangedEvent("Red");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);

वास्तविक मॉडल ऑब्जेक्ट पर एक बचत की कमी को नोटिस करें? ऐसा इसलिए है क्योंकि सीधे मॉडल को जारी रखने के बजाय हम उन घटनाओं को जारी रखते हैं जो मॉडल को वर्तमान स्थिति में डालते हैं। ये आयोजन अपरिवर्तनीय होना चाहिए ।

अब तेजी से आगे बढ़ते हैं और रंग को कुछ और बार बदलते हैं:

var evnt = new CarColorChangedEvent("Green");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);

var evnt = new CarColorChangedEvent("Purple");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);

यदि हम अपने ईवेंट स्टोरेज को देखते हैं (एक रिलेशन डेटाबेस हो सकता है, फाइल आधारित, आदि।) हम अपनी कार ऑब्जेक्ट से संबंधित घटनाओं की एक श्रृंखला देखेंगे:

CarColorChangedEvent => Red
CarColorChangedEvent => Green
CarColorChangedEvent => Purple

यदि हम उस कार ऑब्जेक्ट को फिर से बनाना चाहते हैं तो हम बस एक नई कार ऑब्जेक्ट बना सकते हैं और हमारे इवेंटस्टोर से घटनाओं को उक्त ऑब्जेक्ट पर लागू कर सकते हैं।

var MyCar = new Car();
var events = MyDatabase.SelectEventsForCar("CarIdentifierHere");
foreach(var e in events) {
  MyCar.ApplyEvent(e);
}
Console.WriteLine(MyCar.Color); // Purple

घटनाओं की धारा के साथ हम एक नई कार ऑब्जेक्ट बनाकर कार की स्थिति को पिछली समयावधि में वापस ला सकते हैं और केवल उन घटनाओं को लागू कर सकते हैं जो हम चाहते हैं:

var MyCar = new Car();
var event = MyDatabase.GetFirstEventForCar("CarIdentifierHere");
MyCar.ApplyEvent(e);
Console.WriteLine(MyCar.Color); // Red

5

इवेंट सोर्सिंग जाने का रास्ता है, और आपको इस बारे में एक नज़र रखना चाहिए कि ग्रेग यंग का इस बारे में क्या कहना है।

http://goodenoughsoftware.net/

इस प्रस्तुति को उनके डेटाबेस (इवेंट स्टोर) पर भी देखें। आप अन्य वीडियो भी पा सकते हैं।

http://oredev.org/2012/sessions/a-deep-look-into-the-event-store

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

मैं "वर्जन टेबल" भी नहीं रखना चाहूंगा। सभी "संस्करण तालिकाएं" मैंने कभी देखी हैं (जिस पर मैं इस समय साफ करने की कोशिश कर रहा हूं - 7 साल का डेटा बग के कारण दूषित हो गया ... और ऐतिहासिक डेटा होने पर भी वापस पाने का कोई तरीका नहीं है .. (क्योंकि यह उतना ही भ्रष्ट है) कोड में बग के कारण भ्रष्ट हो गया है और अंत में आप अभी भी डेटा खो देते हैं क्योंकि आप कभी भी वापस नहीं जा सकते हैं और डेटा को फिर से बना सकते हैं जिससे भ्रष्टाचार गड़बड़ हो गया है।

इवेंट सोर्सिंग मॉडल के साथ ऐसा नहीं है। आप हमेशा वही कर सकते हैं जो उपयोगकर्ता ने किया था। यह CRUD और इवेंट सोर्सिंग के बीच बहुत महत्वपूर्ण अंतर है। इवेंट सोर्सिंग आर्किटेक्चर एक इवेंट स्टोर में घटनाओं को बचाता है, न कि डेटा ऑब्जेक्ट्स या डोमेन मॉडल ऑब्जेक्ट्स को। एक घटना आसानी से कई वस्तुओं को प्रभावित कर सकती है। बस एक शॉपिंग कार्ट समाधान के बारे में सोचें जहां आप शॉपिंग कार्ट में प्रत्येक आइटम को वास्तविक क्रम में परिवर्तित करते हैं। एक घटना सभी आइटम वस्तुओं के साथ-साथ खरीदारी कार्ट वस्तुओं को प्रभावित करती है, जो एक ऑर्डर ऑब्जेक्ट में बदल जाती है।

यदि आपने डेटाबेस में प्रत्येक तालिका में प्रत्येक पंक्ति की एक संस्करण की प्रतिलिपि रखी है, तो उस टाइम टेबल को बनाए रखने में स्थान और प्रदर्शन ओवरहेड की पागल राशि का उल्लेख नहीं करने के लिए एक विशिष्ट टाइमस्टैम्प पर वापस आने की डरावनी कल्पना करें।

इवेंट सोर्सिंग के साथ, आप निश्चित समय तक घटनाओं को फिर से दोहराकर आसानी से रिवाइंड कर सकते हैं। स्नैपशॉट का उपयोग करके फास्ट फॉरवर्ड को रखा जा सकता है, लेकिन यह सभी कार्यान्वयन का मामला है।

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

डिबगिंग के मामले में, आपने कितनी बार उपयोगकर्ता को यह बताने के लिए कहा है कि उन्होंने क्या किया ... क्यों नहीं उन्होंने वही किया जो उन्होंने किया और फिर कोड के माध्यम से कदम बढ़ाया! सुंदर निफ्टी हुह।

उम्मीद है की यह मदद करेगा।


2

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

बहुत सारे लोगों ने उस विचार को बाद के सिस्टम में आगे बढ़ाया। मैंने सुना है कि आप क्या वर्णन कर रहे हैं WORM तालिकाओं के रूप में, लेकिन केवल उन मंडलियों में।


2

हाँ, उद्यम प्रणालियों में इसके काफी सामान्य रूप से दो दृष्टिकोण हैं: -

  • "द्वि - लौकिक" जिसमें हर रिकॉर्ड वैध है और समय टिकट के लिए मान्य है ("वर्तमान" रिकॉर्ड "हमेशा" के लिए वैध है - अशक्त, "9999-12-31" या कुछ ऐसे उच्च मूल्य)। "वैध" तारीख के बजाय रिकॉर्ड को कभी भी नष्ट नहीं किया जाता है और वर्तमान समय के लिए सेट किया जाता है और अपडेट के मामले में एक नया रिकॉर्ड वर्तमान समय से वैध और हमेशा के लिए वैध तारीख के साथ डाला जाता है।
  • "हिस्ट्री टेबल" - हर बार जब कोई रिकॉर्ड बदल दिया जाता है तो पुराने रिकॉर्ड की एक कॉपी को इतिहास / लॉग टेबल में इवेंट के लिए टाइमस्टैम्प के साथ डंप कर दिया जाता है।

दोनों दृष्टिकोणों के लिए ग्रैन्युलैरिटी में बहुत भिन्नताएं हैं। उदाहरण यदि किसी ऑर्डर आइटम पर विगेट्स की मात्रा बदली जाती है तो क्या आप पूरे ऑर्डर के लिए इतिहास बनाए रखते हैं या सिर्फ एक आइटम?

आम तौर पर "द्वि-अस्थायी" बोलना बहुत अतिरिक्त काम है और केवल इसके लायक है यदि आपके पास बहुत सारे उपयोग के मामले हैं जैसे "ऑडिटर को 31 दिसंबर तक ऑर्डर की स्थिति मिलती है"।


1

आप सुझाए गए पीडीआर के रूप में "सॉफ्ट-डिलीट" का उपयोग कर सकते हैं । अद्यतन के लिए के रूप में, तुम मेरे उत्तर की तरह की तरह यहां अभिलेखों का इतिहास रख सकता है,: /dba/28195/save-history-editable-data-rdbms/28201#28201 जहां ओपी करना चाहता था कुछ प्रकार के डेटा के सभी संस्करणों पर नज़र रखने में सक्षम हो।


-2

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.