কেন আইডিএনটিআইটিএসইআরটি অন এক সময়ে কেবল একটি টেবিলে অনুমতি দেওয়া হয়?


20

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

পরিচয় INSERT খুব কমই ব্যবহার করা উচিত তবে কঠোর সীমাবদ্ধতার কারণ কী?


1
ডিটারেন্ট সম্ভবত, তাই এটি খুব কমই ব্যবহৃত হয়?
রেমাস রুসানু

@ রেমুসরুসানু এ জাতীয় যা আমি ভাবছিলাম তা হ'ল তা নিশ্চিত করুন বা আপনি একাধিক টেবিলের জন্য দুর্ঘটনাক্রমে II ত্যাগ করবেন না তা নিশ্চিত করে নিন।
বেন ব্রোকা

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

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

@ বেন ডান এটি আপনার পক্ষে প্রয়োজনীয় নয় তবে প্রশ্নটিতে আসা কোনও পাঠকের পক্ষে ছিল।
অ্যারন বারট্র্যান্ড

উত্তর:


12

আমি মনে করি এটি কঠিন করা। আপনি যদি সর্বদা এটি ছেড়ে দিতে পারেন তবে কেন একটি পরিচয় ক্ষেত্র রয়েছে?

যদিও এখানে বেশ কয়েকটি বিধিনিষেধ রয়েছে:

  • এটি কেবল সেই সংযোগেই স্থির থাকে
  • এটি প্রতি সংযোগের জন্য কেবলমাত্র একটি টেবিলে স্থিরযোগ্য

সংযোগ-সম্পর্কিত বিধিনিষেধের ভিত্তিতে, আমি মনে করি এটি মূলত তাই এটি দুর্ঘটনাক্রমে কখনও ছেড়ে যায় না।

কল্পনা করুন যে কেউ যদি আপনার কোনও টেবিলের মধ্যে আইডি sertোকানো চালু করে, তবে আপনি বুঝতে পারেন নি এবং একটি (সাধারণত) অবৈধ সন্নিবেশ সঞ্চালিত হয়েছে যা আপনার আইডি ক্ষেত্রের অখণ্ডতা ভঙ্গ করেছে?

আইডি ক্ষেত্রগুলি মনে রাখবেন সদৃশ মানগুলি যদি কোনও জায়গায় বাধা বা অনন্য সূচি না থাকে ...


1
+1 আমি মনে করি নকল সম্পর্কে আপনার শেষ পয়েন্টটি অনেক বেশি মিস হয়েছে। লোকেরা মনে করে যে তারা সেট IDENTITYকরে রাখলে এটিও একটি অনন্য বাধা হয়ে দাঁড়ায়। অস্বীকার করা খুব সহজ, অবশ্যই, যদি তারা চেষ্টা করেও।
অ্যারন বার্ট্র্যান্ড

@ অ্যারনবার্ট্র্যান্ড কিন্তু আবারও, পরিচয়পত্র অন্তর্ভুক্তকরণের যে কোনও টেবিলে নকল আইডির ঝুঁকি হুবহু একই, কেন কঠোর সীমা? আমি মনে করি যে এটি কেবল সংযোগের জন্য স্থির থাকে তা সতর্কতা হিসাবে অনেক বেশি অর্থবোধ করে।
বেন ব্রোকা

আমি ডুপ্লিকেট আইডি সমস্যাটি হ'ল সীমাবদ্ধতার কারণ হচ্ছিলাম না।
অ্যারন বারট্র্যান্ড

6

আমার ধারণা এটি বাস্তবায়নের কারণে একটি প্রতিবন্ধকতা ছিল। একাধিক টেবিলে এই সেটিংটি মঞ্জুরি দেওয়া সম্ভাব্য পারফরম্যান্স হিট ছিল:

যেহেতু এটি একটি সেশন প্যারামিটার, তাই কোনও একক টেবিলটিতে সেটিংসটি সক্রিয় করার অনুমতি দেওয়ার অর্থ এটি সরল পতাকা এবং সারণীতে সার্ভার-সাইডে টেবিলের অবজেক্ট আইডি id হতে পারে এটি কেবলমাত্র একটি একক পূর্ণসংখ্যা: 0 যদি কোনও আইডেন্টিটিআইপিএসআরটি সক্রিয় না থাকে এবং টেবিলে ডাটাবেসড + আপত্তিযুক্ত কিছু কোডিং।

একটি সেশনের মধ্যে একাধিক টেবিলগুলিতে প্যারামিটার সেট করার অনুমতি দেওয়ার অর্থ সার্ভার এ জাতীয় অবজেক্টগুলির একটি গতিশীল তালিকা সংরক্ষণ করবে এবং প্রতিটি inোকানো বিবৃতিতে এটি পরীক্ষা করবে। কল্পনা করুন যে কোনও সেশন এক হাজার টেবিলের জন্য প্যারামিটারটিকে সক্রিয় করে:

  1. এর অর্থ সার্ভারটি সেশন ভেরিয়েবলে 1000 আইটেম বরাদ্দ করেছে
  2. এর অর্থ এইও যে সার্ভারকে এই সেশনে প্রতিটি sertোকানো বিবৃতিটির জন্য 1000 আইটেমের তালিকাটি পরীক্ষা করতে হবে।

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


+1 সম্ভবত এখানে কিছু সত্য। আমি ফাঁক আকারের আর্গুমেন্টটি কিনছি না, কারণ INSERTএকটি সেশনের জন্য একবারে কেবল একটিই চলতে পারে, এবং আমি খুব সহজেই 10 মিলিয়ন হার্ড-কোডেড IDENTITYমান সন্নিবেশ করতে পারি ।
অ্যারন বারট্র্যান্ড

ব্যবধানের আকারটি ক্র্যাশের ক্ষেত্রে যা ঘটেছিল তার সাথে সম্পর্কিত: সিবাসে, সার্ভারটি ক্র্যাশ করলে শেষ পরিচয়টি নষ্ট হয়ে যায় (এটি স্মৃতিতে ছিল), তাই এটি একটি ফাঁক রেখে পুনরায় আরম্ভ হয় (পরিচয় বার্নিং সেট ফ্যাক্টর দেখুন)
অলিভিয়ার এস

সুতরাং এসকিউএল সার্ভারে আপনি কি পরামর্শ দিচ্ছেন যে কোনও পরিচয় কলাম সহ ১,০০,০০০ সারি সন্নিবেশ করানোর সময় ইঞ্জিন ক্রাশ হয়ে গেলে, বা SET IDENTITY_INSERTসক্ষম থাকা অবস্থায় 1,000,000 হার্ড-কোডিং মান সহ পরিচয় কলামটি ওভাররাইড করছে ? আমি কেবল প্রস্তাব দিচ্ছি যে ফাঁক আকার একক টেবিলকে প্রভাবিত করার চেয়ে একাধিক টেবিলকে আলাদাভাবে প্রভাবিত করে না।
অ্যারন বারট্র্যান্ড

আমার অনুমান - আমার কাছে এর কোনও প্রমাণ নেই - হ'ল কোনও টেবিলে সেট পরিচয়পত্র নম্বরটি প্রতিটি সন্নিবেশে স্বতঃসংশোধনের একটি লিখন-থেকে-ডিস্ককে বাধ্য করে। যুক্তিটি হ'ল যেহেতু আপনি যে মানটি সন্নিবেশ করান তা যে কোনও কিছু হতে পারে, তাই সার্ভারটি "ঠিক আছে, বিবেচনা করতে পারে না যদি আমি প্রতি 1000 সারিতে একবার ডিস্কে লিখি, ক্র্যাশ হওয়ার ক্ষেত্রে আমি নিরাপদে শেষ মানটিতে 1000 যুক্ত করতে পারি"
অলিভিয়ার এস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.