একটি ডাটাবেস জুড়ে একটি একক প্রাথমিক কী ক্রম ভাগ করা?


14

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

আমি একটি জুনিয়র সফটওয়্যার বিকাশকারী, ডিবিএ নয়, তাই আমি এখনও ভাল ডাটাবেস ডিজাইনের অনেকগুলি বেসিক শিখছি।

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

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


2
পারফরম্যান্সের কারণে এটি সাধারণত একটি ভয়ানক ধারণা।
ফিলি

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

আপনি কোন ডিবিএমএস ব্যবহার করছেন? ওরাকল? Postgres? DB2?
a_horse_with_no_name

1
আপনি কি তার অর্থটি ভুল ব্যাখ্যা করতে পারবেন? তিনি কি আক্ষরিক হয়ে উঠছিলেন না?
জেমসআরয়ান

সংস্থাটি ডিবিএর অর্থ কি কোনও টেবিলে প্রাথমিক কী ক্ষেত্র নেই?
ম্যাক্স ভার্নন

উত্তর:


13

গ্রহনযোগ্য? অবশ্যই। সাধারণ? না? উপকারী? সন্দিহান।

আমার পুরানো চাকরিতে আমরা একটি সিস্টেম উত্তরাধিকারসূত্রে পেয়েছি যেখানে তাদের কেন্দ্রীয় সিকোয়েন্স জেনারেটর ছিল (এটি SEQUENCEএসকিউএল সার্ভার ২০১২-এ প্রচুর আগে একটি এসকিউএল সার্ভার সিস্টেম ছিল)। এটি সত্যিই কোনও পারফরম্যান্সের বাধা ছিল না এবং এটি হওয়া উচিত নয় যতক্ষণ না আপনি প্রতি সেকেন্ডে কয়েক হাজার কয়েক হাজার মান উৎপন্ন করে। কিন্তু এটি কোনও যুক্তিসঙ্গত কারণেই কোডের সমস্তটিকে অনেক বেশি জটিল করে তুলেছিল good ডিজাইনের উদ্দেশ্যটি নিশ্চিত করা ছিল যে সিস্টেমে কোনও কিছুর জন্য যদি একটি আইডির মান 12 দেওয়া থাকে তবে সিস্টেমে কেবল একটি জিনিসের আইডি 12 থাকতে পারে me এটি আমার কাছে বেশ আপত্তি বলে মনে হয়েছিল এবং আমি কখনই এটি বুঝতে পারি নি। আমার যদি গ্রাহকআইডি = 12 সহ গ্রাহক থাকে তবে কেন এটি আমাকে অর্ডারআইডি = 12 দিয়ে অর্ডার করতে বাধা দেয়?

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


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

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

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

পূর্ববর্তী সিস্টেমে আমি পুরো ডাটাবেসটিতে একক ক্রম ব্যবহার করে দেখেছি, এটি একটি বিদেশী কীকে একক টেবিলের পরিবর্তে বিভিন্ন আলাদা টেবিলের দিকে নির্দেশ করার জন্য করা হয়েছিল, যাতে আপনি যখন বলেছিলেন যে দুটি পৃথক সারিটির বিদেশী কী আপনি 12 বছর বয়সী ছিলেন, আপনি কী জানেন যে তারা কী টেবিলটি দেখিয়েছেন তা পরীক্ষা করার প্রয়োজন ছাড়াই একই জিনিসটির দিকে ইঙ্গিত করেছিলেন। একই কলামের একটি 13 সম্ভবত অন্য কোনও টেবিলে প্রাথমিক কী হতে পারে। আমি ব্যক্তিগতভাবে সেই নকশার শৈলীতে খুব অস্বস্তি বোধ করি।
Lawtonfogle

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

7

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

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

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

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

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

আমি নিশ্চিত যে এগুলি ব্যবহারের ফলে আমরা আমাদের অ্যাপ্লিকেশনটিতে অনেকগুলি বাগ এড়িয়ে চলেছি।


4

সমস্ত টেবিল জুড়ে একক ক্রমের পিছনে কারণ কী হতে পারে তা আমি ভাবতে পারি না। নতুন মানগুলি তৈরি করার সময় যা কিছু ঘটে তা হ'ল বাধা তৈরি করা।

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

এমনকি সবচেয়ে দক্ষ ক্রম জেনারেটরের সঙ্গে হতে হবে একটি কাজের চাপ যে untolerable বিবাদের কারণ।


2
কীভাবে বাধা তৈরি হয় এবং কেন এটি খারাপ ধারণা তা সম্পর্কে আপনি বিশদ যুক্ত করতে চাইতে পারেন।
ম্যাক্স ভার্নন

2

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

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


2

আমি মনে করি এটি করার একটি কারণ হ'ল যদি সমস্ত সত্তা কিছু অভিভাবক সত্তার উত্তরাধিকার সূত্রে প্রাপ্ত হয়। উদাহরণস্বরূপ বলুন যে আপনি কোনও ধরণের সত্তা সম্পর্কে একটি মন্তব্য দিতে সক্ষম হতে চেয়েছিলেন:

create table god_entity (
  id bigserial primary key
);

create table some_table (
  id bigint primary key references god_entity(id),
  ...
);

create table some_other_table (
  id bigint primary key references god_entity(id),
  ...
);

create table comment (
  id bigint primary key references god_entity(id),
  ...
);

create table entity_comment (
  entity_id bigint not null references god_entity(id),
  comment_id bigint not null references god_entity(id),

  primary key (entity_id, comment_id)
);

সাধারণত এটি করা হয় না। ।

পারফরম্যান্স বৈশিষ্ট্য সম্পর্কে জানেন না।

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