আমাদের কাছে মাইক্রো ওআরএম রয়েছে এমন কি এখনও ইনলাইন এসকিউএলটি খারাপ অভ্যাস হিসাবে শ্রেণিবদ্ধ?


26

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

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

এখনকার দিনে খুব দ্রুত এগিয়ে যাওয়া, যেখানে মাইক্রো ওআরএমগুলি আরও বিকাশকারীদের উপর বিজয়ী বলে মনে হচ্ছে আমি ভাবছিলাম কেন আমরা আপাতদৃষ্টিতে পুরো ইন-লাইন বর্গক্ষেত্রের বিষয়ে ইউ-টার্ন নিয়েছি।

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

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

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

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

এখানে একটি অনুরূপ প্রশ্ন যা কয়েকটি ভিন্ন দৃষ্টিকোণ রয়েছে, যদিও মাইক্রো orm প্রসঙ্গ ছাড়াই ইনলাইন স্কয়ার সম্পর্কে আরও:

/programming/5303746/is-inline-sql-hard-coding


1
আপনি কি মনে করেন যে আপনি প্রশ্নটি এমনভাবে পুনর্বিবেচনা করতে পারেন যে এটি কোনও মতামত চেয়েছে না? মতামতের জন্য পোলিং স্ট্যাক এক্সচেঞ্জের প্রশ্নোত্তর বিন্যাসে ভাল মানায় না।

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

"মাইক্রো ওআরএম" শব্দটি শোনেনি। আপনার অর্থ কি এমন ORMs যা সম্পূর্ণ এসকিউএল দখল করার চেষ্টা করে না, বা এটি কিছু আলাদা?
জাভিয়ের

কিছু নয়, কিছুটা গুগল করার পরে এটি একটি নেট নেট বলে মনে হচ্ছে।
জাভিয়ের

1
@ গ্র্যান্ডমাস্টারবি: একটি উত্তরে কেন তা ব্যাখ্যা করুন। আমি আমার উত্তরে এই ইস্যুটিকে অনেকটা পিছনে ফেলেছি, যেহেতু আমি বিশ্বাস করি যে এটি বাণিজ্য সম্পর্কিত প্রশ্ন of
রবার্ট হার্ভে

উত্তর:


31

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

এই ডাপার উদাহরণ বিবেচনা করুন:

string sql = "SELECT * from user_profile WHERE FirstName LIKE @name;";
var result = connection.Query<Profile>(sql, new {name = "%"+name+"%"});

এটি সম্পূর্ণরূপে প্যারামিটারাইজড, যদিও স্ট্রিং কনটেনটেশন হচ্ছে। @ সাইন দেখুন?

বা এই উদাহরণ:

var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", 
          new { Age = (int?)null, Id = guid });

যা নিম্নলিখিত ADO.NET কোডের সাথে মোটামুটি সমান:

List<Dog> dog = new List<Dog>();
using(var cmd = connection.CreateCommand()) {
    cmd.CommandText = "select Age = @Age, Id = @Id";
    cmd.Parameters.AddWithValue("Age", DBNull.Value);
    cmd.Parameters.AddWithValue("Id", guid);
    using(var reader = cmd.ExecuteReader()) {
        while(reader.Read()) {
            int age = reader.ReadInt32("Age");
            int id = reader.ReadInt32("Id");
            dog.Add(new Dog { Age = age, Id = id });
        }
    }
}

আপনার যদি এর চেয়ে আরও নমনীয়তার প্রয়োজন হয় তবে ড্যাপার এসকিউএল টেম্পলেট এবং একটি AddDynamicParms()ফাংশন সরবরাহ করে। সমস্ত এসকিউএল ইঞ্জেকশন নিরাপদ।

তাহলে কেন প্রথম স্থানে এসকিউএল স্ট্রিং ব্যবহার করবেন?

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

আপনি যদি ড্যাপারে প্রতিটি CRUD পদ্ধতির জন্য সত্যই এসকিউএল স্ট্রিং লিখতে না চান (তবে কে করেন?) আপনি এই লাইব্রেরিটি ব্যবহার করতে পারেন:

https://github.com/ericdc1/Dapper.SimpleCRUD/

এটি আপনাকে অত্যন্ত সরল এবং সোজা সিআরইউডি পাবে, যখন আপনাকে হাতে লেখা এসকিউএল বিবৃতিগুলির নমনীয়তা দেয়। মনে রাখবেন, ওআরএম আসার আগে উপরের ADO.NET উদাহরণটি সবাই যেভাবে করেছিল; Dapper যে কেবল একটি পাতলা ব্যহ্যাবরণ।


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

আমি আমার উত্তরে কিছু বিশদ যুক্ত করেছি।
রবার্ট হার্ভে

2
সিম্পল সিআরসিউডি-তে তথ্যের জন্য +1 এটি জানত না।
গ্রোফিট

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

2

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

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

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

সুতরাং আপনি সেখানে যান। আপনি যদি অল্প সময়ে ডেভেলপারদের অবসর সময়ে (অল্প বয়সী শিশু এবং প্রচুর অন্যান্য শখের সাথে) কাজ করে এমন অজানা ডেটা অ্যাক্সেস প্রযুক্তিটি দেখতে চান তবে এটি এখানেই শেষ


আপনি আপনার সামান্য "উদ্ভাবন" অনেকটাই ভাবেন বলে মনে হয় তবে এটি কীভাবে বলা যায়, এক্সিকিউটস্টোরকিউরি বা সত্তা ফ্রেমওয়ার্কের এক্সিকিউটস্টোরকম্যান্ডের চেয়ে আলাদা ?
রবার্ট হার্ভে

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

EF স্বয়ংক্রিয়ভাবে সমস্ত POCO তৈরি করতে যথেষ্ট সক্ষম। আমি এখানে কি মিস করছি? ড্যাপার এবং ম্যাসিভের আসল উদ্ভাবন হ'ল আপনার পোকোর মোটেই প্রয়োজন নেই; আপনি শুধু ব্যবহার করতে পারেন dynamic
রবার্ট হার্ভে

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

1
:-) অবশ্যই বলতে হবে যে আমি যখন আমার সেরা ধারণাটি নিখরচায় বাইরে রাখি তখন বিজ্ঞাপনের চার্জগুলির প্রতি আমি সংবেদনশীল। এখানে আমার সর্বশেষ আগ্রাসী বাণিজ্যিকীকরণ bit 3 মিনিটের চিহ্নের দ্বারা, আপনার জানা উচিত যে আমি কোনও কিছুর উপরে আছি কিনা।
bbsimonbb

1

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

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