এটি এমন একটি বিষয় যা আমি অতীতে গবেষণার জন্য কয়েক ঘন্টা ব্যয় করেছি। এটি আমার কাছে এমন একটি বলে মনে হয়েছে যা আধুনিক আরডিবিএমএস সমাধানগুলির দ্বারা সম্বোধন করা উচিত ছিল তবে এখনও আমি এমন কোনও কিছুই খুঁজে পাইনি যা আমি দেখতে পাচ্ছি যা কোনও ডাটাবেস ব্যাক-এন্ডের সাথে কোনও ওয়েব বা উইন্ডোজ অ্যাপ্লিকেশনটিতে অবিশ্বাস্যভাবে সাধারণ প্রয়োজন বলে আমি মনে করি।
আমি গতিশীল বাছাইয়ের কথা বলি। আমার কল্পনার জগতে এটি এমন কিছুর মতো সহজ হওয়া উচিত:
ORDER BY @sortCol1, @sortCol2
এটি নবাগত এসকিউএল এবং সঞ্চিত প্রক্রিয়া বিকাশকারীরা ইন্টারনেট জুড়ে সমস্ত ফোরামে প্রদত্ত আধ্যাত্মিক উদাহরণ । "কেন এটা সম্ভব হচ্ছে না?" তারা জানেত চাইল. অবিচ্ছিন্নভাবে, অবশেষে কেউ তাদের সংগ্রহযোগ্য প্রক্রিয়াগুলির সংকলিত প্রকৃতি, সাধারণভাবে কার্যকর করার পরিকল্পনা এবং অন্যান্য ধরণের কারণে যে কোনও প্যারামিটারটি সরাসরি কোনও দণ্ডে স্থাপন করা সম্ভব নয় সে সম্পর্কে তাদের বক্তৃতা দিতে ORDER BY
এসেছিলেন।
আপনারা কেউ কেউ ইতিমধ্যে কী ভাবছেন তা আমি জানি: "ক্লায়েন্টকে বাছাই করা যাক, তবে।" স্বাভাবিকভাবেই, এটি আপনার ডাটাবেস থেকে কাজটি অফলোড করে। আমাদের ক্ষেত্রে যদিও, আমাদের ডাটাবেস সার্ভারগুলি এমনকি সময়ের 99% ঘামও ভাঙছে না এবং তারা এমনকি বহু-কোর এখনও বা সিস্টেম আর্কিটেকচারে প্রতি my মাসে ঘটে এমন অন্যান্য অগণিত উন্নতিগুলির মধ্যে নেই। একা এই কারণেই, আমাদের ডাটাবেসগুলি হ্যান্ডেল বাছাই করা কোনও সমস্যা হবে না। অতিরিক্তভাবে, ডাটাবেস খুববাছাই এ ভাল। তারা এটির জন্য অনুকূলিত হয়েছে এবং এটি সঠিকভাবে অর্জন করার জন্য বহু বছর সময় লেগেছে, এটি করার জন্য ভাষাটি অবিশ্বাস্যরূপে নমনীয়, স্বজ্ঞাত এবং সহজ এবং সর্বোপরি যে কোনও শিক্ষানবিশ এসকিউএল লেখক এটি কীভাবে করতে জানেন এবং আরও গুরুত্বপূর্ণভাবে তারা এটি সম্পাদনা করতে জানেন, পরিবর্তনগুলি করুন, রক্ষণাবেক্ষণ করুন ইত্যাদি When যখন আপনার ডাটাবেসগুলি কর আদায় করা থেকে দূরে থাকে এবং আপনি কেবল উন্নয়নের সময়টিকে সহজ করতে চান (এবং সংক্ষিপ্ত করুন!) এটি একটি সুস্পষ্ট পছন্দ বলে মনে হয়।
তারপরে ওয়েব সমস্যা আছে। আমি জাভাস্ক্রিপ্টের সাথে খেলেছি যা এইচটিএমএল টেবিলগুলির ক্লায়েন্ট-সাইড বাছাই করবে, তবে তারা অবশ্যম্ভাবীভাবে আমার প্রয়োজনের জন্য যথেষ্ট নমনীয় নয় এবং আবারও, যেহেতু আমার ডাটাবেসগুলি অতিরিক্ত মাত্রায় ট্যাক্সযুক্ত নয় এবং সত্যই সহজেই বাছাই করতে পারে, আমি আমার নিজের জাভাস্ক্রিপ্ট সর্টর পুনরায় লেখার জন্য বা রোল করতে যে সময় লাগে তার ন্যায্যতা জানাতে একটি কঠিন সময় কাটাতে হবে। এটি সাধারণত সার্ভার-সাইড বাছাইয়ের ক্ষেত্রে যায় যদিও এটি ইতিমধ্যে সম্ভবত জাভাস্ক্রিপ্টের চেয়ে অনেক বেশি পছন্দসই। আমি এমন কেউ নই যা বিশেষ করে ডেটাসেটের ওভারহেড পছন্দ করে, তাই আমাকে মামলা করুন।
তবে এটি এমন পয়েন্টটি ফিরিয়ে আনে যে এটি সম্ভব নয় - বা বরং সহজেই নয়। পূর্ববর্তী সিস্টেমগুলির সাথে আমি গতিশীল বাছাইয়ের অবিশ্বাস্যভাবে হ্যাক করার উপায়টি করেছি। এটি সুন্দর নয়, স্বজ্ঞাত, সরল বা নমনীয়ও ছিল না এবং কয়েক সপ্তাহের মধ্যেই একজন শিক্ষানবিশ এসকিউএল লেখক হারিয়ে যেতে বসতেন। ইতিমধ্যে এটি এতটা "সমাধান" নয় বরং "জটিলতা" হিসাবে দেখা যাচ্ছে।
নিম্নলিখিত উদাহরণগুলি কোনও ধরণের সেরা অনুশীলনগুলি বা ভাল কোডিং শৈলী বা কোনও কিছু প্রকাশ করার জন্য নয়, তারা টি-এসকিউএল প্রোগ্রামার হিসাবে আমার দক্ষতার পরিচায়কও নয়। তারা যা সেগুলি এবং আমি সম্পূর্ণরূপে স্বীকার করি তারা বিভ্রান্তিকর, খারাপ ফর্ম এবং কেবল সরল হ্যাক।
আমরা একটি সঞ্চিত পদ্ধতিতে পরামিতি হিসাবে একটি পূর্ণসংখ্যার মানটি পাস করি (আসুন প্যারামিটারটিকে কেবল "সাজান" বলি) এবং সেখান থেকে আমরা অন্যান্য ভেরিয়েবলগুলির একটি গুচ্ছ নির্ধারণ করি। উদাহরণস্বরূপ ... ধরা যাক বাছাই 1 (বা ডিফল্ট):
DECLARE @sortCol1 AS varchar(20)
DECLARE @sortCol2 AS varchar(20)
DECLARE @dir1 AS varchar(20)
DECLARE @dir2 AS varchar(20)
DECLARE @col1 AS varchar(20)
DECLARE @col2 AS varchar(20)
SET @col1 = 'storagedatetime';
SET @col2 = 'vehicleid';
IF @sort = 1 -- Default sort.
BEGIN
SET @sortCol1 = @col1;
SET @dir1 = 'asc';
SET @sortCol2 = @col2;
SET @dir2 = 'asc';
END
ELSE IF @sort = 2 -- Reversed order default sort.
BEGIN
SET @sortCol1 = @col1;
SET @dir1 = 'desc';
SET @sortCol2 = @col2;
SET @dir2 = 'desc';
END
আপনি ইতিমধ্যে দেখতে পাচ্ছেন যে কীভাবে আমি যদি অন্যান্য কলামগুলি সংজ্ঞায়িত করতে আরও @ কলএক্স ভেরিয়েবল ঘোষণা করি আমি "সাজানোর" মানের উপর ভিত্তি করে সাজানোর জন্য কলামগুলি সহ সত্যই সৃজনশীল হতে পারি ... এটি ব্যবহার করার জন্য, এটি সাধারণত নীচের মতো দেখতে শেষ হয় অবিশ্বাস্যরকম অগোছালো ধারা:
ORDER BY
CASE @dir1
WHEN 'desc' THEN
CASE @sortCol1
WHEN @col1 THEN [storagedatetime]
WHEN @col2 THEN [vehicleid]
END
END DESC,
CASE @dir1
WHEN 'asc' THEN
CASE @sortCol1
WHEN @col1 THEN [storagedatetime]
WHEN @col2 THEN [vehicleid]
END
END,
CASE @dir2
WHEN 'desc' THEN
CASE @sortCol2
WHEN @col1 THEN [storagedatetime]
WHEN @col2 THEN [vehicleid]
END
END DESC,
CASE @dir2
WHEN 'asc' THEN
CASE @sortCol2
WHEN @col1 THEN [storagedatetime]
WHEN @col2 THEN [vehicleid]
END
END
অবশ্যই এটি একটি খুব প্রত্যাহারযোগ্য উদাহরণ। আসল স্টাফ, যেহেতু সাধারণত চার বা পাঁচটি কলাম আপনার বাছাইকে সমর্থন করে থাকে, প্রত্যেকটি সম্ভাব্য মাধ্যমিক বা তৃতীয় কলামের পাশাপাশি সারণি করা যায় (উদাহরণস্বরূপ তারিখের উত্থানের পরে নাম অনুসারে দ্বিতীয়ভাবে সাজানো হয়) এবং প্রতিটি সমর্থন দ্বি-দ্বি- দিকনির্দেশক বাছাই যা কার্যকরভাবে কেসের সংখ্যা দ্বিগুণ করে। হ্যাঁ ... এটি সত্যিই লোমশ হয়ে ওঠে।
ধারণাটি হ'ল যে কেউ স্টোরজেটেটটাইমের আগে এই ধরণের যানবাহনটিকে সাজিয়ে তোলার ক্ষেত্রে "সহজেই" পরিবর্তন করতে পারে ... তবে সিউডো-নমনীয়তা, অন্তত এই সাধারণ উদাহরণে সত্যই সেখানে শেষ হয়। মূলত, প্রতিটি ক্ষেত্রে যা একটি পরীক্ষায় ব্যর্থ হয় (কারণ আমাদের সাজানোর পদ্ধতিটি এবার প্রায় এটির জন্য প্রয়োগ হয় না) একটি নুল মান দেয়। এবং এইভাবে আপনি নীচের মতো কাজ করে এমন একটি ধারা দিয়ে শেষ করেছেন:
ORDER BY NULL DESC, NULL, [storagedatetime] DESC, blah blah
আপনি ধারণা পেতে। এটি কাজ করে কারণ এসকিউএল সার্ভার কার্যকরভাবে ধারাগুলি অনুসারে নাল মানগুলিকে উপেক্ষা করে। এটি বজায় রাখা অবিশ্বাস্যভাবে শক্ত, কারণ এসকিউএল সম্পর্কিত যে কোনও বেসিক ওয়ার্কিং জ্ঞান সহ যে কেউ দেখতে পাবেন। আমি যদি আপনার কাউকে হারিয়ে ফেলেছি তবে খারাপ লাগবে না। এটি কাজ করতে আমাদের অনেক সময় লেগেছে এবং আমরা এটিকে সম্পাদনা করতে বা এটির মতো নতুন তৈরির চেষ্টা করে এখনও বিভ্রান্ত হয়ে পড়েছি। ভাগ্যক্রমে এটি প্রায়শই পরিবর্তনের প্রয়োজন হয় না, অন্যথায় এটি দ্রুত "সমস্যার জন্য মূল্যহীন" হয়ে উঠবে।
তবুও করেনি হবে।
আমার প্রশ্নটি তখন: এর চেয়ে ভাল উপায় আর কি আছে?
আমি সঞ্চিত পদ্ধতি ছাড়া অন্য সমাধানগুলির সাথে ঠিক আছি, কারণ আমি বুঝতে পারি যে এটি কেবল যাওয়ার উপায় নয় be অগ্রণীত, আমি জানতে চাই যে সঞ্চিত পদ্ধতিতে কেউ এটিকে আরও ভালভাবে করতে পারে কিনা, তবে যদি তা না হয় তবে আপনি কীভাবে এএসপি.এনইটি দিয়ে ব্যবহারকারীকে ডেটা টেবিলগুলি (দ্বি-দিকনির্দেশিতভাবে,) বাছাই করে কীভাবে পরিচালনা করেন?
এবং এত দীর্ঘ প্রশ্ন (বা কমপক্ষে স্কিমিং) পড়ার জন্য আপনাকে ধন্যবাদ!
পিএস: খুশী হোন আমি আমার সঞ্চিত পদ্ধতির উদাহরণটি প্রদর্শন করিনি যা গতিশীল বাছাই, গতিশীল ফিল্টারিং / কলামগুলির পাঠ্য-সন্ধান, ROWNUMBER () ওভারের মাধ্যমে পৃষ্ঠাগুলি সমর্থন করে এবং চেষ্টা করুন ... ত্রুটিগুলিতে লেনদেন রোলব্যাকিংয়ের সাথে ধরা ... "বেহিমথ আকারের" এমনকি তাদের বর্ণনা দেওয়া শুরু করে না।
হালনাগাদ:
- আমি গতিশীল এসকিউএল এড়াতে চাই । একটি স্ট্রিং একসাথে পার্স করা এবং এটির উপর একটি এক্সইসি চালানো প্রথম স্থানে একটি সঞ্চিত পদ্ধতি থাকার অনেক লক্ষ্যকে পরাস্ত করে। কখনও কখনও আমি ভাবছি যদিও এই জাতীয় কোনও কাজ করার পক্ষে এটি কার্যকর হবে না তবে কমপক্ষে এই বিশেষ গতিশীল বাছাইয়ের ক্ষেত্রে। তবুও, আমি যখনই ডায়নামিক এসকিউএল স্ট্রিংগুলি করি তখন আমি সর্বদা নোংরা বোধ করি - যেমন আমি এখনও ক্লাসিক এএসপি বিশ্বে বাস করি।
- কারণ আমরা প্রথম স্থানে সঞ্চিত পদ্ধতি চান অনেক জন্য নিরাপত্তা । আমি সুরক্ষা উদ্বেগের জন্য কল করতে চাই না, কেবল সমাধানের পরামর্শ দিই। এসকিউএল সার্ভার 2005 এর সাহায্যে আমরা স্বতন্ত্রিত সঞ্চিত পদ্ধতিতে স্কিমা স্তরে অনুমতিগুলি (প্রয়োজন অনুযায়ী প্রতিটি ব্যবহারকারী ভিত্তিতে) সেট করতে পারি এবং তারপরে সরাসরি টেবিলগুলির বিরুদ্ধে কোনও প্রশ্ন অস্বীকার করতে পারি। এই পদ্ধতির উপকারিতা এবং সমালোচনা সমালোচনা সম্ভবত অন্য কোনও প্রশ্নের জন্য, তবে আবার এটি আমার সিদ্ধান্ত নয়। আমি কেবল লিড কোড বানর। :)