আমার কখন এক সম্পর্ক ব্যবহার করা উচিত?


92

এই নুব প্রশ্নের জন্য দুঃখিত তবে আপনার ডেটাবেজে টেবিলের সাথে একের সাথে সম্পর্ক ব্যবহার করার কোনও বাস্তবের দরকার আছে কি? আপনি একটি টেবিলের ভিতরে সমস্ত প্রয়োজনীয় ক্ষেত্রটি প্রয়োগ করতে পারেন। এমনকি ডেটা খুব বড় হয়ে গেলেও আপনি SELECTব্যবহার না করে বিবৃতিতে প্রয়োজনীয় কলামের নামগুলি গণনা করতে পারেন SELECT *। আপনার কখন এই বিচ্ছেদ প্রয়োজন?

উত্তর:


105

1 থেকে 0..1

  • উত্তরাধিকার বাস্তবায়নের জন্য সুপার এবং সাব-ক্লাসের মধ্যে "1 থেকে 0..1" "পৃথক টেবিলের সমস্ত শ্রেণি" কৌশল হিসাবে ব্যবহার করা হয় ।

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

1 থেকে 1

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

  • উল্লম্ব পার্টিশনগুলির আরেকটি ব্যবহার হ'ল লকিং আচরণ পরিবর্তন করা: ডেটাবেসগুলি সাধারণত পৃথক ক্ষেত্রের স্তরে লক করতে পারে না, কেবল পুরো সারি ows সারিটি বিভক্ত করে, আপনি কেবলমাত্র তার অর্ধেকের একটিতে লক স্থাপনের অনুমতি দিচ্ছেন।

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

  • পৃথক সারণী আরও দানাদার সুরক্ষার অনুমতি দিতে পারে।

এই বিবেচনাগুলি বেশিরভাগ ক্ষেত্রে অপ্রাসঙ্গিক, তাই বেশিরভাগ ক্ষেত্রে আপনার "1 থেকে 1" টেবিলগুলিকে একটি একক সারণীতে মার্জ করার বিষয়টি বিবেচনা করা উচিত।


20

যদি একটি টেবিলের ডেটা সম্পর্কিত হয় তবে অন্যটির বর্ণিত সত্তার সাথে এটি 'সম্পর্কিত নয়', তবে এটিকে আলাদা রাখতে একজন প্রার্থী।

এটি ভবিষ্যতে সুবিধাগুলি সরবরাহ করতে পারে, যদি পৃথক ডেটা অন্য কোনও সত্তার সাথেও সম্পর্কিত হতে পারে।


19

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

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

যদি আপনার টেবিলটিতে 20 টি বৈশিষ্ট্য রয়েছে এবং এর মধ্যে কেবলমাত্র 4 টি ব্যবহার করা হয় তবে পারফরম্যান্স সমস্যার জন্য টেবিলটি 2 টেবিলের মধ্যে বিভক্ত করা বুদ্ধিমানের কাজ।

এই জাতীয় পরিস্থিতিতে সমস্ত কিছু এক টেবিলের মধ্যে রাখা ভাল নয়। তদ্ব্যতীত, 45 টি কলামযুক্ত টেবিলটি মোকাবেলা করা সহজ নয়!


17

আমার 2 সেন্ট।

আমি এমন জায়গায় কাজ করি যেখানে আমরা সকলেই একটি বৃহত অ্যাপ্লিকেশনটিতে বিকাশ করি এবং সবকিছুই একটি মডিউল। উদাহরণস্বরূপ, আমাদের একটি usersটেবিল রয়েছে এবং আমাদের একটি মডিউল রয়েছে যা ব্যবহারকারীর জন্য ফেসবুকের বিশদ যুক্ত করে, অন্য মডিউল যা ব্যবহারকারীকে টুইটারের বিশদ যুক্ত করে। আমরা mod মডিউলগুলির মধ্যে একটি প্লাগ আনার সিদ্ধান্ত নিতে পারি এবং আমাদের অ্যাপ্লিকেশন থেকে এর সমস্ত কার্যকারিতা সরিয়ে ফেলতে পারি। এই ক্ষেত্রে, প্রতিটি মডিউল তাদের নিজস্ব টেবিলটি 1: 1 টির সাথে বৈশ্বিক usersটেবিলের সাথে যুক্ত করে :

create table users ( id int primary key, ...);
create table users_fbdata ( id int primary key, ..., constraint users foreighn key ...)
create table users_twdata ( id int primary key, ..., constraint users foreighn key ...)

13

এটি ব্যবহার করার সবচেয়ে বুদ্ধিমান সময় হ'ল যদি দুটি পৃথক ধারণা থাকত যা কেবল কখনও এইভাবে সম্পর্কিত হয়। উদাহরণস্বরূপ, একটি গাড়ীতে কেবলমাত্র একজন বর্তমান ড্রাইভার থাকতে পারে, এবং ড্রাইভার কেবল একবারে একটি গাড়ি চালাতে পারে - সুতরাং গাড়ি এবং ড্রাইভারের ধারণাগুলির মধ্যে সম্পর্ক 1 থেকে 1 হবে would পয়েন্ট

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

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

পারফরম্যান্স বা পঠনযোগ্যতা ইস্যুগুলির জন্য আপনি দুটি আলাদা টেবিলের মধ্যে একক ধারণার জন্য ডেটা ভাগ করার সিদ্ধান্ত নিতে পারেন, তবে আপনি যদি স্ক্র্যাচ থেকে শুরু করে থাকেন তবে এটি যুক্তিসঙ্গতভাবে বিশেষ ক্ষেত্রে - এই সমস্যাগুলি পরে তাদের দেখানো হবে।


5

খুব প্রায়ই না।

আপনার যদি কিছু সুরক্ষা বাস্তবায়নের প্রয়োজন হয় তবে আপনি কিছু উপকার পেতে পারেন - যাতে কিছু ব্যবহারকারী কিছু কলাম (টেবিল 1) দেখতে পারবেন তবে অন্যরা (টেবিল 2) দেখতে পারবেন না ..

অবশ্যই কিছু ডাটাবেস (ওরাকল) আপনাকে একই টেবিলে এই ধরণের সুরক্ষা করার অনুমতি দেয়, তবে কিছু অন্যান্য নাও পারে।


5

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

নীচে, সাধারণীকরণ সম্পর্কিত একটি নিবন্ধ দেওয়া আছে is

http://support.microsoft.com/kb/283878


3

সমস্ত ডিজাইনের প্রশ্নের মতো উত্তরটি "এটি নির্ভর করে"।

কয়েকটি বিবেচনা আছে:

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

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

  • আপনি কতটা নিশ্চিত যে সম্পর্কটি 1: 1 হবে? এই প্রশ্নটি হিসাবে উল্লেখ করা হয়েছে যে জিনিসগুলি দ্রুত জটিল হতে পারে।


3

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


2

আমি সাধারণত অনুশীলনে দুটি সাধারণ ধরণের 1: 1 সম্পর্কের মুখোমুখি হই:

  1. আইএস-এ সম্পর্ক, সুপারটাইপ / সাব টাইপ সম্পর্ক হিসাবেও পরিচিত। এটি তখন হয় যখন এক ধরণের সত্তা আসলে অন্য ধরণের সত্তা (এনটিটিএ আইএস এ সত্তাবি)। উদাহরণ:

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

    এই সমস্ত পরিস্থিতিতে, সুপার টাইপ সত্তা (যেমন ব্যক্তি, আইটেম বা গাড়ী) সমস্ত উপপ্রকারগুলির মধ্যে সাধারণ বৈশিষ্ট্যগুলি উপস্থিত থাকে এবং উপ-টাইপ সত্তা প্রতিটি উপ-টাইপের সাথে স্বতন্ত্র বৈশিষ্ট্যযুক্ত থাকতে পারে। সাব টাইপের প্রাথমিক কী সুপারটাইপের মতো হবে।

  2. "বস" সম্পর্ক। এটি তখনই হয় যখন কোনও ব্যক্তি কোনও সাংগঠনিক ইউনিটের (বিভাগ, সংস্থা ইত্যাদি) অনন্য বস বা পরিচালক বা তদারক হন। সাংগঠনিক ইউনিটের জন্য যখন কেবলমাত্র একজন বসকে অনুমতি দেওয়া হয়, তখন সেই ব্যক্তি সত্তার মধ্যে 1: 1 সম্পর্ক থাকে যা বস এবং সাংগঠনিক ইউনিটের সত্তাকে উপস্থাপন করে।


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

2

প্রথমত, আমি মনে করি এটি একটি পৃথক সত্তা নিয়ে গঠিত মডেলিং এবং সংজ্ঞায়নের প্রশ্ন। মনে করুন আপনার customersসাথে একটি এবং কেবল একটি একক রয়েছে address। অবশ্যই আপনি একটি টেবিলের মধ্যে সমস্ত কিছু বাস্তবায়ন করতে customerপারেন, তবে ভবিষ্যতে যদি আপনি তাকে 2 বা ততোধিক ঠিকানা রাখার অনুমতি দেন তবে আপনাকে অবশ্যই রিফ্যাক্টর করতে হবে (কোনও সমস্যা নয়, তবে একটি সচেতন সিদ্ধান্ত নিতে হবে)।

আমি এমন একটি আকর্ষণীয় মামলাটিও ভাবতে পারি যেখানে অন্য উত্তরে উল্লেখ করা হয়নি যেখানে টেবিল বিভক্ত করা কার্যকর হতে পারে:

আবার কল্পনা করুন, আপনার প্রত্যেকে customersএকটি addressকরে রয়েছে, তবে এবার একটি ঠিকানা রাখা alচ্ছিক। অবশ্যই আপনি NULLযেমন-এর মতো কলামগুলির একগুচ্ছ হিসাবে প্রয়োগ করতে পারেন ZIP,state,street। কিন্তু যে অনুমান দেওয়া যে আপনার আছে একটি ঠিকানা রাষ্ট্র ঐচ্ছিক নয়, কিন্তু জিপ হয়। একক টেবিলে কীভাবে মডেল করবেন? আপনি customerটেবিলে কোনও প্রতিবন্ধকতা ব্যবহার করতে পারেন তবে অন্য টেবিলের মধ্যে ভাগ করে বিদেশী_কিকে নালাগুলি তৈরি করা অনেক সহজ। যে আপনার মডেল পথ আরো অনেক কিছু বলে যে স্পষ্ট হয় সত্তা address ঐচ্ছিক, এবং যে ZIPযে সত্তা একজন ঐচ্ছিক অ্যাট্রিবিউট।


0

প্রোগ্রামিংয়ের সময় আমি কেবলমাত্র একটি পরিস্থিতিতে এর মুখোমুখি হয়েছি। যা তখন একই 2 টি সত্তার ("সত্তা এ" এবং "সত্তা বি") এর মধ্যে 1-থেকে-বহু এবং 1-থেকে -1 সম্পর্ক থাকে।

যখন "সত্তা এ" এর একাধিক "সত্তা বি" এবং "সত্তা বি" রয়েছে মাত্র 1 "সত্তা এ" এবং "সত্তা এ" এর কেবলমাত্র 1 বর্তমান "সত্তা বি" এবং "সত্তা বি" রয়েছে মাত্র 1 "সত্ত্বা এ"।

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

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


0

ডাটাবেস সারণিতে সর্বাধিক সংখ্যক কলাম ছাড়িয়ে গেলে ব্যবহারের আর একটি ক্ষেত্রে হতে পারে। তারপরে আপনি OneToOne ব্যবহার করে অন্য টেবিলে যোগ দিতে পারেন

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