এটি কি সোর্স কোডে এসকিউএল লিখতে একটি বিরোধী প্যাটার্ন হিসাবে বিবেচনা করা হয়?


87

এটির মতো কোনও অ্যাপ্লিকেশনটিতে এসকিউএলকে হার্ডকোড করা একটি বিরোধী নিদর্শন হিসাবে বিবেচনা করা হয়:

public List<int> getPersonIDs()
{    
    List<int> listPersonIDs = new List<int>();
    using (SqlConnection connection = new SqlConnection(
        ConfigurationManager.ConnectionStrings["Connection"].ConnectionString))
    using (SqlCommand command = new SqlCommand())
    {
        command.CommandText = "select id from Person";
        command.Connection = connection;
        connection.Open();
        SqlDataReader datareader = command.ExecuteReader();
        while (datareader.Read())
        {
            listPersonIDs.Add(Convert.ToInt32(datareader["ID"]));
        }
    }
    return listPersonIDs;
}

আমার সাধারণত একটি সংগ্রহস্থল স্তর ইত্যাদি থাকে তবে সরলতার জন্য আমি উপরের কোডে এটি বাদ দিয়েছি।

সম্প্রতি আমার এক সহকর্মীর কাছ থেকে কিছু প্রতিক্রিয়া হয়েছিল যিনি অভিযোগ করেছিলেন যে এসকিউএল উত্স কোডে লেখা হয়েছিল। আমি কেন জিজ্ঞাসা করার সুযোগ পাইনি এবং তিনি এখন দুই সপ্তাহের জন্য রয়েছেন (সম্ভবত আরও)। আমি ধরে নিয়েছি যে সে হ'ল:

  1. লিনকিউ
    বা ব্যবহার করুন
  2. এসকিউএল জন্য সঞ্চিত পদ্ধতি ব্যবহার করুন

আমি কি সঠিক? এটি কি সোর্স কোডে এসকিউএল লিখতে একটি বিরোধী প্যাটার্ন হিসাবে বিবেচনা করা হয়? আমরা এই প্রকল্পে কাজ করা একটি ছোট দল। আমার মনে হয় সঞ্চিত পদ্ধতির সুবিধাটি হ'ল এসকিউএল বিকাশকারীরা বিকাশ প্রক্রিয়াটির সাথে জড়িত থাকতে পারে (স্টোরেজ পদ্ধতিগুলি লেখার জন্য)।

সম্পাদনা হার্ড কোডেড এসকিউএল স্টেটমেন্ট সম্পর্কে নিম্নলিখিত লিঙ্ক আলোচনা: https://docs.microsoft.com/en-us/sql/odbc/reference/develop-app/hard-coded-sql-statements । এসকিউএল স্টেটমেন্ট প্রস্তুত করার কোনও সুবিধা আছে কি?


31
"লিনক ব্যবহার করুন" এবং "সঞ্চিত পদ্ধতি ব্যবহার করুন" কোনও কারণ নয়; তারা কেবল পরামর্শ। দুই সপ্তাহ অপেক্ষা করুন, এবং কারণগুলির জন্য তাকে জিজ্ঞাসা করুন।
রবার্ট হার্ভে

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

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

26
না, কোডের মধ্যে এসকিউএল কোনও অ্যান্টি-প্যাটার্ন নয়। তবে এটি একটি সাধারণ এসকিউএল ক্যোয়ারির জন্য বয়লার প্লেট কোডের একটি ভয়ঙ্কর।
গ্র্যান্ডমাস্টারবি

45
'উত্স কোডে' এবং 'সমস্ত উত্স কোড জুড়ে ছড়িয়ে পড়ে'
পার্থক্য রয়েছে tofro

উত্তর:


112

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

ফলস্বরূপ: একটি এসকিউএল প্রযুক্তির সাথে সুনির্দিষ্ট যে অধ্যবসায় স্তরটির মধ্যে এসকিউএল ঠিক আছে (যেমন এসকিউএল একটিতে ভাল তবে একটিতে SQLCustomerRepositoryনয় MongoCustomerRepository)। অধ্যবসায় স্তরের বাইরে এসকিউএল আপনার বিমূর্ততা ভেঙে দেয় এবং এটি আমার দ্বারা অত্যন্ত খারাপ অনুশীলন হিসাবে বিবেচিত হয় ।

লিনকিউ বা জেপিকিউএল এর মতো সরঞ্জামগুলির জন্য: এগুলি কেবল এসকিউএল এর স্বাদগুলি বিমূর্ত করতে পারে। কোনও সংগ্রহস্থলের বাইরে লিনকো-কোড বা জেপিকিউএল অনুসন্ধান থাকা অধ্যুষিত বিমূর্তি ঠিক যেমন কাঁচা এসকিউএলকে ভেঙে দেয়।


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

আপনার ভাষা সমর্থন করে এমন সমস্ত প্ল্যাটফর্মগুলিতে আপনি পুনরায় উত্পাদনযোগ্য ফলাফল সহ কম মেমরি প্রোফাইল, দ্রুত ইউনিট পরীক্ষা পান।

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

ডিবিতে লেখার জন্য পরীক্ষার বিষয়টিও সহজ: দৃ pers়তা স্তর সম্পর্কিত প্রাসঙ্গিক আপডেট পদ্ধতিগুলি ডেকে আনা হয়েছে কিনা তা যাচাই করে নিন এবং নিশ্চিত হন যে ঘটনার সময় সত্তাগুলি সঠিক অবস্থায় ছিল।


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

6
যদি খুব সামান্য সুযোগ থাকে তবে অধ্যবসায় স্তরটি পরিবর্তিত হয়? যদি অধ্যবসায় স্তর পরিবর্তন করার সময় এক থেকে একের ম্যাপিং না হয় তবে কী হবে? অতিরিক্ত স্তরের বিমূর্তির সুবিধা কী?
প্লী

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

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

3
@ রোগিরিও আপনি কি "রিয়েল-ওয়ার্ল্ডের বিশাল সংখ্যক প্রকল্প" জানেন? আমার সংস্থায়, বেশিরভাগ অ্যাপ্লিকেশনগুলি অনেকগুলি সাধারণ ডিবিএমএস এর সাথে কাজ করতে পারে, এবং এটি খুব দরকারী কারণ বেশিরভাগ আমাদের ক্লায়েন্টদের এটি সম্পর্কিত অ-কার্যকারী প্রয়োজনীয়তা রয়েছে।
বার্তোসজকেপি

55

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

  • আপনার আবেদনের কোন স্তরের কোন দায়বদ্ধতা রয়েছে

  • উপরের ফাংশনটি কোন স্তর থেকে

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

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


1
আমি প্রশ্নটি সম্পাদনা করেছি। এটি কোনও আলো ফেলে কিনা তা নিশ্চিত নয়।
w0051977

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

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

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

33

মার্সাতাতো একটি ভাল উত্তর দেয় তবে আমি আরও কিছু ভাষ্য যুক্ত করতে চাই।

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

এখন কিছু মন্তব্য বিক্রেতা লক-ইন সম্পর্কে কথা বলছে এটি স্বয়ংক্রিয়ভাবে একটি খারাপ জিনিস a এটা না। যদি আমি ওরাকল ব্যবহারের জন্য প্রতিবছর একটি ছয় চিত্র চেক করতে স্বাক্ষর করি তবে আপনি বাজি ধরতে পারেন যে সেই ডাটাবেসটিতে অ্যাক্সেসের যে কোনও অ্যাপ্লিকেশনই অতিরিক্ত ওরাকল সিনট্যাক্সটি যথাযথভাবে ব্যবহার করতে চাইতবে এর পুরোপুরি। আমার চকচকে ডাটাবেস কোডারদের দ্বারা ভ্যানিলা এএনএসআই এসকিউএল লিখে খারাপভাবে পঙ্গু করা হয় যখন এসকিউএল লেখার "ওরেकल উপায়" থাকে যা ডেটাবেস পঙ্গু করে না। হ্যাঁ, ডাটাবেসগুলি পরিবর্তন করা আরও শক্ত হবে তবে আমি কেবল 20 বছরেরও বেশি সময় ধরে এটি একটি বৃহত ক্লায়েন্ট সাইটে দেখেছি এবং এর মধ্যে একটির ক্ষেত্রে DB2 -> ওরাকল থেকে সরানো হয়েছে কারণ ডিবি 2 হোস্ট করা মূল ফ্রেমটি অপ্রচলিত ছিল এবং বাতিল হচ্ছিল । হ্যাঁ এটি বিক্রেতা লক-ইন তবে কর্পোরেট গ্রাহকদের জন্য এটি অরাকল বা মাইক্রোসফ্ট এসকিউএল সার্ভারের মতো ব্যয়বহুল সক্ষম আরডিবিএমএসের জন্য অর্থ প্রদান এবং তারপরে এটি পুরোপুরি ব্যবহার করতে বাঞ্ছনীয়। আপনার আরাম কম্বল হিসাবে আপনার একটি সমর্থন চুক্তি আছে। আমি যদি সমৃদ্ধ সঞ্চিত পদ্ধতি প্রয়োগের সাথে একটি ডাটাবেসের জন্য অর্থ প্রদান করছি,

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

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

হাইবারনেটে আমি 250,000 রেকর্ডের মাধ্যমে পুনরাবৃত্তি করছি কয়েকটি বৈশিষ্ট্যের মান পরীক্ষা করে এবং নির্দিষ্ট শর্তগুলির সাথে মেলে এমন অবজেক্ট আপডেট করছি upd এটি কিছুটা ধীর গতিতে চলছে, এটির গতি বাড়ানোর জন্য আমি কী করতে পারি?

"আপডেটের টেবিল SET ফিল্ড 1 = যেখানে ফিল্ড 2 সত্য এবং ক্ষেত্র 3> 100" সম্পর্কে কীভাবে হয়। 250,000 অবজেক্ট তৈরি এবং নিষ্পত্তি করা আপনার সমস্যা হতে পারে ...

যেমন হাইবারনেট এটি ব্যবহার করা উপযুক্ত না হয় তা উপেক্ষা করুন। ডাটাবেস বুঝুন।

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


5
আমি "বিক্রেতা লক-ইন" খারাপ জিনিস বলে উল্লেখ করি নি। আমি বলেছি এটি ট্রেড অফের সাথে আসে। আজকের বাজারে ডিবি হিসাবে এক্সএএএস হিসাবে এই ধরনের পুরানো চুক্তি এবং স্ব-হোস্টেড ডিবি চালনার জন্য লাইসেন্সগুলি আরও বিরল হতে চলেছে। এটি আজ 10 বছর আগে যেভাবে হয়েছিল তার তুলনায় বিক্রেতা A থেকে B তে ডিবি পরিবর্তন করা এখন বেশ সহজ। আপনি যদি মন্তব্যগুলি পড়ে থাকেন তবে আমি ডেটা স্টোরেজের কোনও বৈশিষ্ট্যের সুবিধা নেওয়ার পক্ষে নই। সুতরাং কিছু নির্দিষ্ট বিক্রেতার বিবরণ কোনও কিছুতে (অ্যাপ্লিকেশন) ভেন্ডার অজোনস্টিক হিসাবে বোঝানো সহজ। আমরা একক ডেটা স্টোরেজটিতে কোডটি লক করার ঠিক শেষের দিকে SOLiD অনুসরণ করার চেষ্টা করি। কোনও বড় কথা নয়
লাইভ

2
এটি একটি দুর্দান্ত উত্তর। প্রায়শই সঠিক দৃষ্টিভঙ্গি হ'ল যা সবচেয়ে কম খারাপ অবস্থার দিকে পরিচালিত করে যদি সবচেয়ে খারাপতম কোডটি লিখিত হয়। সবচেয়ে খারাপতম ওআরএম কোড সবচেয়ে খারাপতম এম্বেড থাকা এসকিউএল এর চেয়ে অনেক খারাপ হতে পারে।
jwg

@ লাইভ ভাল পয়েন্টগুলি পাস হ'ল একটি গেম চেঞ্জার - এর প্রভাবগুলি সম্পর্কে আমাকে আরও চিন্তা করতে হবে।
এমকোটল

3
@jwg আমি বলতে চাই যে উপরে গড় ORM কোড গড় এম্বেড করা এসকিউএল এর চেয়েও খারাপ :)
এমকোটল

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

14

হ্যাঁ, অ্যাপ্লিকেশন কোডে হার্ড কোডিং এসকিউএল স্ট্রিংগুলি সাধারণত একটি অ্যান্টি-প্যাটার্ন।

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

রবার্ট সি মার্টিনের ক্লিন কোড, পৃষ্ঠা:  288 (রবার্ট সি মার্টিন মিশ্রণ সম্পর্কিত ভাষাগুলি, ক্লিন কোড , অধ্যায় 17, "কোডের গন্ধ এবং হিউরিস্টিকস" পৃষ্ঠা 288)

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

  • ডেটাবেস যুক্তি সনাক্ত করা কঠিন। আপনার সমস্ত এসকিউএল বিবৃতি পেতে আপনি কী অনুসন্ধান করছেন? "নির্বাচন", "আপডেট", "মার্জ", ইত্যাদি সহ স্ট্রিংগুলি?
  • একই বা অনুরূপ এসকিউএল এর রিফ্যাক্টরিং ব্যবহারগুলি কঠিন হয়ে পড়ে।
  • অন্যান্য ডাটাবেসের জন্য সমর্থন যুক্ত করা কঠিন। কেউ কীভাবে এটি সম্পাদন করবে? প্রতিটি ডাটাবেসের জন্য বিবৃতি যুক্ত করুন এবং পদ্ধতিটিতে স্ট্রিং হিসাবে সমস্ত প্রশ্নগুলি সংরক্ষণ করুন?
  • বিকাশকারীরা অন্য ভাষায় একটি বিবৃতি পড়েন এবং পদ্ধতির উদ্দেশ্য থেকে পদ্ধতির প্রয়োগের বিশদগুলিতে (কীভাবে এবং কোথা থেকে ডেটা পুনরুদ্ধার করা হয়) ফোকাসে স্থানান্তরিত হয়ে বিভ্রান্ত হন।
  • ওয়ান-লাইনারগুলির সমস্যা খুব বেশি নাও হতে পারে, তবে বিবৃতি আরও জটিল হওয়ার সাথে সাথে ইনলাইন এসকিউএল স্ট্রিংগুলি পৃথক্ভাবে পড়তে শুরু করে। আপনি 113 লাইনের স্টেটমেন্ট দিয়ে কী করবেন? আপনার পদ্ধতিতে 113 টি লাইন রাখবেন?
  • বিকাশকারী কীভাবে দক্ষতার সাথে তাদের এসকিউএল সম্পাদক (এসএসএমএস, এসকিউএল বিকাশকারী, ইত্যাদি) এবং তাদের উত্স কোডের মধ্যে কোয়েরিগুলি পিছনে পিছনে সরান? সি # এর @উপসর্গটি এটিকে আরও সহজ করে তোলে তবে আমি প্রচুর কোড দেখেছি যা প্রতিটি এসকিউএল লাইন উদ্ধৃত করে এবং নতুন লাইনগুলি থেকে বেরিয়ে যায়। "SELECT col1, col2...colN"\ "FROM painfulExample"\ "WHERE maintainability IS NULL"\ "AND modification.effort > @necessary"\
  • পার্শ্ববর্তী অ্যাপ্লিকেশন কোড সহ এসকিউএল প্রান্তিককরণের জন্য ব্যবহৃত ইনডেন্টেশন অক্ষরগুলি প্রতিটি সম্পাদনকারীর মাধ্যমে নেটওয়ার্কের মাধ্যমে প্রেরণ করা হয়। এটি সম্ভবত ছোট স্কেল অ্যাপ্লিকেশনগুলির জন্য তুচ্ছ, তবে সফ্টওয়্যারটির ব্যবহার বাড়ার সাথে সাথে এটি যুক্ত হতে পারে।

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

কেভিন যেমন পূর্বের উত্তরে বলেছিলেন, কোডে এসকিউএল ছোট প্রকল্পগুলিতে গ্রহণযোগ্য হতে পারে তবে বড় প্রকল্পগুলি ছোট প্রকল্প হিসাবে শুরু হয় এবং বেশিরভাগ দলগুলি ফিরে যেতে পারে এবং এটি সঠিকভাবে করার সম্ভাবনাটি কোডের আকারের সাথে বিপরীতভাবে আনুপাতিক হয়।

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

এসকিউএল উদাহরণ: কোনটি আরও মার্জিত দেখাচ্ছে ?:

using(DbConnection connection = Database.SystemConnection()) {
    var eyesoreSql = @"
    SELECT
        Viewable.ViewId,
        Viewable.HelpText,
        PageSize.Width,
        PageSize.Height,
        Layout.CSSClass,
        PaginationType.GroupingText
    FROM Viewable
    LEFT JOIN PageSize
        ON PageSize.Id = Viewable.PageSizeId
    LEFT JOIN Layout
        ON Layout.Id = Viewable.LayoutId
    LEFT JOIN Theme
        ON Theme.Id = Viewable.ThemeId
    LEFT JOIN PaginationType
        ON PaginationType.Id = Viewable.PaginationTypeId
    LEFT JOIN PaginationMenu
        ON PaginationMenu.Id = Viewable.PaginationMenuId
    WHERE Viewable.Id = @Id
    ";
    var results = connection.Query<int>(eyesoreSql, new { Id });
}

হয়ে

using(DbConnection connection = Database.SystemConnection()) {
    var results = connection.Query<int>(sql.GetViewable, new { Id });
}

এসকিউএল সর্বদা একটি সন্ধানের জন্য সহজ ফাইল বা ফাইলগুলির গোষ্ঠীভুক্ত সেটগুলিতে থাকে, প্রত্যেকের বর্ণনামূলক নাম থাকে যা এটি কীভাবে এটি করে তার পরিবর্তে এটি কী করে তা বর্ণনা করে, প্রতিটি মন্তব্যের জন্য স্থান রয়েছে যা অ্যাপ্লিকেশন কোডের প্রবাহকে বাধাগ্রস্ত করবে না each :

একটি সংস্থান মধ্যে এসকিউএল

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

এই এবং অন্যান্য পদ্ধতিগুলি নিম্নলিখিত পদ্ধতিতে উপরে তালিকাটি সমাধান করে:

  1. ডাটাবেস কোডটি সনাক্ত করা সহজ কারণ এটি ইতিমধ্যে কেন্দ্রিয়ায়িত। বড় প্রকল্পগুলিতে, এসকিউএল-এর মতো পৃথক ফাইলগুলিতে গ্রুপ তৈরি করুন, সম্ভবত নামকৃত ফোল্ডারের নিচে SQL
  2. দ্বিতীয়, তৃতীয়, ইত্যাদি ডাটাবেসের জন্য সমর্থন সহজ। একটি ইন্টারফেস (বা অন্য ভাষা বিমূর্তি) তৈরি করুন যা প্রতিটি ডাটাবেসের অনন্য বিবৃতি দেয়। প্রতিটি ডাটাবেসের জন্য বাস্তবায়ন অনুরূপ বিবৃতিগুলির তুলনায় কিছুটা বেশি হয়ে যায়: return SqlResource.DoTheThing;সত্য, এই বাস্তবায়নগুলি রিসোর্সটি এড়িয়ে যেতে পারে এবং এসকিউএলকে স্ট্রিংয়ে অন্তর্ভুক্ত করতে পারে, তবে উপরের কিছু (সমস্ত নয়) সমস্যাগুলি এখনও তলিয়ে যাবে।
  3. রিফ্যাক্টরিং সহজ - কেবল একই সংস্থানটি পুনরায় ব্যবহার করুন। এমনকি আপনি বিভিন্ন ফর্ম্যাট স্টেটমেন্টের সাথে বিভিন্ন সময় বিভিন্ন ডিবিএমএস সিস্টেমের জন্য একই রিসোর্স এন্ট্রি ব্যবহার করতে পারেন। আমি প্রায়শই এটি করি।
  4. মাধ্যমিক ভাষার ব্যবহার বর্ণনামূলক নামগুলি ব্যবহার করতে পারে উদাহরণস্বরূপ sql.GetOrdersForAccountআরও অবস্হানির চেয়েSELECT ... FROM ... WHERE...
  5. এসকিউএল স্টেটমেন্টগুলির আকার এবং জটিলতা নির্বিশেষে একটি লাইনের সাথে তলব করা হয়।
  6. এসকিউএলকে এসএসএমএস এবং এসকিউএল বিকাশকারীর মতো ডেটাবেস সরঞ্জামগুলির মধ্যে কোনও সংশোধন বা সাবধানতার সাথে অনুলিপি করে অনুলিপি এবং আটকানো যায়। কোন উদ্ধৃতি চিহ্ন নেই। পিছনে পিছনে নেই। বিশেষত ভিজ্যুয়াল স্টুডিও রিসোর্স এডিটরের ক্ষেত্রে, একটি ক্লিক এসকিউএল বিবৃতি হাইলাইট করে। CTRL + C এবং তারপরে এটি এসকিউএল সম্পাদকটিতে আটকান।

কোনও উত্সে এসকিউএল তৈরি করা দ্রুত, সুতরাং এসকিউএল-ইন-কোডের সাথে সংস্থান ব্যবহারের মিশ্রণ করার খুব কম গতি নেই।

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


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

9
"একই ফাইলে বিভিন্ন সিনট্যাক্সের সাথে সম্পূর্ণ ভিন্ন ভাষা মিশ্রিত করা" এটি একটি ভয়াবহ যুক্তি। এটি রেজার ভিউ ইঞ্জিন, এবং এইচটিএমএল, সিএসএস এবং জাভাস্ক্রিপ্টের ক্ষেত্রেও প্রযোজ্য। আপনার গ্রাফিক উপন্যাস ভালবাসেন!
ইয়ান নিউজন

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

3
আরও স্পষ্টভাবে বলতে গেলে, এটি "আমার এসকিউএল স্ট্রিংগুলির সাথে আমি কী করব" এই প্রশ্নের উত্তর নয়, যতই এটি প্রশ্নের উত্তর "যথেষ্ট জটিল স্ট্রিংয়ের কোনও সংগ্রহের সাথে আমি কী করব," এমন একটি প্রশ্ন আপনার উত্তর স্পষ্টত ঠিকানা।
রবার্ট হার্ভে

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

13

এটা নির্ভর করে. বিভিন্ন ধরণের পদ্ধতি রয়েছে যা কাজ করতে পারে:

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

যেমনটি প্রায়শই ঘটে থাকে, যদি আপনার প্রকল্প ইতিমধ্যে এই কৌশলগুলির মধ্যে একটি বেছে নিয়েছে, তবে আপনার প্রকল্পের বাকী অংশের সাথে সামঞ্জস্য থাকা উচিত।

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

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

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

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

পাঠকদের জন্য, সঞ্চিত প্রক্রিয়াগুলি মূলত (2) এর একটি ক্র্প্পিয়ার সংস্করণ। আমি সেই ক্ষমতাটিতে তাদের প্রস্তাব দিচ্ছি না, তবে আপনি এখনও লেখার জন্য তাদের চাইতে চাইতে পারেন, যদি আপনার ডাটাবেস আপডেটযোগ্য ভিউ সমর্থন করে না বা যদি আপনার একসাথে একক সারি সন্নিবেশ করানো বা আপডেট করার চেয়ে আরও জটিল কিছু করা প্রয়োজন (যেমন, লেনদেন, পড়ুন-পরে লিখুন ইত্যাদি)। আপনি ট্রিগার ব্যবহার করে একটি দৃশ্যে আপনার সঞ্চিত প্রক্রিয়াটি দম্পতি করতে পারেন (যেমনCREATE TRIGGER trigger_name INSTEAD OF INSERT ON view_name FOR EACH ROW EXECUTE PROCEDURE procedure_name;), তবে এটি আসলে একটি ভাল ধারণা কিনা তা নিয়ে মতামতগুলি যথেষ্ট পরিমাণে পৃথক হয়। প্রবক্তারা আপনাকে বলবে যে এটি এসকিউএল রাখে যা আপনার অ্যাপ্লিকেশন যতটা সম্ভব কার্যকর করা যায়। ডিটেক্টররা আপনাকে বলবে যে এটি "যাদু" এর একটি অগ্রহণযোগ্য স্তর এবং আপনার অ্যাপ্লিকেশন থেকে আপনার কেবল প্রক্রিয়াটি সম্পাদন করা উচিত। আমি বলতে চাই এই একটি ভালো ধারণা আপনার সঞ্চিত পদ্ধতি মনে হলে অথবা একটি মত অনেক কাজ করে INSERT, UPDATEঅথবা DELETE, এবং একটি খারাপ ধারণা এটা অন্য কিছু করছে পারেন। শেষ পর্যন্ত আপনাকে নিজেরাই সিদ্ধান্ত নিতে হবে কোন স্টাইলটি আরও বোধগম্য।

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


লিখিত হিসাবে 2 মূলত একটি পঠনযোগ্য কেবল ডাটাবেস ধরে। সঞ্চিত পদ্ধতিগুলি পরিবর্তিত প্রশ্নের জন্য অস্বাভাবিক নয়।
jpmc26

@ জেএমপিসি 26: আমি কভার প্যারেন্টেটিয়ালে লিখেছি ... আপনার কি এই উত্তরটির উন্নতি করার জন্য একটি নির্দিষ্ট প্রস্তাবনা ছিল?
কেভিন

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

@ jpmc26: এটাই ফর্সা।
কেভিন

8

সোর্স কোডে এসকিউএল লিখতে কি এটি একটি বিরোধী-নিদর্শন হিসাবে বিবেচিত হয়?

অগত্যা। আপনি যদি এখানে সমস্ত মন্তব্য পড়েন তবে উত্স কোডে এসকিউএল স্টেটমেন্টগুলিকে হার্ডকোডিংয়ের জন্য কার্যকর যুক্তি খুঁজে পাবেন।

সমস্যাটি যেখানে আপনি বিবৃতি রাখেন সেখানে আসে । আপনি যদি সমস্ত প্রকল্পে এসকিউএল স্টেটমেন্টগুলি রাখেন তবে সর্বত্র, আপনি সম্ভবত সলাইডের কিছু নীতি উপেক্ষা করবেন যা আমরা সাধারণত অনুসরণ করার চেষ্টা করি।

ধরুন যে তিনি বোঝাচ্ছেন; করুন:

1) লিনকিউ ব্যবহার করুন

অথবা

2) এসকিউএল জন্য সঞ্চিত পদ্ধতি ব্যবহার করুন

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

এটি অগত্যা ভুল বা খারাপও নয়। আমি শুধু ঘটনাটির দিকে ইঙ্গিত করছি।

সলাইড নীতিগুলি এবং বিক্রেতার লকগুলিকে উপেক্ষা করার ফলে আপনি এড়াতে পারেন এমন সম্ভাব্য বিরূপ পরিণতি হতে পারে। এজন্য সাধারণত দলের সাথে বসে আপনার সন্দেহগুলি প্রকাশ করা ভাল।

আমার মনে হয় সঞ্চিত পদ্ধতির সুবিধাটি হ'ল এসকিউএল বিকাশকারীরা বিকাশ প্রক্রিয়াটির সাথে জড়িত থাকতে পারে (সঞ্চিত পদ্ধতিগুলি লিখতে ইত্যাদি)

আমি মনে করি এটি সঞ্চিত পদ্ধতির সুবিধার সাথে কিছু করার নেই। তদুপরি, যদি আপনার সহকর্মী হার্ডকডযুক্ত এসকিউএলকে অপছন্দ করেন, সম্ভবত এটি ব্যবসা সঞ্চিত পদ্ধতিতে চালিত করাও তাকে পছন্দ করবেন না।

সম্পাদনা করুন: নীচের লিঙ্কটি হার্ড-কোডেড এসকিউএল বিবৃতি সম্পর্কে কথা বলে:  https://docs.microsoft.com/en-us/sql/odbc/references/develop-app/hard-coded-sql-statements । এসকিউএল স্টেটমেন্ট প্রস্তুত করার কোনও সুবিধা আছে কি?

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

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


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

আমি নন-এএনএসআই-এর সাথে অনুগত অভিব্যক্তিগুলির ব্যবহারের বিষয়ে উল্লেখ করছি। উদাহরণস্বরূপ: select GETDATE(), ....GETDATE () হল স্কেল সার্ভারের তারিখ ফাংশন। অন্যান্য ইঞ্জিনগুলিতে, ফাংশনটির আলাদা নাম, ভিন্ন অভিব্যক্তি, ...
লাইভ

14
"বিক্রেতা লক-ইন" ... লোক / উদ্যোগী ব্যক্তিরা তাদের বিদ্যমান পণ্যের ডেটাবেস অন্য আরডিবিএমএসে আসলে কতবার স্থানান্তরিত করে? এমনকি একচেটিয়াভাবে ORM ব্যবহার করে এমন প্রকল্পগুলিতেও আমি কখনই এমনটি দেখিনি saw সাধারণত সফ্টওয়্যারটি স্ক্র্যাচ থেকেও আবার লেখা হয় কারণ প্রয়োজনগুলির মধ্যে পরিবর্তন ঘটেছিল। অতএব, এটি সম্পর্কে চিন্তা করা আমার কাছে অনেকটা "অকাল অপ্টিমাইজেশন" এর মতো মনে হয়। হ্যাঁ, এটি সম্পূর্ণ বিষয়গত j
অলিভিয়ের

1
আমি ঘন ঘন ঘন ঘটে কি না। আমি যত্ন করি এটা ঘটতে পারে। গ্রিনফিল্ড প্রকল্পগুলিতে, ডিবিকে বাদ দিয়ে ডাল প্রয়োগের ব্যয় প্রায় 0 হয় A সম্ভাব্য মাইগ্রেশন হয় না। ওআরএমের বিরুদ্ধে যুক্তিগুলি বেশ দুর্বল। ওআরএমগুলি 15 বছর আগের মতো নয় যখন হাইবারনেট বেশ সবুজ ছিল। আমি যা দেখেছি তা হ'ল অনেকটা "ডিফল্ট" কনফিগারেশন এবং আরও অনেক খারাপ ডেটা মডেল ডিজাইন। এটি অন্যান্য অনেক সরঞ্জামের মতো, অনেক লোক "শুরু করা" টিউটোরিয়াল করেন এবং হুডের নীচে কী ঘটে সেগুলি তারা যত্ন করে না। হাতিয়ারটি সমস্যা নয়। সমস্যাটি হ'ল কে এবং কখন এটি ব্যবহার করবেন তা জানেন না।
লাইভ

অন্যদিকে, বিক্রেতা লক-ইন করা অগত্যা খারাপ নয়। আমাকে জিজ্ঞাসা করা হলে আমি বলব যে আমি পছন্দ করি না । তবে আমি ইতিমধ্যে স্প্রিং, টমক্যাট বা জবস বা ওয়েবস্পিয়ারে লক করেছি (আরও খারাপ) worse আমি যা এড়াতে পারি, আমি তা করি। যাঁরা আমি পারি না তারা কেবল এটির সাথেই বাঁচি। এটি পছন্দসই বিষয়।
লাইভ

3

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

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

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

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

স্ট্রিং লিটারেল হিসাবে এসকিউএল কোয়েরিগুলি আপনার ডেটা অ্যাক্সেস সি # কোডকে কম পাঠযোগ্য করে তুলবে।

থাম্বের নিয়ম যেমন, যাদু স্থিরগুলি খারাপ। এর মধ্যে স্ট্রিং লিটারাল অন্তর্ভুক্ত রয়েছে।


অ্যাপ্লিকেশনটি আপডেট না করেই ডিবিএগুলিকে আপনার এসকিউএল পরিবর্তন করার অনুমতি দেওয়া আপনার অ্যাপ্লিকেশনটিকে কার্যকরভাবে দুটি পৃথকভাবে বিকশিত, পৃথকভাবে স্থাপন করা সত্তায় বিভক্ত করছে। আপনাকে এখন সেগুলির মধ্যে ইন্টারফেস চুক্তিটি পরিচালনা করতে হবে, পরস্পরের উপর নির্ভরশীল পরিবর্তনগুলি মুক্তির জন্য সিঙ্ক্রোনাইজ করা ইত্যাদি This এটি ভাল জিনিস বা খারাপ জিনিস হতে পারে তবে এটি "আপনার সমস্ত এসকিউএলকে এক জায়গায় রাখার" চেয়ে অনেক বেশি, এটি অনেক দূরের far আর্কিটেকচারাল সিদ্ধান্তের পড়া।
আইএমএসওপি

2

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

    string query = 
    @"SELECT foo, bar
      FROM table
      WHERE id = @tn";

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

আমি কেবল বিন্যাসটি প্রদর্শন করতে চাইছিলাম। দুঃখিত, আমি এটি পরামিতি করতে ভুলে গেছি। এখন উল্লেখ পর সংশোধন msdn.microsoft.com/library/bb738521(v=vs.100).aspx
rleir

বিন্যাসের গুরুত্বের জন্য +1, যদিও আমি বজায় রেখেছি যে এসকিউএল স্ট্রিং বিন্যাস নির্বিশেষে কোডের গন্ধ।
চার্লস বার্নস

1
আপনি কি কোনও ওআরএম ব্যবহারের জন্য জোর দিচ্ছেন? যখন কোনও ওআরএম ব্যবহার না করা হয়, একটি ছোট প্রকল্পের জন্য, আমি এম্বেডড এসকিউএলযুক্ত একটি 'শিম' শ্রেণি ব্যবহার করি।

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

1

আপনার সহকর্মী কী বোঝাতে চেয়েছিলেন তা আমি বলতে পারি না। তবে আমি এর উত্তর দিতে পারি:

এসকিউএল স্টেটমেন্ট প্রস্তুত করার কোনও সুবিধা আছে কি?

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

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

List<UUID> ids = select(person.id).from(person).fetch();

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

আমি কেবল ধরে নিতে পারি যে এর মতো কিছু সি # এর জন্যও উপলব্ধ। উদাহরণস্বরূপ, আমি লিনকিউ সম্পর্কে দুর্দান্ত জিনিস শুনি।

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

[1]: হ্যাঁ, প্রস্তুত বিবৃতিগুলির সঠিক ব্যবহার এসকিউএল ইঞ্জেকশনটিকে বাধা দেয়। তবে এই থ্রেডের অন্য উত্তরটি এসকিউএল ইঞ্জেকশনের পক্ষে ঝুঁকির মধ্যে ছিল যতক্ষণ না একজন মন্তব্যকারী এই বিষয়টি উল্লেখ করেছেন জুনিয়র প্রোগ্রামারগুলিতে যখনই প্রয়োজন হবে সঠিকভাবে তাদের ব্যবহারের প্রতি আত্মবিশ্বাস অনুভব করে না ...


পরিষ্কার হতে হবে: প্রস্তুত বিবৃতি ব্যবহার করে এসকিউএল ইঞ্জেকশন প্রতিরোধ করে না। আবদ্ধ ভেরিয়েবলগুলি সহ প্রস্তুত বিবৃতি ব্যবহার করে। অবিশ্বস্ত ডেটা থেকে তৈরি করা প্রস্তুত বিবৃতি ব্যবহার করা সম্ভব।
অ্যান্ডি লেস্টার

1

এখানে দুর্দান্ত উত্তর। ইতিমধ্যে যা বলা হয়েছে তা বাদে আমি একটি অন্য জিনিস যুক্ত করতে চাই।

আমি ইনলাইন এসকিউএলকে একটি অ্যান্টি-প্যাটার্ন ব্যবহার বিবেচনা করি না। আমি যাইহোক একটি বিরোধী-প্যাটার্ন হিসাবে বিবেচনা করি তা প্রতিটি প্রোগ্রামার তাদের নিজস্ব কাজ করে। আপনাকে একটি সাধারণ মানের দল হিসাবে সিদ্ধান্ত নিতে হবে। যদি প্রত্যেকে লিনক ব্যবহার করে থাকে, তবে আপনি লিনক ব্যবহার করেন, যদি প্রত্যেকে দর্শন এবং সঞ্চিত পদ্ধতি ব্যবহার করে থাকে তবে আপনি এটি করেন।

সর্বদা খোলা মন রাখুন এবং ডগমা এর জন্য না পড়ে। আপনার দোকান যদি একটি "লিনক" দোকান হয় তবে আপনি এটি ব্যবহার করুন। লিনক একদম কাজ করে না এমন এক জায়গা ব্যতীত। (তবে আপনার সময়টির 99.9% হওয়া উচিত নয়))

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


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

0

কোডটি ডাটাবেস-ইন্টারেক্টিভ স্তর থেকে দেখায় যা ডাটাবেস এবং বাকী কোডের মধ্যে থাকে। যদি সত্যিই তা হয় তবে এটি অ্যান্টি-প্যাটার্ন নয়।

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

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


0

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

আর একটি বিষয় হ'ল গতিশীল ক্যোয়ারীগুলির সাথে ডিল করার সময় এটি আরও শক্ত হয়ে যায় যা নির্দিষ্ট শর্ত অনুসারে নির্মিত উচিত।

var query = "select * from accounts";

if(users.IsInRole('admin'))
{
   query += " join secret_balances";
}

আমি স্কয়ার ক্যোয়ারী বিল্ডার ব্যবহার করার পরামর্শ দিই


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

0

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

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

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


প্রসঙ্গে নীচের মূল পাঠ্য

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

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

যদি এই সমস্যাটি আপনার সিস্টেমে গুরুত্বপূর্ণ না হয় তবে অ্যাপ্লিকেশনটিতে হার্ড কোড এসকিউএল স্টেটমেন্টের ক্ষেত্রে এটি একটি সঠিক বৈধ সিদ্ধান্ত।


ভুল ...........
সেন্টিনেল

আপনি কি মনে করেন যে আপনার মন্তব্য কারও পক্ষে সহায়ক?
বাইকম্যান 868

এটি ঠিক প্লেইন ভুল। আসুন ধরা যাক আমাদের কাছে ডেটা অ্যাক্সেস হিসাবে EF এবং স্টোরেজ হিসাবে Azure SQL সহ একটি ওয়েব এপিআই 2 প্রকল্প রয়েছে। না, আসুন EF থেকে মুক্তি পেয়ে হ্যান্ডস্ক্রাফ্ট এসকিউএল ব্যবহার করুন d ডিবি স্কিমাটি একটি এসএসডিটি এসকিউএল সার্ভার প্রকল্পে সংরক্ষিত আছে D অ্যাজুরে ডিবি.এ কোড পরিবর্তনটির সাথে অ্যাপ অ্যাপ্লিকেশন ডিপ্লোয়মেন্ট স্লটটির বাইরে যাওয়া জড়িত যা 2 সেকেন্ড সময় নেয়। প্লাস হ্যান্ডক্রাফ্টড এসকিউএল এর বিপরীতে 'প্রজ্ঞা' থাকা সত্ত্বেও, সাধারণভাবে বলা, সঞ্চিত পদ্ধতিগুলির তুলনায় পারফরম্যান্স প্লাস রয়েছে।
সেন্টিনেল

আপনার ক্ষেত্রে মোতায়েন হতে কয়েক সেকেন্ড সময় লাগতে পারে তবে অনেকের ক্ষেত্রে এটি হয় না। আমি বলিনি যে সঞ্চিত পদ্ধতিগুলি আরও ভাল, কেবলমাত্র কিছু পরিস্থিতিতে তাদের কিছু সুবিধা রয়েছে। আমার চূড়ান্ত বিবৃতিটি হ'ল যদি এই পরিস্থিতিতেগুলি প্রয়োগ না হয় তবে অ্যাপ্লিকেশনটিতে এসকিউএল স্থাপন করা খুব কার্যকর। আপনি যা বলছেন তা এটি কীভাবে বিরোধী?
বাইকম্যান 868

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