কেন একাধিক সম্পর্কের জন্য আমার একটি টেবিল থাকা উচিত নয়?


12

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

এখন, আমার সহকর্মী একাধিক সম্পর্কের জন্য একটি টেবিল তৈরি করার জন্য জোর দিয়েছিলেন। উপরের উদাহরণের জন্য কর্মচারী লিংক নামে একটি সারণী থাকতে পারে:

EmployeeLinks(
    IdLink int PK, 
    IdEmployee int FK null,
    IdStore int FK null,
    IdSale int FK null,
    LinkType int not null
)

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

সম্পাদনা করুন:

প্রাথমিকভাবে উপরের সারণীতে কোনও প্রাথমিক কী (!) থাকবে না। কারণ বিদেশী কীগুলি নালাগুলির অনুমতি দেয় একটি সারোগেট কী একমাত্র বিকল্প।


3
এটি OTLT বা EAV এর মতো তবে এটি আরও খারাপ কারণ এটি সারিগুলির চেয়ে কলামগুলি দীর্ঘায়িত করে !
onedaywhen

উত্তর:


13

আপনার সহকর্মী এই লিঙ্ক টেবিলের জন্য প্রাথমিক কী হিসাবে প্রস্তাব দেয়?
প্রাথমিক কী কলামগুলি অবশ্যই নুল হতে পারে না: উপরের টেবিলটি শুল্কযুক্ত।

উপরের উদাহরণে কোনও প্রাকৃতিক সারি সনাক্তকারী (যা কোনও পিকেই হয়) নেই (আইডেন্টিটি কলামটি প্রাথমিক কী নয়), সুতরাং এটি কোনও মডেলিং প্রক্রিয়াতে ব্যর্থ । এমনকি কিছু মডেল ছাড়াই সারণী তৈরি সম্পর্কে চিন্তাও করবেন না (ERD, ORM, IDEF1X, যাই হোক না কেন)

আপনার কাছে ৩ টি উপায়ের লিঙ্ক নেই তা নিশ্চিত করার জন্য আপনার চেক বাধাও প্রয়োজন।

অবশেষে, আপনি চতুর্থ এবং 5 ম সাধারণ ফর্ম অঞ্চলে বিপথগামী হয়ে যাচ্ছেন তবে ভুল কারণে।

আমি ইন্টারনেটে কোনও উদাহরণ পাই না: এটি দেখায় যে এটি কত বোকা


4
+1 এর জন্যI can't find any examples on the internet: that shows how stupid this is
জেএনকে

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

@ টমাসজ প্লাসকিউইচ: একটি সারোগেট কী প্রাথমিক কী নয়! এটি বাস্তবায়নের সময় প্রাকৃতিক কী পরিপূরক হিসাবে বেছে নেওয়া হয়। Dba.stackexchange.com/a/13779/630 দেখুন এছাড়াও, আপনার সহকর্মীর উচিত আমাদের একটি অনুমোদিত প্রবন্ধ যা এই কৌশলটি দেখায় show আমি আমার সময়ে আবর্জনার সম্পূর্ণ
স্তূপগুলি

12

প্রথম ব্যবহারিক কারণটি আমি ভাবতে পারি পারফরম্যান্স।

একটি "traditionalতিহ্যবাহী" মডেলটিতে Idemployee, Idstoreআপনার ক্ষেত্রগুলি বা যাই হোক না কেন একটি অনন্য সূচক থাকতে পারে এবং লুকআপে দুর্দান্ত পারফরম্যান্স পেতে পারেন। এটি সন্নিবেশকারীদের জন্য বজায় রাখাও সহজ। অনন্য সূচকগুলি আপনাকে আরও ঘন ঘন একত্রিত হতে দেয়, যা প্রচুর পরিমাণে JOINতীব্রভাবে দ্রুত তৈরি করতে পারে ।

আপনার উদাহরণের মডেলটিতে, সুন্দর পারফরম্যান্স পেতে আপনার টেবিলে প্রতিটি এফকে ক্ষেত্রে সর্বনিম্ন একক ফিল্ড সূচক থাকা দরকার, আদর্শভাবে উল্লেখযোগ্য সমস্ত সংমিশ্রণের উপর একটি কভারিং সূচক, যেমন:

  • কর্মচারী / দোকান
  • কর্মচারী / বিক্রয়

লিঙ্কটাইপ কী তা আমি নিশ্চিত নই তবে আপনি যদি এটি উল্লেখ করেন তবে সম্ভবত এটি সূচী করা উচিত।

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

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

মূলত আপনি মোর ডিস্কের জায়গাটি ব্যবহার করবেন, বজায় রাখতে আরও সূচী রাখবেন এবং কোনও কারণ ছাড়াই আপনার যুক্তি জটিল করে তুলবেন ic কেবলমাত্র "সুবিধা" হ'ল এটি মোকাবেলা করার জন্য কম টেবিল।


লিঙ্কটাইপ কলাম একটি বৈষম্যমূলক বিষয়। একটি সারিতে কোন জোড়টি আসলে সম্পর্কিত তা কেবল বলছি। আপনি আমাকে জিজ্ঞাসা করলে কেবল বৈপরীত্যের সাথে যুক্ত করুন।
টমাসজ প্লাসকিউইচজ

@ টমাসজপ্লাসকিউইজ আমার মনে হয় কেন এটি সফল হয় তাকে দেখানোর সর্বোত্তম উপায় হ'ল এতে উভয় ধরণের টেবিল সহ একটি নমুনা ডেটাसेट তৈরি করা এবং কিছু প্রশ্ন চালানো। তাঁর মডেলটি একটি traditional
তিহ্যবাহী

4

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

এটি প্রয়োজনীয় যদি সম্পর্কের প্রকারগুলি রানটাইমের সময় ব্যবহারকারী দ্বারা সংজ্ঞায়িত করা হয়। তবে এটি খুব কমই সত্যই ঘটে থাকে।

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

আমি কেবল তখনই সেই নকশাটি বেছে নেব যদি টেবিলগুলি তৈরি করতে আক্ষরিক অর্থে অর্থ ব্যয় হয়।

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