ছেদ টেবিল তৈরির পরিবর্তে নলযোগ্য বিদেশী কী ব্যবহারের অসুবিধা


15

বলুন আমার কাছে নিম্নলিখিত ER ডায়াগ্রাম রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

এখন যদি আমি সম্পর্ক উপস্থাপিত একটি বিদেশী কী ব্যবহার Schoolমধ্যে Student, আমি থাকতে পারে NULLমান (কারণ একটি Student একটি অন্তর্গত প্রয়োজন নেই Schoolউদাহরণস্বরূপ):

এখানে চিত্র বর্ণনা লিখুন

সুতরাং সঠিক উপায়ে (আমি যা পড়েছি তার উপর ভিত্তি করে) সম্পর্কের প্রতিনিধিত্ব করার জন্য একটি ছেদ টেবিল তৈরি করা হয়, উদাহরণস্বরূপ:

এখানে চিত্র বর্ণনা লিখুন

এইভাবে, কোনও NULLমান টেবিলে উপস্থিত থাকতে পারে না School_has_Student

তবে ছেদ টেবিল তৈরি করার পরিবর্তে নলযুক্ত বিদেশী কী ব্যবহার করার অসুবিধাগুলি কী?


সম্পাদনা:

আমি ভুলবশত ( school_id, student_id) School_has_Studentটেবিলের প্রাথমিক কী হিসাবে বেছে নিয়েছি , যা সম্পর্কটিকে বহু-থেকে অনেক করে তুলেছে। সঠিক প্রাথমিক কীটি হওয়া উচিত ছিল student_id:

এখানে চিত্র বর্ণনা লিখুন


7
কোনও "সঠিক" উপায় নেই। আপনার প্রয়োজনের জন্য সবচেয়ে ভাল উপায় এখানে।
মেটাফাইট

1
আমি ডক এর সাথে মিথ্যা ভিত্তি সম্পর্কে একমত, তবে সম্ভবত এখনও উত্তর দেওয়ার পক্ষে এটি যথেষ্ট পরিষ্কার?
মেটাফাইট

একটি ভ্রান্ত ভিত্তি রয়েছে, তবে পার্থক্যটি সোজা করে ব্যাখ্যা করা যথেষ্ট সহজ।

আমি আমার ঘনিষ্ঠ ভোট প্রত্যাহার করেছিলাম, তবে বাক্যটি "সুতরাং সঠিক উপায় (আমি যা পড়েছি তার উপর ভিত্তি করে) সম্পর্কের প্রতিনিধিত্ব করার জন্য একটি ছেদ টেবিল তৈরি করা" আমাকে এমন ধারণা দেয় যা আপনাকে আমাদের বলা উচিত যে কোন স্ট্রেনজ উত্স আপনাকে বলেছে এটি " সঠিক পথ. আমি আগে যে পাঠ্য পুস্তকটি পড়েছি, সেগুলিতে 1: n সম্পর্কের জন্য একক বিদেশী কী way নাকি কিছু ভুল বুঝেছ?
ডক ব্রাউন 18

@ ডক ব্রাউন আমি কোথায় পড়েছি তা মনে নেই তবে আমি নিশ্চিত যে এটি বলে যে ছেদ করার টেবিলটি সঠিক উপায় ছিল। যাইহোক, আপনি কি আমাকে এমন একটি বইয়ের নাম দিতে পারেন যা বলছে যে 1: n সম্পর্ক (1 পার্শ্বের alচ্ছিক অংশগ্রহণের সাথে) একক বিদেশী কী ব্যবহার করে উপস্থাপন করা উচিত, আমি এই বিষয়ে তারা কী বলে তা পড়তে আগ্রহী।
টম

উত্তর:


18

দুটি মডেল বিভিন্ন সম্পর্কের প্রতিনিধিত্ব করে।

একটি যোগদানের টেবিল ব্যবহার করে, আপনি একাধিক থেকে বহু সম্পর্কের মডেলিং করছেন।

একটি সাধারণ বিদেশী কী ব্যবহার করে আপনি একের মধ্যে একাধিক সম্পর্কের মডেলিং করছেন।

যদি আপনি এটি সম্পাদন করার চেষ্টা করছেন তবে যদি কোনও অবিচ্ছিন্ন বিদেশী কী এর অসুবিধাটি সম্পর্কটিকে বহু-থেকে অনেকের মতো করে তুলতে পারছে না।


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

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

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

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


সুতরাং আমি যদি একের সাথে একাধিক সম্পর্কের মডেলিং করছি (এতে: 1 টিতে alচ্ছিক অংশগ্রহণের সাথে), এর NULLমান থাকতে পারে তা সত্ত্বেও আমার একটি বিদেশী কী ব্যবহার করা উচিত ?
টম

1
@ টম হ্যাঁ, এটি ঠিক কিভাবে মডেল করবেন। প্রযুক্তিগতভাবে যোগদানের টেবিলটি ব্যবহার করা সম্ভব হলেও ডেটা মডেলটি অনেককে মঞ্জুরি দেয় যাতে এটি রোধ করতে আপনার ট্রিগার এবং ডাটাবেসের যুক্তি প্রয়োজন। ভুলভাবে ডেটা যুক্ত করা অসম্ভব এমনভাবে সম্পর্ককে সীমাবদ্ধ রেখে আপনি আরও ভাল।

1
আমি আমার প্রশ্নের সম্পাদনা করেছি। আমি কেবল টেবিলের student_idমধ্যে একটি প্রাথমিক কী তৈরি করেছি School_has_Student, যা সম্পর্কটিকে এক থেকে অনেকের মতো করে রেখেছে। একটি বিদেশী কী ব্যবহার করে এই পদ্ধতির কোন ত্রুটি রয়েছে?
টম

@ টম আমি আমার উত্তর সম্পাদনা করেছি

6

আপনি উপরের মন্তব্যে লিখেছেন:

"ডেটাবেস সিস্টেমগুলির ফান্ডামেন্টালস" বইটি [...] বলেছে [...] যে বিদেশী কী কলামে অনেকগুলি নূন্যমূল্য উপস্থিত থাকলে একটি ছেদ সারণি ব্যবহার করার পরামর্শ দেওয়া হয় (উদাহরণস্বরূপ: যদি 98% কর্মচারী থাকে) একটি বিভাগ পরিচালনা করবেন না)

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

এর বিপরীতে, যদি আপনার কাছে কয়েকটি নূন্যমূল্য না থাকে তবে আপনাকে বলতে দিন যে 50% বা তার বেশি সম্পর্ক নুল নয়, ছেদ টেবিলটি আপনাকে বিপরীত প্রভাব দেয় - বেশি ডিস্কের স্থান, উচ্চতর জটিলতা যার ফলে আরও বেশি নেটওয়ার্ক ট্র্যাফিক ইত্যাদি ঘটে etc.

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

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

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


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

@ গার্ডেনহেড: আপনি "বিশ্বাসের চেয়ে বেশি" এটি কী বিশ্বাস করে?
ডক ব্রাউন

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

@ গার্ডেনহেড: আমার কাছে মনে হচ্ছে আপনি আমার থেকে অনেক বেশি উচ্চতর বিচারক অনুমান করছেন। তবুও, আমার সম্পাদনা দেখুন।
ডক ব্রাউন

2

ধারণাগত মডেলটি এর মতো দেখাবে, যা কম বলে খুব অবাস্তব is

এখানে চিত্র বর্ণনা লিখুন

শারীরিক মডেলটি এর মতো দেখাবে, যা কম বলে বিভ্রান্ত করছে (লোকেরা যদি এটি ঘনিষ্ঠভাবে না দেখেন তবে এটি এম: এম) মনে করবেন):

এখানে চিত্র বর্ণনা লিখুন

আমার পরামর্শ:

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

অন্যথায় , nullable FK একটি ডাটাবেসের একটি সাধারণ অংশ এবং যোগদানের টেবিলগুলি সাধারণত এম: এম রিলিজের জন্য থাকে।

1: 1 রিলসের সাধারণ ব্যবহারগুলি ভূমিকা সারণীর জন্য কলামগুলি রয়েছে যা কেবলমাত্র সত্তাটি নির্দিষ্ট ধরণের হয় এবং পারফরম্যান্স বা স্টোরেজ বিবেচনার জন্য BLOB কলামগুলি বের করে। এফকেগুলিতে নাল মানগুলি বেঁচে থাকা তার পক্ষে সাধারণ ব্যবহার নয়।

এখানে চিত্র বর্ণনা লিখুন


2

অন্যান্য উত্তরের পাশাপাশি আমি উল্লেখ করতে চাই যে বিদেশী কীটির জন্য একটি নাল মান অস্পষ্ট। এটা মানে:

1) শিক্ষার্থীর স্কুল (যদি থাকে তবে) অজানা (এটি 'নাল'-এর মানক অর্থ - অজানা)

২) শিক্ষার্থীর স্কুল আছে কি না তা জানা যায় এবং তাদের কোনও নেই

যদি আপনি নালার স্ট্যান্ডার্ড অর্থ ব্যবহার করেন তবে আপনি কীভাবে আপনার বিদেশী কী মডেলটিতে "শিক্ষার্থীর কোনও স্কুল নেই" উপস্থাপন করবেন? সেক্ষেত্রে আপনার সম্ভবত স্কুলের টেবিলে নিজস্ব আইডি সহ একটি "স্কুল নেই" এন্ট্রি তৈরি করতে হবে। (আদর্শ নয়)


2
"ডাটাবেস সিস্টেমের ফান্ডামেন্টালস" বইটিতে উল্লেখ করা হয়েছে যে এর জন্য 3 টি ব্যাখ্যা রয়েছে NULL, এর অর্থ হতে পারে: 1) অজানা মান। 2) অনুপলব্ধ বা রোধকৃত মান। 3) প্রযোজ্য নয় বৈশিষ্ট্য (আমার মনে হয় এই ব্যাখ্যাটির অর্থ আপনি NULLএকটি বিদেশী কী জন্য একটি নির্দিষ্ট করতে পারেন )।
টম

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

সুতরাং আপনি কি পরামর্শ দিচ্ছেন যে একটি নলযুক্ত বিদেশী কী ব্যবহার না করে আমার ছেদ টেবিল তৈরি করা উচিত?
টম

@ টম হ্যাঁ, আমি বিশ্বাস করি যে এই ক্ষেত্রে এটি আরও ভাল
ব্র্যাড থমাস

@ ব্র্যাড থমাস - চৌরাস্তা টেবিল ব্যবহার করার সময় একই অস্পষ্টতা এড়াতে, আপনি কি নুল স্কুল_আইডি দিয়ে ছেদ করা টেবিলে একটি রেকর্ড দ্বারা কেস 2 (এটি জানা যায় যে শিক্ষার্থীর কোনও স্কুল নেই) উপস্থাপন করবেন?
অ্যান্ড্রু

1

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

থিওরিটি দুর্দান্ত তবে শেষ পর্যন্ত আপনি যে প্রশ্নগুলি জিজ্ঞাসা করছেন তার পরে আপনি আপনার ডাটাবেসটি মডেল করতে চলেছেন।

আপনি যদি এই প্রশ্নটি দিয়ে প্রায়শই প্রশ্ন করতে চান: "কোন বিদ্যার্থীরা আমার স্কুলে" আপনি কি সত্যিই পুরো শিক্ষার্থীদের টেবিলটি জিজ্ঞাসা করতে চান বা একটি সহজে ছেদ করার টেবিল রাখতে চান?

ডাটাবেসে: আপনার জিজ্ঞাসা প্রশ্নগুলির জন্য অনুকূলিত করুন।


0

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

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

সুতরাং হিসাবে আপনি দেখতে পারেন, এটি একটি মোটামুটি নির্দিষ্ট ঘটনাতে, এবং অন্যদের লক্ষনীয়, সবচেয়ে বার তোমাদের সকলের পুরোপুরি ঠিক হতে চাই NULLমান। এটি সত্যই আপনার মডেলের নির্দিষ্ট প্রয়োজনীয়তার উপর নির্ভর করে।


0

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

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

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