প্রাথমিক কী হিসাবে একটি জিইউডি ব্যবহার করা


32

আমি সাধারণত ডাটাবেসে প্রাথমিক কী হিসাবে অটো ইনক্রিমেন্ট আইডি ব্যবহার করি। আমি জিইউইডি ব্যবহার করার সুবিধাগুলি জানার চেষ্টা করছি। আমি এই নিবন্ধটি পড়েছি: https://betterexplained.com/articles/the-quick-guide-to-guids/

আমি বুঝতে পারি যে এই জিইউইডিগুলি অ্যাপ্লিকেশন পর্যায়ে অবজেক্টগুলি সনাক্ত করতে ব্যবহৃত হয়। এগুলি কি ডাটাবেস স্তরে প্রাথমিক কী হিসাবে সঞ্চিত আছে? উদাহরণস্বরূপ, বলুন যে আমার নিম্নলিখিত ক্লাস ছিল:

public class Person
{
public GUID ID;
public string Name;
..

//Person Methods follow
}

বলুন আমি মেমোরিতে একটি নতুন ব্যক্তি তৈরি করতে চেয়েছিলাম এবং তারপরে সেই ব্যক্তিকে একটি ডাটাবেসে intoোকাতে চাইছিলাম। আমি কি কেবল এটি করতে পারি:

Person p1 = new Person();
p1.ID=GUID.NewGUID();
PersonRepository.Insert(p1);

বলুন আমার কাছে প্রাথমিক ডাটা হিসাবে একটি জিইউডি সহ কয়েক মিলিয়ন এবং কয়েক মিলিয়ন সারি সম্বলিত একটি ডাটাবেস ছিল। এটি কি সর্বদা অনন্য হবে? আমি কি জিইউইডিগুলি সঠিকভাবে বুঝতে পারি?

আমি এই নিবন্ধটি আগে পড়েছি: http://enterprisecraftsmanship.com/2014/11/15/cqs-with-datedia-generated-ids/ । এটি আমাকে কিছুটা বিভ্রান্ত করে কারণ এটি প্রাথমিক কী হিসাবে জিইউইডি এবং পূর্ণসংখ্যার মধ্যে একটি সুখী মাধ্যমের প্রস্তাব দেয়।

11/06/18 সম্পাদনা করুন

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

আমি লক্ষ্য করেছি যে কিছু বিকাশকারীরা জিইউইডিগুলিকে ডোমেন মডেলটিতে স্ট্রিং হিসাবে মডেল করে উদাহরণস্বরূপ: https://github.com/dotnet-architecture/eShopOnContainers/blob/dev/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/ ক্রেতা.সিএস - এই ক্ষেত্রে: আইডেন্টিটিগুইড একটি স্ট্রিং হিসাবে মডেল করা একটি জিইউডি UID এখানে যা বলা হয়েছে তা বাদ দিয়ে কি এটি করার কোনও কারণ আছে: একটি বিতরণ সিস্টেমে একটি কাস্টম মান অবজেক্ট বা কোনও গাইডকে সত্তা সনাক্তকারী হিসাবে ব্যবহার করবেন? । জিইউডিকে স্ট্রিং হিসাবে মডেল করা কি "সাধারণ" বা মডেল এবং ডাটাবেসে আমাকে জিইউইডি হিসাবে মডেলিং করা উচিত?



7
অনন্য হওয়ার গ্যারান্টিযুক্ত নয়, যদিও এটি সম্ভবত আপনি কোনও সংঘর্ষ দেখবেন। stackoverflow.com/questions/1155008/how-unique-is-uuid/...
icirellik

2
: এছাড়াও দেখুন UUID দুর্ঘটনায়
মশা

2
এছাড়াও dba.stackexchange.com/questions/54690/… , পাশাপাশি আরও প্রচুর প্রশ্ন দেখুন - এই বিষয়টি প্রায়শই জিজ্ঞাসা করা হয়েছে, এবং উত্তর দেওয়া হয়েছে এবং তর্ক করা হয়েছে।
গ্রিনস্টোন ওয়াকার

1
আমি এই মুহুর্তে যে সিস্টেমটির সাথে কাজ করছি সেগুলি ইউআইডিগুলি ব্যবহার করে। একটি দুর্দান্ত সম্পত্তি হ'ল একটি আইডি অনন্যভাবে একটি রেকর্ড সনাক্ত করে, ততোধিক আইডির বিপরীতে যা এই টেবিলের একটি রেকর্ড সনাক্ত করে।
জাস্টিন 21

উত্তর:


41

জিইউইডিগুলি সংজ্ঞা অনুসারে "গ্লোবালি ইউনিক আইডেন্টিফায়ারস"। জাভাতে ইউআইইউডসকে "ইউনিভার্সাল ইউনিক আইডেন্টিফায়ার্স" নামে একটি অনুরূপ তবে কিছুটা আলাদা ধারণা রয়েছে। নামগুলি সমস্ত ব্যবহারিক ব্যবহারের জন্য বিনিময়যোগ্য।

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

কিছু প্রো-গাইড গাইড:

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

জিইউইডিগুলির সাথে কিছু কদর্যতা

  • তারা বড়, প্রতিটি 16 বাইট
  • এগুলি অর্ডারের বাইরে চলে গেছে, সুতরাং আপনি আইডিকে বাছাই করতে পারবেন না এবং অটো-ইনক্রিমেন্ট আইডিতে আপনার মতো সন্নিবেশ অর্ডার পাওয়ার আশা করছেন
  • এগুলি কাজ করার জন্য আরও জটিল, বিশেষত ছোট ডেটা সেটগুলিতে (যেমন টেবিলগুলি সন্ধান করুন)
  • নতুন জিইউইডি বাস্তবায়ন এসকিউএল সার্ভারে সি # লাইব্রেরির চেয়ে বেশি শক্তিশালী (আপনি এসকিউএল সার্ভারের ক্রমযুক্ত জিইউইডিএস পেতে পারেন, সি # তে এটি এলোমেলো)

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

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

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


18
আমার বোধগম্যতা হল যে জিইউইডিগুলি ইউইউডিগুলির সমার্থক। ইউইউডি হ'ল মানক। মাইক্রোসফ্ট আরএফসি 4122 এর আগে মাইক্রোসফ্ট যা তাদের তৈরি করেছিল তা জিইউইডি
জিমি জেমস

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

8
@ কর্টআ্যামমন উইকিপিডিয়া এবং আরএফসি 4122 অনুসারে তারা সমার্থক। মাইক্রোসফ্টের পি। লিচ আরএফসির অন্যতম নির্মাতা ছিলেন। আমি মনে করি যেহেতু আরএফসি তৈরি হয়েছিল, সেহেতু দুটি একই the আরএফসি থেকে: "ইউইউডিগুলি (সর্বজনীন ইউনিক আইডেন্টিফায়ার), যা জিআইডি (বিশ্বব্যাপী ইউনিক আইডেন্টিফায়ার) নামেও পরিচিত" " আমি মনে করি এটি আরও দরকারী যে জিইউইডিগুলি এমএস দ্বারা তৈরি করা হয়নি। তারা কেবল অন্য কোথাও থেকে গৃহীত প্রযুক্তির জন্য একটি নতুন নাম তৈরি করেছে।
জিমি জেমস 21

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

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

28

এটি কি সর্বদা অনন্য হবে?

সর্বদা? না, সর্বদা না; এটি বিটের একটি সীমাবদ্ধ ক্রম।

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

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

আমি কি কেবল এটি করতে পারি?

আপনি পারেন; এটি সম্পূর্ণ ভাল ধারণা নয়। আপনার ডোমেন মডেলটি সাধারণত এলোমেলো সংখ্যা তৈরি করা উচিত নয়; এগুলি আপনার মডেলের ইনপুট হওয়া উচিত।

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

আরএফসি 4122 এ নাম ভিত্তিক ইউইডির বিবরণ দেখুন

জিইউডিকে স্ট্রিং হিসাবে মডেল করা কি "সাধারণ" বা মডেল এবং ডাটাবেসে আমাকে জিইউইডি হিসাবে মডেলিং করা উচিত?

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

যদি আপনার ডোমেন অজিনস্টিক সেটিংয়ে জিআইইডি একটি "আদিম ধরণের" হিসাবে উপলব্ধ থাকে তবে আমি এটি ব্যবহার করব; এটি সমর্থনযোগ্য প্রসঙ্গটি উপলভ্য হতে পারে উপযুক্ত অনুকূলতা চয়ন করতে অনুমতি দেয়।

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


20
"আপনি ইতিমধ্যে ডিস্কের জায়গাটি শেষ হয়ে যাওয়ার আগেই শেষ হয়ে গেছেন" এর জন্য +1।
w0051977

2
আমি মনে করি "নির্দ্বিধায় উত্পন্ন ইউইউডি " ধারণাটি প্রয়োজনীয় (ডেটা ভল্ট 2 দেখুন)
অল্ক

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

এক মিলিয়ন মিলিয়ন = 2 ^ 40। এটি সম্ভাব্য সংঘর্ষের 2 ^ 79 জোড়া করে। জিইউইডিটির 2 ^ 128 বিট রয়েছে, সুতরাং সুযোগটি 2 ^ 49 এর মধ্যে একটি। এটির অনেক বেশি সম্ভাবনা রয়েছে যে আপনার একটি বাগ রয়েছে যা দুটি রেকর্ডের জন্য একই জিআইডি পুনরায় ব্যবহার করে, বা ভুলভাবে বিশ্বাস করে যে সেখানে কোনও সংঘর্ষ নেই none
gnasher729

আমি আমার historicতিহাসিক প্রশ্নগুলির মধ্য দিয়ে ফিরে যাচ্ছি। আমি গ্রহণ করার আগে; আপনি কি আমার সম্পাদনা একবার দেখতে পারেন?
w0051977

11

জিইউইড বা ইউইউডি খুব সম্ভবত অনন্য হবে কীভাবে উত্পন্ন হয় এবং তারা কোনও কেন্দ্রীয় কর্তৃপক্ষের সাথে যোগাযোগ না করে স্বতন্ত্রতার গ্যারান্টি দেওয়ার একটি নিরাপদ উপায় সরবরাহ করে।

প্রাথমিক কী হিসাবে জিইউইডিগুলির সুবিধা:

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

আপনি যে উদাহরণ সরবরাহ করেছেন:

Person p1 = new Person();
p1.ID = GUID.NewGUID();
PersonRepository.Insert(p1);

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

Person p2 = new Person();
p2.ParentID = p1.ID
PersonRepository.Insert(p2);

প্রাথমিক কী হিসাবে জিইউইডিগুলির ক্ষতিকারক:

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

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

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

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

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


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

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

1
আরও একটি ব্যবহারের কেস রয়েছে: ভারী OLোকানো ওয়ালটিপি ডাটাবেস যাতে ক্রমের জন্য লক করা একটি বাধা। আমার ওরাকল ডিবিএ বন্ধুর মতে এটি যতটা শোনাচ্ছে ততটা বিরল নয়, এর জন্য আপনার এমনকি বৃহত্তর স্কেল বা ক্লাস্টারও লাগবে না। • শেষ পর্যন্ত, পেশাদার এবং কনসগুলি মাপুন (এবং কোনও পোস্টার যেমন ইউআইডিগুলিতে সুনির্দিষ্ট নয় এমন ইউইউইডিগুলির পক্ষে / কনসগুলিকে বিভ্রান্ত করবেন না) এবং পরিমাপ করুন
মীরাবিলো

1
আপনি যদি নতুন প্রয়োজনীয় ব্যবহার করেন তবে আইডিটি পেতে আপনাকে ডিবিতে যেতে হবে (কোনও পরিচয়পত্রের মতো), তাই না? এখানে কি লাভ।
w0051977

1
@ মিরাবিলোস স্পষ্টভাবে বলতে গেলে, যখন আমি ভয়ঙ্কর বলি তখন আমরা সন্নিবেশ করলাম যা প্রতি সারি কয়েক মিনিট সময় নেয়। এটি ঠিক আছে থেকে শুরু হয়েছিল তবে কয়েক হাজার সারি রয়েছে 10 এর পরে, এটি সত্যিই দ্রুতগতিতে চলে গেছে। যদি এটি সুস্পষ্ট না হয় তবে হাজার হাজার সারি 10s একটি খুব ছোট টেবিল table
জিমি জেমস

4

আমি বলব না, জিআইইডিগুলি প্রাথমিক কী হিসাবে ব্যবহার করবেন না। আমি আসলে এখন এই জাতীয় একটি ডিবি নিয়ে কাজ করছি, এবং তারা পারফরম্যান্স সমস্যার অন্যতম প্রাথমিক কারণ one

অতিরিক্ত 12 বাইট দ্রুত যুক্ত হয়; মনে রাখবেন, বেশিরভাগ পিকেই অন্য টেবিলগুলিতে এফকে হবে এবং একটি টেবিলের মধ্যে কেবল তিনটি এফকে আপনার কাছে এখন প্রতিটি সারির জন্য 48 বাইট অতিরিক্ত extra এটি সারণীতে এবং সূচিতে যুক্ত হয়। এটি ডিস্ক আই / ও-তে যোগ করে। এই অতিরিক্ত 12 বাইট পড়া এবং লেখা প্রয়োজন।

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

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


4
Person p1 = new Person();
p1.ID=GUID.NewGUID();
PersonRepository.Insert(p1);

এটি এখন পর্যন্ত জিইউইডি ব্যবহারের সবচেয়ে গুরুত্বপূর্ণ কারণ।

আপনার অবিচল আইডিটি তৈরি করতে পারবেন আপনার কোডটি না জেনে বা আপনার অধ্যবসায়ের স্তরের সাথে যোগাযোগ করা একটি বিশাল সুবিধা।

আপনি নিশ্চিত হয়ে উঠতে পারেন যে আপনি নিজের সার্ভার, পিসি ফোন, ল্যাপটপ, অফলাইন ডিভাইস বা বিশ্বব্যাপী আপনার সমস্ত সার্ভারগুলিতে অনন্য যা কিছু বিতরণ করেছেন সেটিতে আপনি যে ব্যক্তিটি তৈরি করেছেন object

আপনি এটিকে যে কোনও প্রকারের ডাটাবেস আরডিবি বা নন-এসকিএল, ফাইলগুলিতে আটকে রাখতে পারেন, এটি কোনও ওয়েবসার্ভিসে প্রেরণ করতে পারেন বা অবিরত হওয়ার সাথে সাথেই ফেলে দিতে পারেন

না আপনি কখনই সংঘর্ষ পাবেন না।

হ্যাঁ সন্নিবেশগুলি কিছুটা ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে পড়ে থাকতে পারে কারণ সূচকটি মেশানো যেতে পারে।

হ্যাঁ এটি কোনও ইনট এর চেয়ে বড়।

  • সম্পাদনা করুন। শেষ করার আগেই গুলি করতে হয়েছিল।

আমি জানি অনেক লোক অটো ইনপুট সম্পর্কে তীব্র বোধ করে এবং এটি ডিবিএর সাথে একটি বিতর্কিত বিষয়

তবে আমি উচ্চতর গাইডগুলি কীভাবে তা দৃ strongly়ভাবে বলতে পারি না। আপনার কোনও প্রয়োগে ডিফল্টরূপে নির্দেশিকাগুলি ব্যবহার করা উচিত ।

অটো ইনক ইনটগুলির অনেকগুলি ত্রুটি রয়েছে

  • আপনি একটি নো-স্কুয়েল বিতরণ ডিবি ব্যবহার করেন। পরবর্তী সংখ্যাটি কী তা জানতে আপনি কেবল সমস্ত অন্যান্য দৃষ্টান্তের সাথে কথা বলতে পারবেন না।

  • আপনি একটি বার্তা কিউ সিস্টেম ব্যবহার করেন। ডিবিতে আঘাত করার আগে জিনিসগুলির আইডি দরকার

  • আপনি বেশ কয়েকটি আইটেম তৈরি করছেন এবং সংরক্ষণের আগে এগুলি সম্পাদনা করছেন। আপনি ডিবিতে আঘাত করার আগে প্রত্যেকের একটি আইডি দরকার

  • আপনি সারিগুলি মুছতে এবং পুনরায় সন্নিবেশ করতে চান। নিশ্চিত হয়ে নিন যে আপনি নিজের অটো ইনড আইডিগুলি গণনা করছেন না এবং রান আউট হয়ে গেছে!

  • আপনি এই বছর প্রতিটি ব্যবহারকারীর কাছে কতটি অর্ডার নিয়েছেন তা প্রকাশ করতে চাই না

  • আপনি উত্পাদন থেকে বেনামে নেওয়া তথ্য পরীক্ষা করতে এবং সম্পর্কগুলি অক্ষত রাখতে চান। তবে বিদ্যমান সমস্ত পরীক্ষার ডেটা মুছবেন না।

  • আপনি আপনার একক ভাড়াটে পণ্যটিকে একাধিক ভাড়াটে ডাটাবেসে মার্জ করতে চান তবে প্রত্যেকের অর্ডার 56 56 রয়েছে।

  • আপনি অবজেক্ট তৈরি করেন যা স্থায়ী তবে সংক্ষিপ্ত। (অসম্পূর্ণ অর্ডারগুলি) আবার, আপনার সমস্ত ইনটগুলি এমন স্টাফ দিয়ে ব্যবহার করবেন না যা আর নেই।

তালিকাটি অন্তহীন এবং এগুলি হ'ল সমস্ত বাস্তব সমস্যা যা মানুষের সর্বদা ঘটে। কিছুটা বড় এফকে কলসের কারণে ডিস্কস্পেসের বাইরে চলে যাওয়ার মত নয়

অবশেষে ints নিয়ে বিশাল সমস্যাটি হ'ল আপনি কি সেগুলি শেষ করেছেন !!! ঠিক আছে তত্ত্বের মধ্যে আপনি না, বোঝা আছে। তবে অনুশীলনে আপনি তা করেন কারণ লোকেরা এলোমেলো সংখ্যার মতো তাদের সাথে কোনও অর্থহীন আচরণ করে না। তারা মত জিনিস না

  • ওহ, আমি গ্রাহকদের আমরা নতুন বলে মনে করি না। 10,000 এ শুরু করুন

  • আমাকে প্রচুর ডেটা আমদানি করতে হয়েছিল তাই আমি সবেমাত্র 1 মিটার বীজ ফেলেছিলাম তাই আমরা কীভাবে আমদানি করা তা জানি know

  • আমাদের বিভাগের তথ্য দরকার। প্রতিটি পিরিয়ড পরবর্তী মিলিয়নে শুরু হয় যাতে আমরা প্রথম সংখ্যাটি ম্যাজিক নম্বর হিসাবে ব্যবহার করতে পারি

  • আমি নতুন আইডির সাহায্যে সমস্ত ডেটা মুছে ফেলা এবং পুনরায় আমদানি করেছি। হ্যাঁ এমনকি নিরীক্ষণ লগ।

  • এই নম্বরটি, যা একটি সংমিশ্রিত কী, এই অন্য জিনিসের আইডি হিসাবে ব্যবহার করুন


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

2
এটি সম্ভবত তার চেয়ে বেশি সম্ভাবনা রয়েছে যে কোনও অটো ইনক ইন একটি গাইডের চেয়ে সংঘর্ষ করবে
ইভান

4
-1 এর জন্য "আপনার কোনও প্রয়োগে ডিফল্টরূপে নির্দেশিকাগুলি ব্যবহার করা উচিত" " এটি নির্ভর করে ™। এবং অন্যরা যেমন দেখিয়েছে, জিইউইডি / ইউআইডিগুলি একেবারে অনন্য হওয়ার গ্যারান্টিযুক্ত নয়।
ম্যাক্স ভার্নন

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

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

2

আমি বুঝতে পারি যে এই জিইউইডিগুলি অ্যাপ্লিকেশন পর্যায়ে অবজেক্টগুলি সনাক্ত করতে ব্যবহৃত হয়। এগুলি কি ডাটাবেস স্তরে প্রাথমিক কী হিসাবে সঞ্চিত আছে?

ঠিক সেখানেই আপনার থামানো উচিত এবং পুনর্বিবেচনা করুন।

আপনার ডাটাবেস প্রাথমিক কীটির ব্যবসায়িক অর্থ হওয়া উচিত নয়। এটি সংজ্ঞা অনুসারে অর্থহীন হওয়া উচিত।

সুতরাং আপনার ব্যবসায়ের কী হিসাবে জিইউডি এবং ডাটাবেস প্রাথমিক কী হিসাবে একটি সাধারণ প্রাথমিক কী (সাধারণত দীর্ঘ দীর্ঘ) যুক্ত করুন। স্বতন্ত্রতা নিশ্চিত করতে আপনি সর্বদা জিইউডিতে একটি অনন্য সূচক রাখতে পারেন।

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


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

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

2

সর্বদা উত্পন্ন উত্স, প্রাথমিক কী (পিকে) স্বয়ংক্রিয়ভাবে বৃদ্ধি করা ডেটাবেস ব্যবহার করুন।

জিইউইডি / ইউইউডি এর পরিবর্তে স্বতঃবৃদ্ধি কেন ব্যবহার করবেন?

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

তবে কিভাবে শার্ডস, গুচ্ছ ইত্যাদি পরিচালনা করবেন?

  • প্রতিটি শार्ড / ক্লাস্টার / ডাটাবেস / এটি নিজস্ব স্বয়ং-বৃদ্ধি কীগুলি পরিচালনা করে যা কিছু পরিচালনা করে আলাদা আলাদা কলামগুলি দিয়ে তৈরি বহু-কলাম পিকে তৈরি করুন। উদাহরণ স্বরূপ...

একটি ক্লাস্টার্ড টেবিলের জন্য একটি 3-কলামের পিকে হতে পারে ...

 DB | SH | KEY     |
----|----|---------|
 01 | 01 | 1234567 |

কিন্তু কি ব্যাপারে...?

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

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

প্রাথমিক কীগুলির সাধারণ অপব্যবহার পিকেগুলির কেবলমাত্র একটি উদ্দেশ্য রয়েছে ... কোনও টেবিলের মধ্যে একটি সারি একেবারে স্বতন্ত্রভাবে চিহ্নিত করা। অন্য যে কোনও কিছু হ'ল সর্বসাধারণের অপব্যবহার।

অনুপস্থিত রেকর্ডগুলি সনাক্ত করা হচ্ছে

  • পিকে গুলো দেখে অনুপস্থিত রেকর্ডগুলি সনাক্ত করা যায় না। কমপক্ষে তথ্যের মান নিশ্চিত করার চেষ্টা করার জন্য QA আশীর্বাদ করুন। তবে, আধুনিক ডেটাবেস সিস্টেমে কীগুলি কীভাবে বরাদ্দ করা হয় সে সম্পর্কে তাদের এবং প্রোগ্রামারের বোঝাপড়ার অভাব প্রায়শই তাদের এই বিভ্রান্তির দিকে পরিচালিত করে যে একটি অটো-ইনক্রিমেন্টিং পিকেতে অনুপস্থিত সংখ্যার অর্থ ডেটা হারিয়ে যাওয়া missing এটি কারণ না ...
  • পারফরম্যান্সের জন্য, ডাটাবেস সিস্টেমগুলি স্টোরেজটিতে প্রকৃত ডাটাবেসে ভ্রমণের পরিমাণ কমাতে 'সিকোয়েন্স' (ব্যাচস, রেঞ্জ) এর সংখ্যাগুলির ব্লক বরাদ্দ করে। এই সংখ্যাগুলির ক্রমগুলির আকারটি প্রায়শই ডিবিএর নিয়ন্ত্রণে থাকে তবে প্রতি সারণির ভিত্তিতে সুরক্ষিত হতে পারে না।
  • মূল গ্রহণটি হ'ল ... এই ক্রমগুলি থেকে অব্যবহৃত সংখ্যাগুলি কখনই ডাটাবেসে ফিরে আসে না তাই পিকে সংখ্যায় সর্বদা ফাঁক থাকে।
  • কেন আপনি জিজ্ঞাসা অব্যবহৃত নম্বর থাকবে? কারণ বিভিন্ন ডাটাবেস রক্ষণাবেক্ষণের ক্রিয়াগুলি ক্রমগুলি পরিত্যক্ত হতে পারে। এগুলি হ'ল পুনঃসূচনা, টেবিলের বাল্ক রিলোডস, ব্যাকআপগুলি থেকে কিছু ধরণের পুনরুদ্ধার এবং কিছু অন্যান্য ক্রিয়াকলাপ।

শ্রেণীবিভাজন

  • পিকে বাছাই করা অত্যন্ত ত্রুটি-ঝুঁকির কারণ বেশিরভাগ লোকেরা মনে করবে এটি সারিগুলি তৈরি করার ক্রমে এবং এটি ঘড়ির সময়ের সাথে সামঞ্জস্য করে lists বেশিরভাগ ক্ষেত্রে, তবে প্রয়োজনীয় নয়।
  • ডেটাবেস ইঞ্জিনগুলি সর্বাধিক পারফরম্যান্সের জন্য অনুকূলিত হয়েছে এবং এর অর্থ সংক্ষিপ্ত সরল সাধারণগুলি প্রবেশের জন্য দীর্ঘমেয়াদী জটিল লেনদেনের ফলাফল সন্নিবেশে বিলম্ব করতে পারে, "কথা বলতে" অন অফ-টার্ন "।

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

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

সুতরাং আপনার দৃষ্টিতে কোনও টেবিলের জন্য এমন কোনও সংখ্যক সারি থাকতে হবে যা তাদের অটো-বর্ধনকারী প্রাথমিক কীটির জন্য অভিন্ন ছিল?
রিবল্ড এডি

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

1

যে কোনও কিছুর মতো, এটি করার সুবিধা এবং অসুবিধাও রয়েছে:

ভাল:

  1. আপনার কীগুলি সর্বদা একই দৈর্ঘ্যের হয় (খুব বড় ডেটাবেসে খুব বড় কী থাকতে পারে)

  2. স্বতন্ত্রতা যথেষ্ট গ্যারান্টিযুক্ত - এমনকি যখন আপনি এগুলি আলাদা সিস্টেম থেকে তৈরি করেন, এবং / অথবা ডাটাবেস থেকে শেষ আইডিটি না পড়ে থাকেন

খারাপ জন:

  1. উপরে উপরে উল্লিখিত হিসাবে - বৃহত্তর সূচক এবং ডেটা স্টোর।

  2. আপনি আইডি দিয়ে অর্ডার করতে পারবেন না, আপনাকে অন্য কোনও কিছু দ্বারা অর্ডার করতে হবে। আরও সূচী, সম্ভবত কম দক্ষ।

  3. এগুলি মানুষের পাঠযোগ্য কম। পূর্ণসংখ্যাগুলি সাধারণত পার্স করা, মনে রাখতে এবং লোকদের জন্য টাইপ করা সহজ। একাধিক যোগদানকৃত টেবিল জুড়ে যেখানে ক্লাউজে আইডি হিসাবে জিআইডি ব্যবহার করা আপনার মাথা গলে যেতে পারে me

সমস্ত কিছুর মতো, উপযুক্ত যেখানে সেগুলি ব্যবহার করুন, কৌতুকপূর্ণ হবেন না - অনেক পরিস্থিতিতে স্বতঃবৃদ্ধি পূর্ণসংখ্যার চেয়ে ভাল হয়, মাঝে মাঝে জিইউইডিগুলি দুর্দান্ত।


0

হ্যাঁ আপনি প্রাথমিক কী হিসাবে জিইউডি ব্যবহার করতে পারেন। নীচের দিকটি হল সূচকটির আকার এবং দ্রুত বিভাজন।

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


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

0

এই সমস্যাটি সম্পর্কে এখানে আমার মতামত - সমাধানটি জিইউইডি এবং ইনট মানগুলির মধ্যে একটি অর্ধেক ঘর এবং উভয়ের সেরাটি গ্রহণ করে।

ক্লাসটি একটি সিউডো এলোমেলো উত্পন্ন করে (তবে সময়ের সাথে বাড়ছে) আইডি মান, যা একটি ঝুঁটি জিইউইউডির অনুরূপ ।

মূল সুবিধাটি হ'ল এটি সদৃশ মানগুলির প্রায় শূন্য ঝুঁকির সাথে সার্ভারে উত্পন্ন অটো-ইনক্রিমেন্ট মানগুলি (যার জন্য একটি রাউন্ড ট্রিপ প্রয়োজন) ব্যবহার না করে ক্লায়েন্টে আইডি মানগুলি তৈরি করতে দেয়।

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

public static class LongIdGenerator
{
    // set the start date to an appropriate value for your implementation 
    // DO NOT change this once any application that uses this functionality is live, otherwise existing Id values will lose their implied date
    private static readonly DateTime PeriodStartDate = new DateTime(2017, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    private static readonly DateTime PeriodEndDate = PeriodStartDate.AddYears(100);
    private static readonly long PeriodStartTicks = PeriodStartDate.Ticks;
    private static readonly long PeriodEndTicks = PeriodEndDate.Ticks;
    private static readonly long TotalPeriodTicks = PeriodEndTicks - PeriodStartTicks;

    // ensures that generated Ids are always positve
    private const long SEQUENCE_PART_PERMUTATIONS = 0x7FFFFFFFFFFF; 

    private static readonly Random Random = new Random();

    private static readonly object Lock = new object();
    private static long _lastSequencePart;

    public static long GetNewId()
    {
        var sequencePart = GetSequenceValueForDateTime(DateTime.UtcNow);

        // extra check, just in case we manage to call GetNewId() twice before enough ticks have passed to increment the sequence 
        lock (Lock)
        {
            if (sequencePart <= _lastSequencePart)
                sequencePart = _lastSequencePart + 1;

            _lastSequencePart = sequencePart;
        }

        // shift so that the sequence part fills the most significant 6 bytes of the result value
        sequencePart = (sequencePart << 16);

        // randomize the lowest 2 bytes of the result, just in case two different client PCs call GetNewId() at exactly the same time
        var randomPart = Random.Next() & 0xFFFF;

        return sequencePart + randomPart;
    }

    // used if you want to generate an Id value for a historic time point (within the start and end dates)
    // there are no checks, compared to calls to GetNewId(), but the chances of colliding values are still almost zero
    public static long GetIdForDateTime(DateTime dt)
    {
        if (dt < PeriodStartDate || dt > PeriodStartDate)
            throw new ArgumentException($"value must be in the range {PeriodStartDate:dd MMM yyyy} - {PeriodEndDate:dd MMM yyyy}");

        var sequencePart = GetSequenceValueForDateTime(dt.ToUniversalTime());
        var randomPart = Random.Next() & 0xFFFF;
        return ( sequencePart << 16 ) + randomPart;
    }

    // Get a 6 byte sequence value from the specified date time - startDate => 0 --> endDate => 0x7FFFFFFFFFFF
    // For a 100 year time period, 1 unit of the sequence corresponds to about 0.022 ms
    private static long GetSequenceValueForDateTime(DateTime dt)
    {
        var ticksFromStart = dt.ToUniversalTime().Ticks - PeriodStartTicks;
        var proportionOfPeriod = (decimal)ticksFromStart / TotalPeriodTicks;
        var result = proportionOfPeriod * SEQUENCE_PART_PERMUTATIONS;
        return (long)result;
    }

    public static DateTime GetDateTimeForId(long value)
    {
        // strip off the random part - the two lowest bytes
        var timePart = value >> 16;
        var proportionOfTotalPeriod = (decimal) timePart / SEQUENCE_PART_PERMUTATIONS;
        var ticks = (long)(proportionOfTotalPeriod * TotalPeriodTicks);
        var result = PeriodStartDate.AddTicks(ticks);
        return result;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.