গাইড বনাম আইএনটি - প্রাথমিক কী হিসাবে ভাল?


97

আমি ব্যবহার করার বা না থাকার কারণগুলি প্রায় পড়ছি Guidএবং int

intছোট, দ্রুত, মনে রাখা সহজ, একটি কালানুক্রমিক ক্রম রাখে। এবং হিসাবে Guid, আমি খুঁজে পেয়েছি শুধুমাত্র সুবিধা এটি অনন্য। কোন ক্ষেত্রে একটি এর Guidচেয়ে ভাল হবে intএবং কেন?

আমি যা দেখেছি তার থেকে intসংখ্যা সীমা ছাড়া কোন ত্রুটি নেই, যা অনেক ক্ষেত্রেই অপ্রাসঙ্গিক।

কেন ঠিক Guidতৈরি হয়েছিল ? আমি আসলে মনে করি এটি একটি সাধারণ টেবিলের প্রাথমিক কী হিসাবে পরিবেশন করা ছাড়া অন্য কোনও উদ্দেশ্য রয়েছে has (কোনও কিছুর জন্য ব্যবহার করে বাস্তব প্রয়োগের কোনও উদাহরণ Guid?)

(গাইড = ইউনিক আইডেন্টিফায়ার) এসকিউএল সার্ভারে টাইপ করুন


1
প্রাথমিক কী পরিবর্তে , আমি মনে করি আপনার অর্থ সারোগেট কী (অর্থাত্ একটি কী) যা প্রাকৃতিক চাবি নয় (পরেরটি কীটি আমরা আসল বিশ্বে ব্যবহার করি)। সম্ভবত আপনি ক্লাস্টারড ইনডেক্স বলতে চাইছেন।
onedaywhen

(প্রাথমিক) KEY এবং INDEX এর মধ্যে পার্থক্যটি মনে রাখবেন।
অ্যালান এস হানসেন


2
" intসংখ্যা সীমা ব্যতীত কোনও ত্রুটি নেই, যা অনেক ক্ষেত্রে অপ্রাসঙ্গিক।": আসলে, আইএনটি বনাম জিইউইডি-র এই প্রসঙ্গে, স্বাক্ষরের উপরের সীমাটি 32-বিট INTসম্পূর্ণ অপ্রাসঙ্গিক যে সইয়ের উপরের সীমাটি অপরিসীম। , -৪-বিট BIGINTপ্রায় সমস্ত ব্যবহারের বাইরে রয়েছে (আরও কম যদি আপনি নিম্ন সীমাতে নম্বর দেওয়া শুরু করেন; INTএবং এটির জন্য যায় তবে ) এবং এটি এখনও একটি জিইউডি (16 এর পরিবর্তে 8 বাইট) এবং ক্রমক্রমিকের অর্ধেক আকারের।
সলোমন রুটজকি

উত্তর:


89

এটি স্ট্যাক ওভারফ্লোতে এখানে এবং এখানে জিজ্ঞাসা করা হয়েছে

জেফের পোস্ট জিইউইউডি ব্যবহারের পক্ষে ও কৌশল সম্পর্কে অনেক কিছু ব্যাখ্যা করে।

জিইউইডি প্রো

  • প্রতিটি টেবিল, প্রতিটি ডাটাবেস এবং প্রতিটি সার্ভার জুড়ে অনন্য
  • বিভিন্ন ডাটাবেস থেকে রেকর্ডগুলি সহজে মার্জ করার অনুমতি দেয়
  • একাধিক সার্ভার জুড়ে ডাটাবেসের সহজ বিতরণকে মঞ্জুরি দেয়
  • আপনি ডাটাবেসে রাউন্ডট্রিপ না করে যে কোনও জায়গায় আইডি তৈরি করতে পারেন
  • বেশিরভাগ প্রতিরূপ পরিস্থিতিতে যেমন GID কলাম প্রয়োজন

জিইউইডি কনস

  • এটি traditionalতিহ্যবাহী 4-বাইট সূচক মানের তুলনায় 4 গুণ বড়; আপনি যদি সতর্ক না হন তবে এর গুরুতর পারফরম্যান্স এবং স্টোরেজ সম্পর্কিত প্রভাব ফেলতে পারে
  • ডিবাগ করার জন্য জটিল ( where userid='{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}')
  • উত্পন্ন newsequentialid()জিইউইডিগুলি সর্বোত্তম পারফরম্যান্সের জন্য আংশিকভাবে অনুক্রমিক হওয়া উচিত (যেমন, এসকিউএল সার্ভার ২০০++ তে) এবং ক্লাস্টারড ইনডেক্সগুলির ব্যবহার সক্ষম করতে

আপনি যদি পারফরম্যান্স সম্পর্কে নিশ্চিত হন এবং আপনি রেকর্ডগুলি প্রতিলিপি বা মার্জ করার পরিকল্পনা করছেন না, তবে এটি ব্যবহার করুন intএবং এটি স্বয়ংক্রিয় বৃদ্ধি ( এসকিউএল সার্ভারে পরিচয় বীজ ) সেট করুন।


20
জিইউইড পদ্ধতির আরেকটি কন হ'ল আপনি এটিকে আপনার শেষ ব্যবহারকারীর জন্য সনাক্তকারী হিসাবে ব্যবহার করতে পারবেন না। "BAE7DF4-DDF-3RG-5TY3E3RF456AS10" অর্ডার নিয়ে তাদের কোনও সমস্যা আছে বলে আপনি কি ব্যবহারকারীদের ফোনে বলতে চাইবেন? :)
Brann

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

6
এসকিউএল ইনস্ট্যান্স পুনরায় আরম্ভ না করা পর্যন্ত সিক্যুয়ালিয়াল গাইডগুলি কেবল ক্রমিক হয়। তারপরে মূল মানটি পূর্বের চেয়ে কম হবে কারণ মূল মানটি যেভাবে উত্পন্ন হয় তার ফলে আবারও সমস্ত প্রকারের সমস্যা দেখা দেয়।
mrdenny

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

2
@ চাদকুহেন UNIQUEIDENTIFIERওভার সীমাবদ্ধতার INTকারণে ওভার নির্বাচন INTকরা অসীম হওয়ার কারণে দুর্বল যুক্তি, যদিও এটি সত্য সত্য, এটি কোনও ব্যবহারিক সুবিধা নয়। আপনি সহজেই এর এর সক্ষমতা দ্বিগুণ করতে পারবেন INTএটি 1 এর পরিবর্তে নিম্ন সীমাতে (-2.14 বিলিয়ন) শুরু করে বা সম্পূর্ণ 4.3 বিলিয়ন পর্যাপ্ত না হলে একটি BIGINTমাত্র 8 বাইট হিসাবে শুরু করুন জিইউডির জন্য 16 টির তুলনায় এবং এটি সিক্যুয়েন্সিয়াল।
সলোমন রুটজকি

18

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


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

15

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


3
idমানুষের সারি শনাক্ত করার জন্য ইতিমধ্যে পর্যাপ্ত পরিমাণ থাকলে জিইউইডি কী মান দেয় ?
মার্টিন স্মিথ

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

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

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

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

1

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

অবশ্যই, এর অপূর্ণতা "স্কেলাবিলিটি না বলুন!" এর মতো!


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

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

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

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

স্পষ্টকরণের জন্য @ ওয়াহিডি ধন্যবাদ।


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

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

বছরগুলিতে উন্নয়নের জন্য
উত্সাহিত করুন

1

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


0

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

শুধু একটি চিন্তা এবং আমি আশা করি আমি সঠিকভাবে মনে রাখছি। দিন শুভ হোক!


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

-6

ব্যবহার উভয়

ব্যবহারের int- এ / Bigint প্রাথমিক কী জন্য যেমন বজায় রাখা এবং বিদেশী কী সম্পর্ক হিসাবে ব্যবহার করার জন্য সহজ।

তবে একটি কলামকে জিইউডিতে বেঁধে রাখুন যাতে প্রতিটি সারিতে একটি স্বতন্ত্র কলাম থাকে


2
এই পরামর্শের পিছনে আপনার যুক্তি ব্যাখ্যা করলে কারও ক্ষতি হবে না, আমি নিশ্চিত।
অ্যান্ড্রি এম

জিইউইডি 36 টি অক্ষর দীর্ঘ আপনি যদি কোনও নির্দিষ্ট ক্ষেত্রে সন্ধান করছেন
আব্দুল হান্নান ইজাজ

1
ঠিক আছে, তবে ওপিকে কেন উভয় ব্যবহার করা উচিত intএবং কেন guidআপনি নিজের উত্তরে পরামর্শ দিচ্ছেন তা সত্যই তা ব্যাখ্যা করে না । আর তাছাড়া আমি তো শুধু আমার আপনার পরামর্শের ব্যাখ্যা সম্পর্কে কথা বলা হয় নি - আমার বিন্দু ছিল যে আপনি তা করতে চাইবেন আপনার উত্তর আপডেট । যাইহোক, আপনি কি জানেন যে অন্য উত্তরদাতা ইতিমধ্যে আপনার মত একই (কম বেশি) পরামর্শ দিয়েছেন ?
অ্যান্ড্রি এম

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