এসকিউএল সার্ভারে কোনও টেবিলে একাধিক নালাগ্রয় এফকে রাখা খারাপ অভ্যাস হিসাবে বিবেচিত হবে?


13

এসকিউএল সার্ভারে আমার ডাটাবেস কাঠামোতে, আমার কাছে 3 ধরণের পণ্য রয়েছে যাতে ক্রম সম্পর্কে বিভিন্ন তথ্য প্রয়োজন। তাই, আমি এক সৃষ্টি Customers: টেবিল এবং তিনটি ভিন্ন আদেশ টেবিল OrdersForProductAs, OrdersForProductBs, OrdersForProductCs। সমস্ত অর্ডার সারণীতে টেবিলে একের সাথে একাধিক সম্পর্ক Customersরয়েছে।

আমার কাছে আরও একটি টেবিল রয়েছে যা Paymentsপ্রদানের বিবরণটি ভিতরে রাখে এবং রাখে। তবে এটি কীভাবে গঠন করা যায় সে সম্পর্কে আমার সন্দেহ আছে।

যেহেতু আমার একাধিক পণ্যের ধরণ রয়েছে এবং গ্রাহকের একই সাথে একাধিক পণ্যের অর্ডার থাকতে পারে, সেই তিনটি অর্ডার টেবিলকে টেবিলের সাথে সম্পর্কিত করতে হবে Payments

অন্য সমস্যাটি হ'ল গ্রাহকের কেবলমাত্র এক ধরণের পণ্যের জন্য অর্ডার থাকতে পারে। সুতরাং, Paymentsটেবিলের এফকে কলামগুলি হওয়া দরকার nullable

আমার প্রশ্ন হ'ল সেই nullableএফকে কলামগুলি দীর্ঘকাল আমার জন্য মাথা ব্যথা হয়ে থাকবে কিনা ? সাধারণভাবে বলতে গেলে, কোনও টেবিলে এনারেল এফকে কলাম রাখা খারাপ অভ্যাস হিসাবে বিবেচিত হবে?


2
নিশ্চিত করুন আপনি একটি চেক বাধ্যতা তাই অন্তর্ভুক্ত করে অন্তত এক যারা FKs এর নয় নাল।
ড্যামিয়েন_এই_বিশ্বাসীরা

3
একটি অপ্রয়োজনীয় বিদেশী চাবি একটি খুব বেশি।
এনভিজেল

উত্তর:


13

আমি জিজ্ঞাসা করব কেন আপনার কাছে OrdersForProductXটেবিলগুলি রয়েছে
এটি সম্ভব যে এফকে সমস্যা সম্পর্কে আপনি জিজ্ঞাসা করেছেন তা নকশা করা যেতে পারে ...

এই টেবিলগুলির যদি একই কাঠামো থাকে তবে আপনার ProductTypeকিছু OrderProductটেবিলের জন্য কেবল কলামের প্রয়োজন । তারপরে Paymentকেবল একটি এফকে এর সাথে লিঙ্ক করুন

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

এটি "সুপারকি / সাব টাইপ প্যাটার্ন"

  • ইউকিউ 1 হ'ল সাব-টাইপ টেবিলগুলিতে একটি বিদেশী কী ব্যবহৃত "সুপার কী"
  • প্রতিটি সাব টাইপ টেবিলের একটি সমন্বিত পিকে এবং এফকে চালু থাকে (OrderID, ProductType)
  • প্রতিটি উপ টাইপ টেবিলের সেই টেবিলের ধরণের সীমাবদ্ধ করার জন্য একটি চেক বাধা রয়েছে

OrderProduct

  • অর্ডারআইডি, পিকে, ইউকিউ 1
  • প্রোডাক্টটাইপ, ইউকিউ 1
  • CommonThing1
  • ...

OrderProductA

  • অর্ডারআইডি, পিকে, এফকে
  • প্রোডাক্টটাইপ, পিকে, এফকে, চেক প্রোডাক্ট টাইপ = এ
  • ProductAThing1
  • ...

OrderProductB

  • অর্ডারআইডি, পিকে, এফকে
  • প্রোডাক্ট টাইপ, পিকে, এফকে, চেক প্রোডাক্ট টাইপ = বি
  • ProductBThing1
  • ...

4
@ টগবার্ক: লক্ষ্য করুন যে NULLএই পদ্ধতির সাথে আপনার কোনও এফকে কলাম নেই ।
ypercubeᵀᴹ

"এই টেবিলগুলির যদি একই কাঠামো থাকে" তাদের একই কাঠামো নেই।
tugberk

5

অযোগ্য "বিদেশী কী" এড়িয়ে চলুন। তাদের একাধিক অসুবিধা রয়েছে।

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

ডেটাবেস ডিজাইন সরঞ্জাম, ইন্টিগ্রেশন সরঞ্জাম এবং অন্যান্য সফ্টওয়্যার সর্বদা তাদের সঠিকভাবে সমর্থন করে না এবং তারা উত্পন্ন ফলাফলগুলি ভুল হতে পারে।

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

কোনও বিদেশী কী যখন নলাশয় হয় তখন কোয়েরির পুনরায় লেখাগুলি এবং অন্যান্য অপ্টিমাইজেশানগুলিকে মঞ্জুরি দেয় এমন কিছু ক্যোয়ারী অপ্টিমাইজেশান বৈশিষ্ট্য অনুপলব্ধ হতে পারে।

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

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


2

ন্যাবল এফকে কলামগুলি ব্যবহার করা খারাপ অভ্যাস হিসাবে বিবেচিত আমি কখনও শুনিনি। এগুলি একটি কলামের জন্য আদর্শ ফিট যা অন্য সারণির উল্লেখ করে তবে এটি পূরণ করা যায় না (যেমন এটি alচ্ছিক ডেটা)।

(কেন আপনি মনে করেন এটি সমস্যা হবে?)


ধন্যবাদ! ঠিক আছে, আমি এটি সম্পর্কে পুরোপুরি নিশ্চিত নই তবে আমার কয়েক বছর আগে আমার মতো একটি প্রকল্প হয়েছিল এবং আমি মনে করি যে কোনও কিছুতে আমার মাথাব্যথা ছিল । সুতরাং, আপনি দেখতে পাওয়ায় আমি পরিষ্কার নই: কেন আমি প্রশ্ন জিজ্ঞাসা করেছি s
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.