ডিডিডি সমষ্টিগুলি কি কোনও ওয়েব অ্যাপ্লিকেশনটিতে সত্যিই একটি ভাল ধারণা?


40

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

সমষ্টিগুলির ধারণাটি উদাহরণস্বরূপ sense আপনি মালিকানার ছোট ডোমেনগুলি তৈরি করেন যাতে আপনাকে পুরো ডোমেন মডেলটির সাথে ডিল করতে না হয়।

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

তাহলে আমি বুঝতে দলা ঠিক আছি, আমি সাধারণত একটি OrderAggregate যে সদস্যগণ থাকতে হবে ফিরতে সংগ্রহস্থলের প্যাটার্ন ব্যবহার করেন GetAll, GetByID, Delete, এবং Save। এটা শুনতে বেশ ভালো লাগছে. কিন্তু ...

আমি যদি আমার সমস্ত আদেশের তালিকাটি পেতে গেটআলকে কল করি তবে আমার কাছে মনে হবে যে এই প্যাটার্নটির জন্য সামগ্রিক তথ্যগুলি সম্পূর্ণ অর্ডার, অর্ডার লাইন, ইত্যাদি ফিরিয়ে আনার সম্পূর্ণ তালিকা প্রয়োজন হবে ... যখন আমার কেবল সেই তথ্যের একটি ছোট উপসেট প্রয়োজন (কেবলমাত্র শিরোনামের তথ্য)।

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

অবশ্যই, আপনার সংগ্রহস্থলগুলির মধ্যে একটি যেমন পদ্ধতি তৈরি করতে পারে GetOrderHeadersতবে এটি প্রথমে সংগ্রহস্থলের মতো প্যাটার্ন ব্যবহার করার উদ্দেশ্যকে পরাস্ত করে।

কেউ কি আমার জন্য এটি পরিষ্কার করতে পারে?

সম্পাদনা করুন:

আরও অনেক গবেষণার পরে, আমি মনে করি যে এখানে সংযোগ বিচ্ছিন্ন করা হল যে খাঁটি সংগ্রহস্থল প্যাটার্নটি বেশিরভাগ লোকেরা একটি সংগ্রহস্থলকে যা ভাবেন তার থেকে আলাদা।

ফোলার একটি স্টোরকে ডেটা স্টোর হিসাবে সংজ্ঞায়িত করে যা সংগ্রহ শব্দার্থক ব্যবহার করে এবং সাধারণত স্মৃতিতে রাখা হয়। এর অর্থ একটি সম্পূর্ণ অবজেক্ট গ্রাফ তৈরি করা।

সমষ্টিগত শিকড়গুলি অন্তর্ভুক্ত করার জন্য ইভানগুলি সংগ্রহস্থলকে পরিবর্তিত করে এবং এইভাবে সংগ্রহস্থল কেবলমাত্র একটি সমষ্টিতে অবজেক্টগুলিকে সমর্থন করার জন্য কেটে ফেলা হয়।

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

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

আমি উত্তরটি অনুমান করি যে এটি প্রথম যা ভাবা হয়েছিল তার চেয়ে অনেক জটিল ধারণা।


4
"আমি উত্তর অনুমান করি যে এটি প্রথম যা ভাবা হয়েছিল তার চেয়ে অনেক জটিল ধারণা is" এটা খুব সত্য।
কোয়ান্টিন-স্টারিন

আপনার পরিস্থিতির জন্য, আপনি সামগ্রিক মূল অবজেক্টের জন্য এমন একটি প্রক্সি তৈরি করতে পারেন যা কেবলমাত্র যখন অনুরোধ করা হয় কেবল তখনই তথ্যটি পুনরুদ্ধার করে এবং ক্যাশে করে
স্টিভেন এ লো লো

আমার পরামর্শ হ'ল মূল সামগ্রিক সমিতিগুলিতে অলস বোঝা বাস্তবায়ন করা। সুতরাং আপনি অনেকগুলি বস্তু লোড না করে শিকড়গুলির একটি তালিকা পুনরুদ্ধার করতে পারেন।
জুলিয়ানো

4
প্রায় 6 বছর পরে, এখনও একটি ভাল প্রশ্ন। লাল বইয়ের অধ্যায়টি পড়ার পরে, আমি বলব: আপনার সমষ্টিগুলি খুব বড় করবেন না। আপনার ডোমেন থেকে কিছু শীর্ষ-স্তরের ধারণা বাছাই করা এবং এটি রুল টু রুল টু অলকে বাদ দিয়ে ডিডিডি ছোট সংস্থাগুলির পক্ষে সমর্থন করে temp এবং আপনি উপরে বর্ণিত মত অদক্ষতা প্রশমিত করে।
সিপিটি সেনকফাস

আপনার সমষ্টিগুলি ডোমেনে প্রাকৃতিক এবং কার্যকর হওয়ার সময় যতটা সম্ভব ছোট হওয়া উচিত (একটি চ্যালেঞ্জ!)। তদতিরিক্ত, আপনার রেপোসের পক্ষে অত্যন্ত সুনির্দিষ্ট পদ্ধতি থাকা একেবারে সূক্ষ্ম এবং কাম্য ।
টিমো

উত্তর:


30

অনুসন্ধানের জন্য আপনার ডোমেন মডেল এবং সমষ্টিগুলি ব্যবহার করবেন না।

আসলে, আপনি যা জিজ্ঞাসা করছেন তা একটি সাধারণ পর্যাপ্ত প্রশ্ন যা ঠিক এড়াতে নীতি ও নিদর্শনগুলির একটি সেট প্রতিষ্ঠিত হয়েছে। একে সিকিউআরএস বলা হয়


2
@Mystere ম্যান: না, এটা হয় প্রয়োজনীয সর্বনিম্ন তথ্য প্রদানের জন্য। এটি একটি পৃথক পঠন মডেলের বৃহত উদ্দেশ্যগুলির মধ্যে একটি। এটি সামনের কিছু সাময়িক ইস্যু মোকাবেলায় সহায়তা করে। ডিজিডিতে প্রয়োগ করার সময় সিকিউআরএসের বেশ কয়েকটি সুবিধা রয়েছে।
কুইন্টিন-স্টারিন

2
@ মিস্ত্রি: আমি বেশ অবাক হয়েছি যে আপনি যদি আমার সাথে লিঙ্কিত নিবন্ধটি পড়েন তবে আপনি তা মিস করবেন। "প্রশ্নগুলি (প্রতিবেদন করা)" শিরোনামে বিভাগটি দেখুন: "যখন কোনও অ্যাপ্লিকেশন ডেটার জন্য অনুরোধ করছে ... এটি কোয়েরি স্তরটিতে একক কল করা উচিত এবং বিনিময়ে এটিতে প্রয়োজনীয় সমস্ত ডেটাযুক্ত একটি একক ডিটিও পাওয়া যাবে .." "এর কারণ হ'ল সাধারণত ডোমেন আচরণ কার্যকর হওয়ার চেয়ে অনেক গুণ বেশি তথ্য অনুসন্ধান করা হয়, সুতরাং এটি অনুকূলিতকরণের মাধ্যমে আপনি সিস্টেমটির অনুভূত কর্মক্ষমতা বাড়িয়ে তুলবেন।"
কুইন্টিন-স্টারিন

4
যে কারণে আমরা একটি সিকিউআরএস সিস্টেমে ডেটা পড়ার জন্য একটি সংগ্রহস্থল ব্যবহার করব না । আমরা কোনও কোয়েরি encapsulate করতে একটি সাধারণ ক্লাস লিখব (প্রযুক্তিটি যে কোনও সুবিধাজনক বা প্রয়োজনীয় ছিল তা ব্যবহার করে প্রায়শই সরল ADO. নেট বা লিনক 2 এসকিএল বা সাবসোনিক ভালভাবে এখানে ফিট করে), এড়াতে কাজের জন্য প্রয়োজনীয় সমস্ত তথ্য (কেবল) ফিরিয়ে দেওয়া ডিডিডি সংগ্রহস্থলের সমস্ত সাধারণ স্তরগুলির মাধ্যমে ডেটা টেনে আনা। আমরা যদি ডোমেনে একটি আদেশ প্রেরণ করতে চাইতাম তবে আমরা কেবলমাত্র একটি সমষ্টি পুনরুদ্ধার করতে একটি সংগ্রহশালা ব্যবহার করব।
কুইন্টিন-স্টারিন

9
"আমি কখনই ভাবতে পারি না যে আপনার যখন প্রয়োজন হবে না তখন যে কেউ পুরো সামগ্রীর তথ্য ফিরিয়ে দেওয়ার পক্ষে কথা বলবে।" আমি এই বক্তব্যের সাথে আপনি ঠিক ঠিক আছে তা বলার চেষ্টা করছি। আপনার যখন প্রয়োজন হবে না তখন সামগ্রিক সামগ্রিক তথ্য পুনরুদ্ধার করবেন না। এটি সিকিউআরএসের খুব মূল ডিডিডি প্রয়োগ করা হয়। ক্যোয়ারী করার জন্য আপনার সামগ্রিক দরকার নেই। একটি ভিন্ন ব্যবস্থার মাধ্যমে ডেটা পান এবং তারপরে এটি ধারাবাহিকভাবে করুন।
কোয়ান্টিন-স্টারিন

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

8

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

  1. একটি সংগ্রহস্থল সহজ হতে হবে; এটি কেবলমাত্র ডোমেন অবজেক্টগুলি সঞ্চয় এবং সেগুলি পুনরুদ্ধারের জন্য দায়ী। অন্য সমস্ত যুক্তি অন্য কারনে যেমন কারখানা এবং ডোমেন পরিষেবাগুলিতে হওয়া উচিত।

  2. একটি সংগ্রহস্থল সংগ্রহের মতো আচরণ করে যেমন এটি মোট শিকড়ের স্মৃতি সংগ্রহের।

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

  4. আদর্শভাবে সন্ধানকারী পদ্ধতিগুলি কেবলমাত্র সামগ্রিক শিকড়কে ফিরিয়ে দেবে। যদি এটি অদক্ষ হয়ে থাকে তবে এটির জন্য কেবলমাত্র মূল্যমানের অবজেক্টগুলিও আপনাকে যা প্রয়োজন ঠিক তার চেয়ে বেশি ফেরত দিতে পারে (যদিও এটি যদি একটি মান হয় তবে এই মান বস্তুগুলি ডোমেনের ক্ষেত্রেও প্রকাশ করা যেতে পারে)। একটি সর্বশেষ অবলম্বন হিসাবে সংগ্রহস্থলটি একটি সামগ্রীর মূলের সাবসেটের উপসেটগুলি বা সংগ্রহগুলি ফেরত পাঠাতে ব্যবহৃত হতে পারে।

  5. এগুলির মতো পছন্দগুলি ব্যবহৃত প্রযুক্তির উপর নির্ভর করে, কারণ আপনার ব্যবহার করা প্রযুক্তিগুলির সাথে আপনার ডোমেন মডেলকে সর্বাধিক দক্ষতার সাথে প্রকাশ করার উপায় খুঁজে বের করতে হবে।


এটি অবশ্যই নিশ্চিত একটি জটিল বিষয়। তত্ত্বকে অনুশীলনে রূপান্তর করা বিশেষত যখন এটি দুটি স্বতন্ত্র এবং পৃথক তত্ত্বকে একক অনুশীলনের সাথে সংযুক্ত করে।
সেবাস্তিয়ান প্যাটেন

6

আমি মনে করি না যে আপনার গেটঅর্ডারহাইডার্স পদ্ধতিটি সংগ্রহস্থলের উদ্দেশ্যটি একেবারে পরাস্ত করে।

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

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


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

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

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

4

আমার ডিডিডি ব্যবহারটি "খাঁটি" ডিডিডি হিসাবে বিবেচিত হবে না তবে আমি ডিবি ডেটা স্টোরের বিপরীতে ডিডিডি ব্যবহার করে নিম্নলিখিত বাস্তব বিশ্ব কৌশলগুলি গ্রহণ করেছি।

  • একটি সামগ্রিক মূলের একটি সম্পর্কিত সংগ্রহস্থল রয়েছে
  • সম্পর্কিত ভান্ডারগুলি কেবলমাত্র এই সমষ্টিগত রুট দ্বারা ব্যবহৃত হয় (এটি সর্বজনীনভাবে উপলভ্য নয়)
  • একটি সংগ্রহস্থলে কোয়েরি কল থাকতে পারে (যেমন, getAllActiveOrders, GetOrderItemsForOrder)
  • একটি পরিষেবা সংগ্রহস্থল এবং অন্যান্য অ-ক্রুড ক্রিয়াকলাপগুলির একটি সর্বজনীন উপসেট উন্মোচিত করে (উদাহরণস্বরূপ এক ব্যাঙ্ক অ্যাকাউন্ট থেকে অন্য ব্যাঙ্কে লোডবাইআইডি, অনুসন্ধান / অনুসন্ধান, ক্রিয়েটনেটি ইত্যাদি) স্থানান্তর করুন।
  • আমি রুট -> পরিষেবা -> সংগ্রহস্থল স্ট্যাক ব্যবহার করি। একটি ডিডিডি পরিষেবাটি কেবলমাত্র মনে করা হয় যে কোনও সত্তা নিজেই উত্তর দিতে পারে না এমন কোনও কিছুতে (যেমন লোডবাইআইডি, ট্রান্সফারমনিফ্র্যামকাউন্টটিও অ্যাকাউন্ট), তবে সত্যিকারের বিশ্বে আমি অন্যান্য সিআরইউডি সম্পর্কিত পরিষেবাগুলিতে (সেভ, ডিলিট, কোয়েরি) আটকে থাকি though রুট এগুলি নিজেরাই "উত্তর / সম্পাদন" করতে সক্ষম হবে। মনে রাখবেন যে অন্য একটি সামগ্রিক রুট পরিষেবায় কোনও সত্তাকে অ্যাক্সেস দেওয়ার ক্ষেত্রে কোনও দোষ নেই! তবে মনে রাখবেন আপনি কোনও পরিষেবাদিতে (গেটআর্ডারআইটেমফোরআর্ডার) অন্তর্ভুক্ত করবেন না তবে এটি সংগ্রহস্থলে অন্তর্ভুক্ত করবেন যাতে সমষ্টিগত রুট এটি ব্যবহার করতে পারে। মনে রাখবেন যে কোনও পরিষেবাতে কোনও সংগ্রহস্থল ক্যানের মতো উন্মুক্ত প্রশ্নের উদ্বোধন করা উচিত নয়।
  • আমি সাধারণত ডোমেন মডেলের (ইন্টারফেসের মাধ্যমে) বিমূর্তভাবে একটি সংগ্রহস্থল সংজ্ঞায়িত করি এবং একটি পৃথক কংক্রিট বাস্তবায়ন সরবরাহ করি। আমি ডোমেন মডেলের কোনও পরিষেবা এর ব্যবহারের জন্য একটি কংক্রিটের সংগ্রহস্থলে ইনজেকশন করার সম্পূর্ণরূপে সংজ্ঞা দিয়েছি।

** আপনাকে পুরো একটি সম্পূর্ণ ফিরিয়ে আনতে হবে না। তবে, আপনি যদি আরও কিছু চান তবে আপনাকে রুটটি জিজ্ঞাসা করতে হবে, অন্য কোনও পরিষেবা বা সংগ্রহশালা নয়। এটি অলস লোডিং হয় এবং হয় দরিদ্র লোকের অলস লোডিংয়ের সাথে ম্যানুয়ালি করা যেতে পারে (যথাযথ সংগ্রহস্থল / পরিষেবাটি রুটটিতে ইনজেকশন দেওয়া) বা এটি সমর্থন করে এমন ORM ব্যবহার করে।

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


3

আপনার ডোমেন মডেলটি তার ব্যবসায়ের যুক্তিটিকে বিশুদ্ধতম আকারে ধারণ করে। ব্যবসায়িক ক্রিয়াকলাপকে সমর্থন করে এমন সমস্ত সম্পর্ক এবং ক্রিয়াকলাপ। আপনি আপনার ধারণাগত মানচিত্র থেকে যা হারিয়েছেন তা হ'ল অ্যাপ্লিকেশন সার্ভিস লেয়ারের ধারণাটি পরিষেবা স্তরটি ডোমেন মডেলটির চারপাশে আবৃত হয় এবং ব্যবসার ডোমেনের একটি সরল দৃশ্য সরবরাহ করে (আপনি যদি চান তবে একটি প্রজেকশন) যা ডোমেন মডেলটিকে প্রয়োজনীয়ভাবে পরিবর্তন করতে দেয় পরিষেবা স্তরটি ব্যবহার করে সরাসরি অ্যাপ্লিকেশনগুলিকে প্রভাবিত না করে।

সামনে যাচ্ছি. সমষ্টি সম্পর্কে ধারণাটি হ'ল একটি সামগ্রি রয়েছে, সমষ্টিগত মূল, সমষ্টিটির ধারাবাহিকতা বজায় রাখার জন্য দায়ী। আপনার উদাহরণে, আদেশটি তার আদেশের লাইনগুলিকে হস্তক্ষেপ করার জন্য দায়ী responsible

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

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

একটি সঞ্চয়ী ডোমেন এবং ডেটা ম্যাপিং স্তরগুলির মধ্যে মধ্যস্থতা করে, মেমোরি ডোমেন অবজেক্ট সংগ্রহের মতো কাজ করে। ক্লায়েন্ট অবজেক্টস ক্যোয়ারী স্পেসিফিকেশনগুলি ঘোষণামূলকভাবে তৈরি করে এবং সন্তুষ্টির জন্য সেগুলি সংগ্রহস্থলে জমা দেয়। ( ফাউলারের সংগ্রহশালা পৃষ্ঠা থেকে )

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

আশা করি এটি বিষয়গুলিকে স্পষ্ট করতে সহায়তা করে।


0

আমি জানি এটি একটি পুরানো প্রশ্ন তবে আমি অন্যরকম উত্তর পেয়েছি বলে মনে হচ্ছে।

আমি যখন কোনও সংগ্রহশালা তৈরি করি তখন এটি সাধারণত কিছু ক্যাশেড কোয়েরিগুলিকে মোড়ানো হয় ।

ফোলার একটি স্টোরকে ডেটা স্টোর হিসাবে সংজ্ঞায়িত করে যা সংগ্রহ শব্দার্থক ব্যবহার করে এবং সাধারণত স্মৃতিতে রাখা হয়। এর অর্থ একটি সম্পূর্ণ অবজেক্ট গ্রাফ তৈরি করা।

আপনার সার্ভারে এই সংগ্রহস্থলগুলিকে রাখুন। তারা কেবল ডাটাবেসে বস্তুর মধ্য দিয়ে যাচ্ছেন না!

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

এই মুহুর্তে আপনার কাছে দুটি বিকল্প রয়েছে।

  1. আপনি ডাটাবেসটি জিজ্ঞাসা করতে পারেন এবং তালিকা তৈরি করতে আপনার ঠিক কীটি টানতে পারেন, তারপরে বিশদ বিবরণটিতে আপনার দেখতে থাকা পৃথক বিশদটি টানতে আবার জিজ্ঞাসা করুন।

  2. আপনি 1 টি ক্যোয়ারী তৈরি করতে পারেন যা সমস্ত তথ্য পিছনে ফেলে এবং এটি ক্যাশে করে। পরবর্তী পৃষ্ঠার অনুরোধে আপনি ডাটাবেসের পরিবর্তে সার্ভার র‌্যাম থেকে পড়েছেন। যদি তিনি ব্যবহারকারীর পিছনে হিট হয় বা পরবর্তী পৃষ্ঠাটি নির্বাচন করে আপনি এখনও ডাটাবেসে শূন্য ট্রিপ করছেন।

বাস্তবে আপনি কীভাবে এটি বাস্তবায়ন করেন এটি কেবলমাত্র এবং বাস্তবায়নের বিশদ। যদি আমার বৃহত্তম ব্যবহারকারীর 10 টি আদেশ থাকে আমি সম্ভবত 2 বিকল্পটি নিয়ে যেতে চাই I'm আমি যদি 10,000 টি অর্ডার বলছি তবে বিকল্প 1 প্রয়োজন is উপরের দুটি ক্ষেত্রে এবং অন্যান্য অনেক ক্ষেত্রে আমি সংগ্রহস্থলটি প্রয়োগের বিশদটি গোপন রাখতে চাই।

অর্ডার তালিকার পৃষ্ঠায় গত মাসে অর্ডারগুলিতে তারা কীভাবে ব্যয় করেছে ( সমষ্টিভিত্তিক ডেটা ) ব্যবহারকারীকে বলতে টিকিট পেলে আমি এগিয়ে যাচ্ছি , এসকিউএল-তে এটি গণনা করার জন্য আমি যুক্তিটি লিখব এবং আরও একটি রাউন্ড ভ্রমণ করব? ডিবি বা আপনি বরং সার্ভারের র‌্যামে থাকা ডেটা ব্যবহার করে এটি গণনা করবেন?

আমার অভিজ্ঞতায় ডোমেনের সমষ্টিগুলি বিশাল সুবিধা দেয়।

  • এগুলি একটি বিশাল অংশের কোড পুনরায় ব্যবহার যা আসলে কাজ করে।
  • এসকিএল সার্ভারটি করার জন্য কোনও অবকাঠামোগত স্তরের মাধ্যমে ড্রিল করার পরিবর্তে তারা আপনার ব্যবসায়িক যুক্তিটিকে মূল স্তরে ডান রেখে কোডকে সহজতর করে।
  • আপনি সহজেই ক্যাশে রাখতে পারেন সেহেতু আপনার প্রয়োজনীয় প্রশ্নের সংখ্যা হ্রাস করে তারা আপনার প্রতিক্রিয়ার সময়গুলি নাটকীয়ভাবে গতিতে পারে।
  • আমি যে এসকিউএল লিখছি তা প্রায়শই আরও রক্ষণাবেক্ষণযোগ্য যেহেতু আমি প্রায়শই কেবল সমস্ত কিছু জিজ্ঞাসা করি এবং সার্ভারের দিকটি গণনা করি।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.