প্রশ্নের উত্তর দেওয়ার আগে আমি মনে করি কিছু ব্যাকগ্রাউন্ড ক্রমযুক্ত।
সমস্যার কোর
কয়েক বছর বিকাশকারী এবং বিকাশকারীদের নিয়োগের পরে, আমি দুটি জিনিস শিখেছি:
বিকাশকারীদের সংখ্যাগরিষ্ঠ ডেটাবেস ডিজাইনে খুব কম অভিজ্ঞতা আছে।
যারা ডেটাবেস বুঝতে পারছেন না এবং যারা ওআরএম ঘৃণা করেন তাদের মধ্যে আমি একটি আলগা সম্পর্ক খুঁজে পেয়েছি ।
(দ্রষ্টব্য: এবং হ্যাঁ, আমি জানি এমন অনেকে আছেন যারা খুব ভালভাবে ডাটাবেসগুলি বুঝতে পারেন যারা ওআরএমকে ঘৃণা করেন)
যখন বুঝতে পারি না কেন বিদেশী কী কেন তুমি Taiwan থেকে প্রস্তুতকারকের নাম এম্বেড করবেন না, গুরুত্বপূর্ণ item
টেবিল বা কেন customer.address1
, customer.address2
আর customer.address3
ক্ষেত্রের একটি ভাল ধারণা লেখার ডাটাবেসের বাগ তা তাদের জন্য সহজ করতে একটি ORM যোগ হয় না, কিছু সাহায্য করতে যাচ্ছে না।
পরিবর্তে, একটি সঠিকভাবে ডিজাইন করা ডাটাবেস এবং একটি ওলটিপি ব্যবহারের ক্ষেত্রে, ওআরএমগুলি সোনালি। বেশিরভাগ উদ্বেগজনক কাজ চলে যায় এবং ডিবিআইএক্স :: শ্রেণি :: স্কিমা :: লোডার এর মতো সরঞ্জামগুলি সহ আমি কয়েক মিনিটের মধ্যে পার্ল কোড থেকে একটি ভাল ডাটাবেস স্কিমায় যেতে পারি। আমি পেরেটো বিধিটি উদ্ধৃত করে বলব যে আমার 80% সমস্যা 20% কাজ দিয়ে সমাধান করা হয়েছে তবে বাস্তবে আমি এর চেয়ে আরও বেশি সুবিধা পেয়েছি।
সমাধানের অপব্যবহার করছি
কিছু লোক ORM গুলি ঘৃণা করার আরেকটি কারণ হ'ল তারা বিমূর্ততাটি ফাঁস হতে দেবে। আসুন এমভিসি ওয়েব অ্যাপ্লিকেশনগুলির সাধারণ ক্ষেত্রে বিবেচনা করি। এখানে আমরা সাধারণত দেখতে পাই এমন কিছু (সিউডো কোড):
GET '/countries/offices/$company' => sub {
my ( $app, $company_slug ) = @_;
my $company = $app->model('Company')->find({ slug => $company_slug })
or $app->redirect('/');
my $countries = $app->model('Countries')->search(
{
'company.company_id' => $company->company_id,
},
{
join => [ offices => 'company' ],
order_by => 'me.name',
},
);
$app->stash({
company => $company,
countries => $country,
});
}
লোকেরা এটির মতো নিয়ন্ত্রক রুট লেখেন এবং এটিকে ভাল, পরিষ্কার কোড বলে ভেবে নিজের পেছনে থাপ্পর মারবেন। তারা তাদের নিয়ামকগুলিতে হার্ড-কোডিং এসকিউএল দেখে বিস্মিত হবে, তবে তারা আলাদা এসকিউএল সিনট্যাক্স প্রকাশের চেয়ে আরও কিছু করেছেন। তাদের ORM কোডটি একটি মডেলের নীচে ঠেলাঠেলি করা দরকার এবং তারপরে তারা এটি করতে পারে:
GET '/countries/offices/$company' => sub {
my ( $app, $company_slug ) = @_;
my $result = $app->model('Company')->countries($company_slug)
or $app->redirect('/');
$app->stash({ result => $result });
}
জানো এখন কি হয়েছে? আপনি নিজের মডেলটি যথাযথভাবে সজ্জিত করেছেন, আপনি ওআরএমটি উন্মোচিত করেননি এবং পরে, যখন আপনি দেখতে পান যে আপনি ডাটাবেসের পরিবর্তে ক্যাশে থেকে সেই তথ্যটি আনতে পারেন, আপনার নিয়ন্ত্রণকারী কোড পরিবর্তন করার দরকার নেই (এবং এটি আরও সহজ) এর জন্য পরীক্ষা লিখতে এবং যুক্তিটি পুনরায় ব্যবহার করতে)।
বাস্তবে যা ঘটে তা হ'ল লোকেরা তাদের ওআরএম কোডটি তাদের সমস্ত নিয়ন্ত্রক (এবং মতামত) এর উপর ফাঁস করে দেয় এবং যখন তারা স্কেলেবিলিটি সমস্যাগুলি আঘাত করে তখন তারা তাদের স্থাপত্যের পরিবর্তে ওআরএমকে দোষ দেওয়া শুরু করে। ORM একটি খারাপ রেপ পায় (আমি এটি অনেক ক্লায়েন্টের জন্য বারবার দেখি)। পরিবর্তে, এই বিমূর্ততাটি আড়াল করুন যাতে আপনি যখন সত্যই ORM সীমাতে আঘাত হানেন, আপনি কোডটি এতটা দৃ tight়ভাবে ORM এর সাথে মিলিত হওয়ার চেয়ে আপনার সমস্যার উপযুক্ত সমাধান চয়ন করতে পারেন যে আপনি হগ-বাঁধা।
রিপোর্টিং এবং অন্যান্য সীমাবদ্ধতা
রব কিন্যন উপরে যেমন পরিষ্কার করেছিলেন, রিপোর্টিং ওআরএম-এর দুর্বলতা বলে মনে হয়। এটি বৃহত্তর সমস্যার একটি উপসেট যেখানে জটিল এসকিউএল বা এসকিউএল যা কখনও কখনও একাধিক টেবিলগুলিকে বিস্তৃত করে ORM এর সাথে ভাল কাজ করে না। উদাহরণস্বরূপ, কখনও কখনও ORM জোর করে এমন একটি জোড় জোর করে যা আমি চাই না এবং আমি কীভাবে এটি ঠিক করব তা বলতে পারি না। অথবা হতে পারে আমি মাইএসকিউএল এ একটি সূচক ইঙ্গিতটি ব্যবহার করতে চাই , তবে এটি সহজ নয় । অথবা কখনও কখনও এসকিউএলটি এতটাই বেআইনীভাবে জটিল হয় যে সরবরাহ করা বিমূর্তির চেয়ে এসকিউএল লিখতে ভাল লাগবে।
আমি ডিবিআইএক্স :: ক্লাস :: রিপোর্ট লেখা শুরু করার কারণ এটি । এখন পর্যন্ত এটি ভালভাবে কাজ করে এবং লোকেরা এখানে থাকা বেশিরভাগ সমস্যার সমাধান করে (এতক্ষণ তারা কেবল পঠনযোগ্য ইন্টারফেসের সাথে ঠিক আছে)। বাস্তবে এটি ক্রাচের মতো মনে হচ্ছে, যতক্ষণ না আপনি আপনার বিমূর্ততাটি ফাঁস করছেন না (আগের বিভাগে বর্ণিত হিসাবে) এটি DBIx::Class
কাজকে আরও সহজ করে তোলে ।
সুতরাং আমি কখন ডিবিআইএক্স :: ক্লাস বেছে নেব?
আমার জন্য, আমি এটি বেশিরভাগ সময় বেছে নেব যে আমার একটি ডাটাবেসের ইন্টারফেসের প্রয়োজন। আমি বছরের পর বছর ধরে এটি ব্যবহার করে আসছি। তবে, আমি এটি কোনও ওএলএপি সিস্টেমের জন্য বেছে নাও নিতে পারি এবং আরও নতুন প্রোগ্রামাররা অবশ্যই এটির সাথে লড়াই করতে চলেছে। এছাড়াও, আমি প্রায়শই দেখি যে আমার মেটা-প্রোগ্রামিং দরকার এবং DBIx::Class
সরঞ্জাম সরবরাহ করার সময় সেগুলি খুব খারাপভাবে নথিভুক্ত করা হয়।
DBIx::Class
সঠিকভাবে ব্যবহারের মূল চাবিকাঠি বেশিরভাগ ওআরএম-এর মতোই:
বিমূর্ততা ফাঁস করবেন না।
আপনার নিন্দিত পরীক্ষা লিখুন।
প্রয়োজন অনুসারে কীভাবে এসকিউএল এ নেমে যায় তা জানুন।
কীভাবে একটি ডাটাবেসকে সাধারণ করতে হয় তা শিখুন।
DBIx::Class
একবার আপনি এটি শিখলে, আপনার জন্য বেশিরভাগ ভারী উত্তোলনের যত্ন নেবে এবং দ্রুত অ্যাপ্লিকেশনগুলি লেখার জন্য এটি বাতাস তৈরি করে।