বড় সিস্টেমের সাথে সত্তা ফ্রেমওয়ার্ক - মডেলগুলি কীভাবে ভাগ করবেন?


50

আমি একটি এসকিউএল সার্ভার ডাটাবেসের সাথে 1000+ টেবিল, আরও কয়েক'শ ভিউ এবং কয়েক হাজার সঞ্চিত পদ্ধতি সহ কাজ করছি। আমরা আমাদের নতুন প্রকল্পগুলির জন্য সত্তা ফ্রেমওয়ার্ক ব্যবহার শুরু করার সন্ধান করছি এবং আমরা এটি করার জন্য আমাদের কৌশল নিয়ে কাজ করছি। আমি যে জিনিসটি ঝুলিয়ে রেখেছি তা হ'ল কীভাবে সারণিগুলি বিভিন্ন মডেলগুলিতে বিভক্ত করা যায় (EDMX বা DbContext যদি আমরা কোডটি প্রথমে যাই তবে)। আমি ব্যাট থেকে ঠিক কয়েকটি কৌশল সম্পর্কে ভাবতে পারি:

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

এত বড় ডাটাবেসের বিরুদ্ধে ইএফ ব্যবহারের জন্য সেরা অনুশীলন কী? বিশেষত লোকেরা ডিবি অবজেক্টের এই ভলিউমের বিপরীতে মডেলগুলি ডিজাইনে কী কৌশল ব্যবহার করে? এমন কি বিকল্প রয়েছে যা আমি উপরের চেয়ে তার চেয়ে ভাল সেই কাজটির কথা ভাবছি না?

এছাড়াও, NHibernate এর মতো অন্যান্য ওআরএমগুলিতেও কি এই সমস্যা? যদি তা হয় তবে তারা কি এএফ এর চেয়ে আরও ভাল সমাধান নিয়ে এসেছেন?


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

@ জাজার ধন্যবাদ আমি এমএস ডিটিসি আগেও ব্যবহার করেছি এবং এটি বেশ সহজ হলেও এটি একটি সাধারণ ডিবি txn এর বাইরে জটিলতা যুক্ত করে তাই আমি যখনই সম্ভব এটি এড়াতে চাই।
রেশনালজিখ

2
4 বছর পরে, আপনি কী সিদ্ধান্ত নিয়েছেন এবং এখন আপনি কী সুপারিশ করবেন?
ররি

উত্তর:


31

ব্যক্তিগতভাবে, আমি মোটামুটি জটিল তবে ছোট প্রকল্পে (~ 300 টেবিল) আমার সমস্ত সত্তার জন্য একটি বিশাল স্কিমা তৈরি করার চেষ্টা করেছি। আমাদের অনেকগুলি অনেক "অনেকের সাথে" সম্পর্ক এবং চূড়ান্ত রেফারেন্সিয়াল অখণ্ডতা প্রয়োগের সাথে একটি অত্যন্ত সাধারণীকরণ করা ডেটাবেস ছিল (5th ম ফর্মের নরমালাইজেশন (আমি lyিলেভাবে বলি))।

আমরা একটি "অনুরোধ প্রতি একক উদাহরণ" কৌশলও ব্যবহার করেছি যা আমি নিশ্চিতভাবেই সহায়তা করি না helped

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

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

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

এটি হ'ল এন্টি ফ্রেমওয়ার্ক 4.1 দিয়ে। আমি আপনার শেষ পছন্দ এবং অভিজ্ঞতা সম্পর্কে শুনতে আগ্রহী হতে চাই।

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

আশা করি এটা কাজে লাগবে.


1
এফওয়াইআই - একটি এনএইচবারনেট ম্যাপিং ইউটিলিটি রয়েছে যা এই ম্যাপিংগুলিকে খুব সহজ এবং স্বয়ংক্রিয় করে তোলে।
গ্যাণ্ডারগুলি

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

1
হ্যাঁ এটি করে (জিইউআই)। আমি এখনও পর্যন্ত এটি নিয়ে শূন্য সমস্যা ছিল। এটি 4 বা 5 টি বিভিন্ন প্রকল্প / ওয়েবসাইটে ব্যবহৃত হয়েছে। দ্রষ্টব্য: আমি এটি ফ্লুয়েট এনএইচবারনেট দিয়ে ব্যবহার করি, যা সি # কোডে ম্যাপিং করে, কনফিগারেশন / এক্সএমএল ফাইলগুলিতে নয়। এখানে একটি লিঙ্ক রয়েছে: nmg.codeplex.com
গ্যাণ্ডারগুলি

13

আমাকে সাধারণ ব্যাখ্যা দিয়ে শুরু করতে দাও: আমার এত বড় ডেটাবেস নিয়ে অভিজ্ঞতা নেই তাই আমার বাকী উত্তরগুলি বাস্তব বিশ্বের উদাহরণের ভিত্তিতে নয় not

সুতরাং আপনার একটি বড় ডেটাবেস আছে এবং আপনি এটি ওআরএম / ইএফ দিয়ে ব্যবহার করতে চান। আমি দ্বিতীয় পছন্দ সঙ্গে যেতে হবে। এখানে আমার সহজ ব্যাখ্যা এখানে কেন:

  • ম্যাপিং জটিলতা যুক্ত করে। আপনার বর্তমান অ্যাপ্লিকেশন / প্রকল্প / মডিউলটির প্রয়োজন নেই সত্তাগুলির সাথে জটিলতা যুক্ত করার দরকার নেই তবে গ্রানুলারিটি খুব কম স্তর তৈরি করবেন না। প্রতি স্ক্রিনে পৃথক ম্যাপিং সেট করা আপনাকেও সহায়তা করবে না।
  • আপনি কাজের ইউনিট অর্জন করতে চান। সর্বাধিক ক্ষেত্রে কোন সারণী মডিউলটির প্রয়োজন তা নির্দিষ্ট করতে সক্ষম হওয়া উচিত (সমস্ত ক্ষেত্রে প্রয়োজনীয় নয়)। আপনি যদি এই টেবিলগুলিকে একক ম্যাপিং সেটে রাখেন তবে আপনি একক প্রসঙ্গ উদাহরণের মাধ্যমে পঠন এবং ডেটা সংশোধন পরিচালনা করতে সক্ষম হবেন - এটিই আপনার চূড়ান্ত লক্ষ্য হওয়া উচিত।
  • আপনি মডেল দ্বারা ঠিক কী বোঝেন তা নিশ্চিত নই তবে বিভিন্ন ম্যাপিং সেট সহ আপনি একই সত্তার প্রকারগুলি ব্যবহার করে ম্যাপিং সেটগুলির মধ্যে ক্লাস ভাগ করতে পারেন। সুতরাং আপনি যদি দুটি মডিউলটিতে ব্যবহারকারীর টেবিল ব্যবহার করেন তবে একই প্রতিনিধিত্ব করতে আপনার দুটি ব্যবহারকারীর ক্লাসের প্রয়োজন হবে না। আপনি এখনও একক টেবিল ব্যবহার করতে পারেন এবং কোড ম্যাপিংয়ের ক্ষেত্রে (ওরফে কোড-ফার্স্ট) আপনি একবার ম্যাপিংকে সংজ্ঞায়িত করতে এবং একাধিক ম্যাপিং সেটগুলিতে এটি লোড করতে পারেন যাতে DRY নীতিটি লঙ্ঘিত হয় না তবে কোড-ফার্স্ট পদ্ধতির আরও সীমাবদ্ধতা থাকে যখন তা আসে মতামত এবং সঞ্চিত পদ্ধতিতে। ইডিএমএক্স এটি আরও শক্ত করে তোলে। আপনি এখনও ক্লাস পুনরায় ব্যবহার করতে পারেন তবে ম্যাপিংটিকে পুনরায় ব্যবহার করা অসম্ভব।
  • ক্রস মডিউল অনুসন্ধান সম্পর্কে কি? এই প্রশ্নগুলি ঘটতে পারে তবে সত্য কথা বলতে কি সবকিছু ইএফ দ্বারা পরিচালনা করতে হবে না। আপনি নিয়মিত ডেটা অ্যাক্সেসকে সহজ করার জন্য সাধারণ ক্ষেত্রে EF এর সুবিধা নিতে পারেন তবে আপনার যদি কোথাও বিশেষ কোয়েরির জন্য প্রয়োজন হয় যা 5 টি বিভিন্ন মডিউল সম্পর্কিত টেবিলগুলিতে যোগ দেয় আপনি কেবল এটি সরাসরি চালনা করতে পারেন বা সঞ্চিত পদ্ধতিতে এটি মোড়ানো করতে পারেন। নেটিভ ডেটা অ্যাক্সেসের 100% প্রতিস্থাপন কঠিন, জটিল এবং বিপরীতে উত্পাদনশীল হতে পারে।
  • শেষ পয়েন্টটি কেবল ব্যবহারিক: আমি বিশ্বাস করি না যে ভিএস টুলিং এত বড় সামগ্রীর সাথে কাজ করতে প্রস্তুত - ডিজাইনারে নয়, এমনকি আমদানি সরঞ্জামও নয়। আমি ভিএস ২০০৮-তে প্রচলিত ডেটা অ্যাক্সেস এবং এসকিউএল ডাটাবেস প্রকল্পের সাথে খুব বড় ডেটাবেসে কাজ করতাম - একটি জটিল প্রকল্পের ব্যবহারকারীর অভিজ্ঞতা খুব খারাপ ছিল। আপনাকে অবশ্যই ব্যবহৃত টেবিলগুলির সংখ্যা কম রাখতে হবে - ডিজাইনারের জন্য ক্যাপটি 100-200 এর মধ্যে হওয়া উচিত তবে একক প্রসঙ্গ (ম্যাপিং সেট) দ্বারা পরিচালিত 100 টি টেবিলগুলি এক শ্রেণির জন্য খুব বেশি দায়িত্ব বলে মনে হচ্ছে (মনে করুন যে আপনার 100 সেট বৈশিষ্ট্য থাকবে প্রসঙ্গে প্রকাশিত - এটি কোনও ভাল ডিজাইনের মতো দেখাচ্ছে না)।

4

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

"একজন ভাল আর্কিটেক্ট সর্বাধিক পরিমাণে সিদ্ধান্ত নেয় না।" রবার্ট সি মার্টিন

http://cleancoder.posterous.com/architecture-deference


3

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


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

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

আপনার ডেটা অ্যাক্সেস করার সময় আপনি সর্বদা আপনার কার্য সম্পাদন করতে পারেন তা উল্লেখ করতে ভুলে গেছেন। অলস / উত্সাহী লোডিং বিকল্পগুলি এবং আপনি কোন শিশু সত্তা নিয়ে আসছেন তা দেখুন you're যদি আপনি বিশাল বস্তু গাছগুলি লোড না করে থাকেন তবে একটি পূর্ণ মডেল ছোট্টের চেয়ে খারাপ আচরণ করার কোনও কারণ আমি দেখতে পাচ্ছি না।
নিক

আমি বড় আকারের স্কিমার সাথে ডিল করার সময় বিশাল বস্তু গাছ এবং একটি স্বাভাবিক তথ্য কাঠামো
হাতছাড়া করে বলব

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