এসকিউএল - বহু থেকে বহু সারণী প্রাথমিক কী


125

এই প্রশ্নটিতে একটি মন্তব্য পড়ে এই প্রশ্নটি উঠে আসে:

ডাটাবেস ডিজাইন

আপনি যখন অনেকগুলি টেবিল তৈরি করেন, আপনি কি দুটি বিদেশী কী কলামগুলিতে একটি যৌগিক প্রাথমিক কী তৈরি করতে পারেন, বা একটি স্বয়ং-বর্ধিত সার্জিট "আইডি" প্রাথমিক কী তৈরি করতে হবে এবং কেবল আপনার দুটি এফকে কলামে সূচি স্থাপন করা (এবং সম্ভবত একটি অনন্য বাধা)? প্রতিটি ক্ষেত্রে নতুন রেকর্ড সন্নিবেশ / পুনরায় সূচীকরণের জন্য পারফরম্যান্সের কী কী প্রভাব পড়বে?

মূলত: এটি:

PartDevice
----------
PartID (PK/FK)
DeviceID (PK/FK)

বনাম এটি:

PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)

মন্তব্যকারী বলেছেন:

দুটি আইডি তৈরি করে পিকে অর্থ হ'ল টেবিলটি সেই ক্রমে ডিস্কে শারীরিকভাবে সাজানো হয়। সুতরাং আমরা যদি (পার্ট 1 / ডিভাইস 1), (পার্ট 1 / ডিভাইস 2), (পার্ট 2 / ডিভাইস 3) সন্নিবেশ করি, তবে (পার্ট 1 / ডিভাইস 3) ডাটাবেসটিকে টেবিলটি আলাদা করে 2 এবং 3 এন্ট্রিগুলির মধ্যে শেষটি সন্নিবেশ করতে হবে For অনেকগুলি রেকর্ড, এটি খুব সমস্যাযুক্ত হয়ে ওঠে কারণ এতে প্রতিবার যুক্ত হওয়ার সাথে সাথে কয়েক হাজার, হাজার বা কয়েক মিলিয়ন রেকর্ড পরিবর্তন করা হয়। বিপরীতে, একটি স্বয়ংসোধক পিকে নতুন রেকর্ডগুলি শেষ পর্যন্ত মোকাবেলা করার অনুমতি দেয়।

আমি জিজ্ঞাসা করার কারণটি হ'ল কারণ আমি সর্বদা কোনও সরোগেট অটো-ইনক্রিমেন্ট কলাম সহ যৌগিক প্রাথমিক কী করতে আগ্রহী ছিলাম, তবে আমি নিশ্চিত নই যে সরোগেট কী আসলে আরও পারফরম্যান্ট কিনা।


এখানে একটি সিলিমার প্রশ্ন এসও পোস্ট করা হয়েছে: stackoverflow.com/questions/344068/…
টনি

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

1
এর উত্তর কি ডিবিএমএস ব্যবহার করা হয় তার উপর নির্ভর করে না? আমি মাইএসকিউএল ভাবে এই ক্ষেত্রে, এসকিউএল সার্ভার সামান্য অন্য উপায় ইত্যাদি আচরণ করবে সন্দেহ
Radu Murzea

গুহাত: একটি নির্দিষ্ট ডাটাবেস ট্যাগ ব্যতীত, এখানে যা বলা হয় তার বেশিরভাগই সন্দেহজনক। বিভিন্ন ইঞ্জিন ভিন্নভাবে কাজ করে!
রিক জেমস

উত্তর:


85

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

স্বতন্ত্র কলামগুলিতে আপনার সূচকের দরকার হবে না কারণ টেবিলটি কেবল দুটি রেফারেন্সযুক্ত টেবিলকে একসাথে যোগদানের জন্য ব্যবহার করা উচিত।

আপনি যে মন্তব্যে প্রশ্নটিতে উল্লেখ করেছেন তা আমার মতে ইলেকট্রন ব্যবহারের পক্ষে মূল্যহীন নয়। দেখে মনে হচ্ছে যে লেখক মনে করেন যে টেবিলটি একটি উচ্চতর কর্মক্ষমতা ভারসাম্যযুক্ত বহু-উপায় গাছের কাঠামোর পরিবর্তে একটি অ্যারেতে সঞ্চিত রয়েছে।

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

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


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

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

ভাবুন আমাজন - প্রতি ঘন্টা তৈরি হওয়া হাজার হাজার অর্ডার।
ব্যবহারকারী

9
@buffer, হ্যাঁ, কিন্তু আবার সেই আদেশ প্রতিটি প্রায় অবশ্যই করা হবে না জানতে চাওয়া (উদাহরণস্বরূপ) করতে অনেক বার প্যাকেজিং, বিলিং, স্ট্যাটাস আপডেট, ব্যবসা বিশ্লেষণ এবং তাই। সৃষ্টির পরম সংখ্যাটি সৃষ্টি এবং পঠনের মধ্যে অনুপাতের চেয়ে কম গুরুত্বপূর্ণ ।
প্যাক্সডিয়াবলো

1
আমার বক্তব্যটি হল, এটি insertপ্রতি ঘন্টা কয়েক হাজার করা হচ্ছে কিনা তা বিবেচনা করবে। আপনি কেবল এটি উপেক্ষা করতে পারেন না শুধু কারণ অনুপাত insertথেকে selectহল <1. এই ক্ষেত্রে, কত সময় এটা একটা অর্ডার লাগে সম্পর্কে একটি গ্রাহক বজায় রাখে।
ব্যবহারকারী

19

লিঙ্ক টেবিলগুলির জন্য কোনও সারোগেট কী প্রয়োজন নেই।

একটি পিকে চালু (কল 1, কল 2) এবং অন্য এক অনন্য সূচক (কল 2, কল 1) এর জন্য আপনার যা প্রয়োজন তা হল

আপনি যদি এমন কোনও ওআরএম ব্যবহার না করেন যা আপনার পক্ষে আপনার ডিবি ডিজাইনটি মোকাবেলা করতে এবং ডিক্টিট করতে পারে না ...

সম্পাদনা: আমি এখানে একই উত্তর দিয়েছি: এসকিউএল: বহু-বহু সারণীর জন্য আপনার কী একটি স্বয়ং-বর্ধিত প্রাথমিক কী দরকার?


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

@ জিবিএন: দ্বিতীয় সূচকটি (কল 2, কোল 1) অনন্য হওয়ার দরকার নেই, তাই না?
ব্যবহারকারী

1
ইতিমধ্যে কোনও পিকে হয়ে যাওয়ার পরে একটি অনন্য সূচক (কল 1, কল 2) লাগানো পুরোপুরি রিয়ন্ডান্ট
ডন

@ মিমক্রাই: আমরা এটা কোথায় করছি?
জিবিএন

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

12

যদি টেবিলটি রেফারেন্স করা হয় তবে একটি ইনক্রিমেন্টাল প্রাথমিক কী প্রয়োজন হতে পারে। বহু-বহু-টেবিলের বিশদ থাকতে পারে যা বর্ধিত প্রাথমিক কী ব্যবহার করে অন্য টেবিল থেকে টানতে হবে।

উদাহরণ স্বরূপ

PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)
Other Details

এফকে হিসাবে পার্টডেভাইস.আইডি ব্যবহার করে 'অন্যান্য বিবরণগুলি' টানতে সহজ। সুতরাং ইনক্রিমেন্টাল প্রাথমিক কী ব্যবহার করা দরকার।


1
ধন্যবাদ! আপনি বর্ণিত প্রায় একই দৃশ্যের সন্ধান করায় আমি উত্তরটি পেয়েছি। তবে আপনি "অন্যান্য বিবরণ" যুক্ত করে আপনার প্রথম বাক্যটি থেকে দূরে সরে গেছেন। আমার যদি অনেকগুলি ম্যাপিং টেবিলের অনেকগুলি থাকে তবে আমার অন্য টেবিল থেকে রেফারেন্স করতে হবে? অর্থ, অনেকগুলি থেকে অনেকগুলি ম্যাপিং টেবিল অন্য কোনও তথ্য সংরক্ষণ করে না ... অতিরিক্ত আইডি কলামটি কি কোনওভাবেই বোঝায়? যদি তা না হয় তবে পরিবর্তে ম্যাপিং টেবিলের একটি রেকর্ডের রেফারেন্স কীভাবে দেওয়া যায়?
মিসমানথ্রপ

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

6

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


2

সুতরাং মনে হচ্ছে যদি কেবল দুটি কাজটি দুটি টেবিলের সাথে লিঙ্ক করা হয় তবে সেরা পিকে হ'ল ডুয়াল-কলাম পিকে।

তবে যদি এটি অন্য উদ্দেশ্যে কাজ করে তবে বিদেশী কী এবং দ্বিতীয় অনন্য সূচক সহ অন্য একটি এনডিএক্সকে পিকে হিসাবে যুক্ত করুন।

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

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