সিআরইউডিহীন পদ্ধতির উদাহরণ রয়েছে কি?


14

আমি একজন প্রোগ্রামার কিন্তু আর্কাইভিস্ট হিসাবেও কাজ করেছি। সংরক্ষণাগারবিদ হিসাবে এটি ডেটা রাখার বিষয়ে অনেক কিছুই।

যখন ডেটাতে কাজ করার বিষয়টি আসে তখন আমি প্রায়শই সহকর্মীদের সাথে তর্ক করি। আমি সি আর ইউ ডি তে ইউ এবং ডি পছন্দ করি না। তারপরে একটি রেকর্ড আপডেট করুন আমি একটি নতুন যুক্ত করতে পছন্দ করি এবং পুরাতন রেকর্ডটির সাথে একটি উল্লেখ পেতে পারি have এইভাবে আপনি পরিবর্তনগুলির ইতিহাস তৈরি করেন। আমি রেকর্ড মুছতে পছন্দ করি না বরং এগুলি নিস্ক্রিয় হিসাবে চিহ্নিত করি।

এই জন্য একটি শব্দ আছে? মূলত কেবল ডেটা তৈরি এবং পড়া? এই পদ্ধতির উদাহরণ আছে?


1
Is there a term for this? Basically only creating and reading data?অবশ্যই আছে: সিআর; পি
ইন্নিস

7
ব্যবহারকারীর দৃষ্টিকোণ থেকে, এটি এখনও CRUD। বাস্তবায়নের সেই স্টাইলের জন্য আমি কোনও নির্দিষ্ট লেবেল সম্পর্কে সচেতন নই, তবে আমি মনে করি এটি অনেকগুলি অ্যাপ্লিকেশনগুলিতে সাধারণ। (স্ট্যাক এক্সচেঞ্জ একটি ভাল উদাহরণ ...)
মার্ক ই। হাজেস

আপনি ইমপিডেন্স মিস্যাম্যাচ ইজ ইজ দ্য ফল্ট নামে একটি আলোচনা দেখতে চাইতে পারেন ।
আন্তন বারকোভস্কি

+1 এক পর্যায়ে, কেউ রিপোর্ট চাইবে এবং অস্তিত্ব নেই এমন ডেটা সম্পর্কিত প্রতিবেদন তৈরি করা খুব শক্ত কারণ এটি অস্তিত্বের বাইরে "আপডেট" হয়েছিল। আমি আপনার পদ্ধতির খুব এগিয়ে চিন্তা ভাবনা।
চক কনওয়ে

2
আপনি ডেটোমিক সম্পর্কেও একটি আলোচনা দেখতে চাইতে পারেন: তথ্যকো.কম
মার্জন ভেনেমা

উত্তর:


16

মুছে ফেলা হিসাবে একটি রেকর্ড চিহ্নিতকরণ নরম মোছা হিসাবে পরিচিত । আমি আপডেট করার জন্য কোনও বিকল্প বাক্যাংশটি কখনও শুনিনি, তবে আমি অনুমান করি যে এটি আপনাকে পুরানো রেকর্ডটি নরম করে মুছে ফেলে এবং একটি নতুন তৈরি করে।

এটি লক্ষ করা উচিত, এটি একটি বিতর্কিত কৌশল। লিঙ্কগুলি দেখুন: কন বনাম প্রো


11

পরিবর্তনের ইতিহাস ধরে রাখতে সমস্যাগুলির মধ্যে একটি হ'ল এটি ডেটাবেসটিকে বিশৃঙ্খলা করে এবং নাটকীয়ভাবে এর আকার বাড়িয়ে তুলতে পারে (ব্যবহারের ধরণগুলির উপর নির্ভর করে)। সুতরাং একটি ভাল ধারণা হ'ল নিরীক্ষণের ট্রেইলটি আলাদা জায়গায় সঞ্চয় করা এবং প্রকৃত অ্যাপ্লিকেশন টেবিলগুলি কেবলমাত্র প্রাসঙ্গিক ডেটা দিয়েই জনিত রাখা। সুতরাং প্রতিবার অ্যাপ্লিকেশন দ্বারা সিআরইউডি অপারেশন করা হলে, পরিবর্তনটি নিরীক্ষণ টেবিলগুলিতে রেকর্ড করা হয়, এবং সিআরইউডি অপারেশনটি অ্যাপ্লিকেশন টেবিলগুলিতে সঞ্চালিত হয় (কোনও সফট ডিলেটস নেই)।

নিরীক্ষণের ট্রেইলটি আলাদা করে রাখার মাধ্যমে আপনার অ্যাপ্লিকেশনটির সাথে ইন্টারঅ্যাক্ট করার জন্য আপনাকে একটি প্রাথমিক ডেটা স্টোর দেয়, পরিবর্তনের ইতিহাস বজায় রাখার পরেও আপনার প্রয়োজন হওয়া উচিত। আপনি এখন আপনার ব্যবসায়ের প্রয়োজনীয়তার উপর নির্ভর করে নিরীক্ষণের ট্রেইলটি আলাদাভাবে সংরক্ষণাগারভুক্ত করতে পারেন বা এমনকি এটি ধ্বংস করতে পারেন।


3
এই. এছাড়াও, রেফারেন্সিয়াল অখণ্ডতা একটি দুঃস্বপ্ন হয়ে ওঠে; আপনি "এই টেবিলের এক অনন্য-অনন্য কী যা মুছে ফেলা হিসাবে চিহ্নিত নয়" তার সাথে একটি বিদেশী কী নির্দিষ্ট করতে পারবেন না। নতুন তথ্য দিয়ে এই "কার্যকরী অনুলিপি" আপডেট করার আগে একটি রেকর্ডের অনুলিপিটির অনুলিপিটির জন্য তথ্য অবিরত রেখে আপনি এটি পেতে পারেন তবে আপনার মোকাবেলা করার জন্য আপনার কাছে এখনও প্রচুর ডেটা ব্লাট রয়েছে।
কিথস

5

EventSourcing এমন প্যাটার্নের মতো শোনাচ্ছে যা আপনি সন্ধান করতে পারেন।

আসুন একটি সাধারণ "গাড়ি" অবজেক্টটি ব্যবহার করে একটি উদাহরণ ধরুন যা আমরা (সিউডো সি # কোড অনুসরণ করে) এর রঙের উপর নজর রাখতে চাই।

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

সিআরইউডি বাস্তবায়নের সাথে সাথে আমরা গাড়ির রঙ আপডেট করলে আগের রঙটি নষ্ট হয়ে যায়।

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;
    }
}

এখন আমরা কীভাবে এই বস্তুর রঙ আপডেট করব? আমরা একটি কার কালার চেঞ্জড ইভেন্ট তৈরি করতে পারি !

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 বছরের ডেটা দূষিত ... এবং আমাদের কাছে historicalতিহাসিক ডেটা থাকা সত্ত্বেও এটি ফিরে পাওয়ার কোনও উপায় নেই .. । কারণ এটি ঠিক তত দুর্নীতিগ্রস্থ) কোড বাগের কারণে শেষ পর্যন্ত দূষিত হয়ে যায় এবং শেষ পর্যন্ত আপনি এখনও ডেটা হারাবেন কারণ আপনি কখনই ফিরে যেতে পারবেন না এবং যে ডেটা দুর্নীতিতে জড়িয়ে পড়েছে তা পুনরায় তৈরি করতে পারবেন না।

ইভেন্ট সোর্সিং মডেলটি এমন নয় isn't ব্যবহারকারী সর্বদা ঠিক কী খেলতে পারেন তা আপনি পুনরায় খেলতে পারেন। এটি CRUD এবং ইভেন্ট সোর্সিংয়ের মধ্যে খুব গুরুত্বপূর্ণ পার্থক্য। ইভেন্ট সোর্সিং আর্কিটেকচার কোনও ইভেন্ট স্টোরের ইভেন্টগুলি সংরক্ষণ করে, এবং ডেটা অবজেক্ট বা ডোমেন মডেল অবজেক্টগুলিকে নয়। একটি ইভেন্ট সহজেই একাধিক বস্তুকে প্রভাবিত করতে পারে। কেবল শপিং কার্টের সমাধানের কথা ভাবুন যেখানে আপনি শপিং কার্টের প্রতিটি আইটেমকে আসল ক্রমে রূপান্তর করেন। একটি ইভেন্ট সমস্ত আইটেম অবজেক্টের পাশাপাশি শপিং কার্টের অবজেক্টগুলিকে প্রভাবিত করে, যা একটি অর্ডার অবজেক্টে রূপান্তরিত হয়।

আপনি যদি ডাটাবেসের প্রতিটি টেবিলের প্রতিটি সারিটির একটি সংস্করণিত অনুলিপি রেখেছিলেন, তবে সেই সংস্করণ সারণীটি বজায় রাখার ক্ষেত্রে স্থান এবং পারফরম্যান্সের ওভারহেডের উন্মাদ পরিমাণ উল্লেখ না করে কোনও নির্দিষ্ট টাইমস্ট্যাম্পে ফিরে যেতে হবে এমন ভয়াবহতাটি কল্পনা করুন।

ইভেন্ট সোর্সিংয়ের মাধ্যমে, আপনি নির্দিষ্ট সময়ে নির্দিষ্ট সময় পর্যন্ত কেবল ইভেন্টগুলি পুনরায় চালনা করে সহজেই রিওয়াইন্ড করতে পারেন। স্ন্যাপশট ব্যবহার করে দ্রুত ফরোয়ার্ডগুলি স্থাপন করা যেতে পারে তবে এটি বাস্তবায়নের বিষয়।

তবে আপনার আসল সুবিধাটি যা আপনি পছন্দ করবেন বলে মনে করেন, যেমন আপনি ডেটা না হারাতে বিশেষভাবে আগ্রহী, তা হ'ল যদি আপনি এই ডেটা সংরক্ষণ করে কোডটিতে কোনও বাগ আবিষ্কার করেন, তবে আপনাকে ফিরে গিয়ে তথ্য পরিষ্কার করার দরকার নেই (যা প্রায়শই অসম্ভব কারণ ডেটা প্রায় সম্পূর্ণ হয় না)। পরিবর্তে কেবল বাগটি ঠিক করুন, এবং সমস্ত ইভেন্ট পুনরায় খেলুন। তারপরে আপনার কাছে একটি সঠিক ডাটা সহ একটি ডাটাবেস থাকবে।

ডিবাগিংয়ের ক্ষেত্রে, আপনি ব্যবহারকারীকে তারা কী করেছেন তা আপনি কতবার জিজ্ঞাসা করেছেন ... কেন তারা কেবল যা করেছে তা পুনরায় খেলবে না এবং তারপরে কোডের মাধ্যমে পদক্ষেপ নিচ্ছে না কেন! বেশ নিফটি হুঁ।

আশাকরি এটা সাহায্য করবে.


2

সুনির্দিষ্টভাবে আপনার উদাহরণ নয়, তবে পুরানো আর্থিক সিস্টেমে আপনার ওয়ার্ম স্টোরেজ ছিল । আপনার যদি "আপডেট" করার প্রয়োজন হয় আপনি একটি নতুন রেকর্ড লিখেছেন এবং আপনি সর্বদা সর্বশেষ রেকর্ডটিকে বর্তমান হিসাবে উল্লেখ করেছেন তবে কোনও প্রতিশ্রুতিবদ্ধ ডেটা ওভাররাইট করা যায় না।

অনেক লোক এই ধারণাটি পরবর্তী সিস্টেমে নিয়ে গেছে। আপনি শুনেছেন যা আপনি ওয়ার্ল্ড টেবিল হিসাবে উল্লেখ করেছেন তবে কেবলমাত্র সেই চেনাশোনাগুলিতে।


2

হ্যাঁ এন্টারপ্রাইজ সিস্টেমে এটি বেশ প্রচলিত মূলত দুটি পদ্ধতির রয়েছে: -

  • "দ্বি-টেম্পোরাল" যাতে প্রতিটি রেকর্ডের বৈধ থেকে সময় স্ট্যাম্পের বৈধতা রয়েছে ("বর্তমান" রেকর্ডটি "চিরকাল" - নাল, "9999-12-31" বা এই জাতীয় কিছু উচ্চমানের তারিখের বৈধ রয়েছে)। রেকর্ডগুলি কখনই মুছে ফেলা হয় না পরিবর্তে "বৈধ টু" তারিখটি বর্তমান সময়ে সেট করা হয় এবং আপডেটের ক্ষেত্রে একটি নতুন রেকর্ড বর্তমান সময়ের বৈধ এবং তারিখের জন্য চিরতরে বৈধ সহ সন্নিবেশ করা হয়।
  • "ইতিহাস সারণী" - প্রতিবার কোনও রেকর্ড পরিবর্তন করা হলে পুরানো রেকর্ডটির একটি অনুলিপি ইভেন্ট / লগ টেবিলটিতে ইভেন্টের টাইমস্ট্যাম্প সহ ফেলে দেওয়া হয়।

উভয় পদ্ধতির জন্য গ্রানুলারিটিতে দুর্দান্ত পার্থক্য রয়েছে। উদাহরণস্বরূপ, যদি কোনও অর্ডার আইটেমের উইজেটের পরিমাণ পরিবর্তন করা হয় আপনি কি পুরো অর্ডার বা কেবলমাত্র একটি আইটেমের জন্য ইতিহাস বজায় রাখবেন?

সাধারণত "দ্বি-টেম্পোরাল" কথা বলা অনেক অতিরিক্ত কাজ এবং কেবলমাত্র আপনার যদি "অডিটর 31 ডিসেম্বর হিসাবে আদেশের স্থিতি পান" এর মতো ব্যবহারের ক্ষেত্রে প্রচুর ব্যবহার হয় তবে তা মূল্যবান।


1

আপনি পিডিআরের পরামর্শ অনুসারে "সফট-মোছা" ব্যবহার করতে পারেন । আপডেট হিসাবে, আপনি রেকর্ডের ইতিহাস রাখতে পারেন, এখানে আমার উত্তরটির মতো সাজান: /dba/28195/save-history-edable-data-rdbms/28201#28201 যেখানে ওপি চেয়েছিল নির্দিষ্ট ধরণের ডেটাগুলির সমস্ত সংস্করণে নজর রাখতে সক্ষম হোন।


-2

মূলত এই 4 টি জিনিস ব্যতীত ক্রুড সম্পূর্ণ করা যায় না। ক্রুড মানে তৈরি করুন, পড়ুন, আপডেট করুন এবং মুছুন তাই আপনি যখন কেবলমাত্র ডেটা পড়ার চেষ্টা করছেন আপনি তার জন্য সাধারণ ক্যোয়ারী ব্যবহার করতে পারেন তবে এই তিনটি জিনিসই একটি এবং অন্যান্য এবং ডাটাবেসের সাধারণ ধারণার সাথে সংযুক্ত থাকে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.