একটি ডাটাবেস ডিজাইনে বিদেশী কীগুলি কি সত্যিই প্রয়োজনীয়?


109

যতদূর আমি জানি, প্রোগ্রামারকে সঠিক উপায়ে হেরফের করতে বিদেশী কীগুলি (এফকে) ব্যবহার করা হয়। মনে করুন কোনও প্রোগ্রামার ইতিমধ্যে সঠিক পদ্ধতিতে এটি ইতিমধ্যে করছে, তাহলে আমাদের কী সত্যই বিদেশী কীগুলির ধারণাটি দরকার?

বিদেশী কীগুলির জন্য অন্য কোনও ব্যবহার রয়েছে? আমি কি এখানে কিছু মিস করছি?


2
এটি প্রায়শই প্রায় কাছাকাছি আসে। আমি জোয়েল স্পলস্কিকে দোষ দিচ্ছি :-)। এখানে অনেক ভাল উত্তর আছে; : বরং পুনরায় টাইপ করুন আমার চেয়ে, আমি শুধু আপনি একটি লিঙ্ক দেব stackoverflow.com/questions/83147/whats-wrong-with-foreign-keys
SquareCog

70
"মনে করুন কোনও প্রোগ্রামার ইতিমধ্যে এটি সঠিক পদ্ধতিতে ইতিমধ্যে করছে" - আমি এমন দৃশ্য কল্পনাও করতে পারি না।
পুনরাবৃত্তি

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

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

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

উত্তর:


102

বিদেশী কীগুলি ডেটা স্তরে রেফারেনশিয়াল অখণ্ডতা প্রয়োগ করতে সহায়তা করে। তারা কর্মক্ষমতাও উন্নত করে কারণ তারা সাধারণত ডিফল্ট অনুসারে সূচিযুক্ত হয়।


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

7
এটি একটি ভয়াবহ উত্তর FKs জেনারিকভাবে অতিরিক্ত ওভারহেড যুক্ত করতে পারে কর্মক্ষমতা উন্নত করে না।
চটপটে জেদী

এসকিউএল-সার্ভারে, তারা রেফারি বা রেফারকারী উভয়ই ডিফল্টরূপে সূচিযুক্ত হয় না। sqlskills.com/blogs/kimberly/…
user420667

1
না ওরাকলে; আপনাকে নিজে সূচকগুলি তৈরি করতে হবে (এফকে কলামগুলিতে)।
লিটলফুট

58

বিদেশী কীগুলি প্রোগ্রামারকে এই জাতীয় জিনিস ব্যবহার করে কম কোড লিখতে সহায়তা করতে পারে ON DELETE CASCADE। এর অর্থ হ'ল যদি আপনার একটি টেবিল ব্যবহারকারী থাকে এবং অন্যটিতে অর্ডার বা কিছু থাকে তবে কোনও ব্যবহারকারী মুছে ফেলা হলে সেই ব্যবহারকারীর নির্দেশিত সমস্ত আদেশ স্বয়ংক্রিয়ভাবে মুছতে পারে।


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

8
যদিও এটি সম্ভবত ব্যবসায়ের লজিক লেয়ারে পরিচালনা করা উচিত। সম্পর্কিত শিশুদের রেকর্ড রাখতে হবে কি না তা সিদ্ধান্ত নেওয়া কোনও মানই বিদেশী মূল সম্পর্কের লঙ্ঘন না করে তা নিশ্চিত করার মতো নয়।
কোডওয়ার্কস

5
অন্য সমস্যাটি নিরীক্ষণ করছে, ডিবি স্তরে যদি অডিটিং না করা হয় তবে ক্যাসকেডিং আপডেটগুলি বা মোছাগুলি আপনার নিরীক্ষার ট্রেইলটিকে অবৈধ করে দেবে।
si618

@ কোডওয়ার্কস: ব্যবসায়ের যুক্তি ডিবিতে থাকতে পারে।
ফ্যানটিয়াস

44

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

তারা প্রয়োজন হয় না , কঠোরভাবে বলতে, কিন্তু সুবিধাগুলি বিশাল।

আমি মোটামুটি নিশ্চিত যে ফোগবগজের ডাটাবেসে বিদেশী কী বাধা নেই। আমি শুনতে আগ্রহী যে ফোগ ক্রিক সফ্টওয়্যার টিম তাদের কোডটি কীভাবে গ্যারান্টি দিয়ে দেয় যে তারা কখনই কোনও অসঙ্গতি প্রবর্তন করবে না।


43
জোয়েল: "এখনও পর্যন্ত আমাদের কখনও সমস্যা হয়নি।" এখনও অবধি আমি কখনই ল্যাম্প পোস্টে প্রবেশ করি নি। তবে আমি এখনও মনে করি যে এটির বেল্ট পরা ভাল ধারণা ;-)
টনি অ্যান্ড্রুজ

2
আপনার সমস্যাটি কখনও দেখা যায় না, তবে এটি সেখানেই থাকতে পারে ... বেশিরভাগ ডাটাবেস আইডি_এক্সএক্সএক্সএক্স এর মত একটি কনভেনশন ব্যবহার করে যা আইএক্সএক্সএক্সএক্স
ফেরানবি

1
@ জোয়েল: বিধি প্রয়োগের জায়গায় নামকরণের নামকরণ? আপনি যখন থাকবেন তখন ধরণের কাজটিও করতে পারেন।
jcollum

8
@ এরিক: আপনি এখানে সফটওয়্যার বিকাশের অবতার হিসাবে ফোগ ক্রিক ধরে রেখেছেন। আপনি যদি বলেছিলেন যে "নিউইয়র্ক সিটির একটি সংস্থার কাছে তাদের ডিবিতে বিদেশী চাবি নেই ..." আমরা সকলেই "এবং" বলব?
jcollum

3
এরিক: ফোগবুগ বিদেশী কীগুলির জন্য একটি নামকরণের সম্মেলন ব্যবহার করে। উদাহরণস্বরূপ, ixBug কে টেবিল বাগের প্রাথমিক কীতে সূচি হিসাবে বোঝা যায়। এখনও পর্যন্ত আমাদের কখনও সমস্যা হয়নি। - জোয়েল স্পলস্কি
স্যাম জাফরান

40

এফকে সীমাবদ্ধতা ছাড়াই একটি ডাটাবেস স্কিমা সিট বেল্ট ছাড়াই গাড়ি চালানোর মতো।

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

আপনি কি আপনার আবেদনে এমন কোডটি গ্রহণ করবেন যা opালু ছিল? এটি সরাসরি সদস্য অবজেক্টগুলিতে অ্যাক্সেস করে এবং সরাসরি ডেটা স্ট্রাকচারকে পরিবর্তন করে।

আপনি কেন ভাবেন যে আধুনিক ভাষাগুলির মধ্যে এটিকে কঠোর এবং এমনকি অগ্রহণযোগ্য করা হয়েছে?


2
এনক্যাপসুলেশন এবং এফকে / পিকে সম্পর্কের মধ্যে ভাল উপমা করার জন্য +1।
jcollum

21

হ্যাঁ.

  1. তারা আপনাকে সৎ রাখে
  2. তারা নতুন বিকাশকারীদের সৎ রাখে
  3. আপনি করতে পারেন ON DELETE CASCADE
  4. তারা আপনাকে সুন্দর ডায়াগ্রাম তৈরি করতে সহায়তা করে যা টেবিলের মধ্যে লিঙ্কগুলি স্বতঃ ব্যাখ্যা করে

1
সততা বলতে কী বোঝ?
dspacejs

আমি ধারণা অনুমান সঙ্গে সৎ। এটি আপনাকে দ্রুত এবং খোঁড়া প্রোগ্রামিং করে ডেটা দিয়ে প্রতারণা করা থেকে বিরত রাখে।
ওরেস্টে ভিরন

13

মনে করুন কোনও প্রোগ্রামার ইতিমধ্যে এটি সঠিক পদ্ধতিতে করছে

এ জাতীয় অনুমান করা আমার কাছে অত্যন্ত খারাপ ধারণা বলে মনে হচ্ছে; সাধারণ সফ্টওয়্যারটি অত্যন্ত বিস্ময়কর।

এবং এটি সত্য, সত্য। বিকাশকারীরা জিনিসগুলি সঠিকভাবে পেতে পারে না, সুতরাং ডেটাবেসগুলি খারাপ ডেটা দিয়ে পূরণ করা যায় না তা নিশ্চিতকরণ একটি ভাল কাজ।

যদিও একটি আদর্শ বিশ্বে প্রাকৃতিক যোগদানগুলি কলামের নামের সাথে মিলের চেয়ে সম্পর্কের (অর্থাত্ এফকে বাধা) ব্যবহার করবে। এটি এফকে আরও কার্যকর করে তুলবে।


2
ভাল কথা, "ওএন [সম্পর্ক]" বা অন্য কোনও কীওয়ার্ড সহ দুটি সারণিতে যোগদান করা ভাল এবং ডিবিটি কী কলামগুলি জড়িত তা খুঁজে বের করার জন্য ভাল লাগবে। সত্যিই বেশ যুক্তিসঙ্গত বলে মনে হচ্ছে।
jcollum

13

ব্যক্তিগতভাবে, আমি বিদেশী কীগুলির পক্ষে, কারণ এটি টেবিলগুলির মধ্যে সম্পর্কটিকে আনুষ্ঠানিক করে। আমি বুঝতে পেরেছি যে আপনার প্রশ্নটি অনুমান করে যে প্রোগ্রামার রেফারেনশিয়াল অখণ্ডতা লঙ্ঘন করবে এমন ডেটা প্রবর্তন করছে না, তবে আমি সর্বোত্তম উদ্দেশ্য সত্ত্বেও ডেটা রেফারেন্সিয়াল অখণ্ডতা লঙ্ঘনকারী এমন অনেকগুলি উদাহরণ দেখেছি!

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

@ জন - অন্যান্য ডাটাবেসগুলি স্বয়ংক্রিয়ভাবে বিদেশী কীগুলির জন্য সূচী তৈরি করতে পারে, তবে এসকিউএল সার্ভার তা করে না। এসকিউএল সার্ভারে, বিদেশী কী সম্পর্কগুলি কেবলমাত্র বাধা। আপনাকে অবশ্যই বিদেশী কীগুলিতে আপনার সূচকটি পৃথকভাবে সংজ্ঞায়িত করতে হবে (যা উপকারী হতে পারে))

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


9

বিদেশী কী ছাড়া আপনি কীভাবে বলবেন যে বিভিন্ন টেবিলের দুটি রেকর্ড সম্পর্কিত?

আমি মনে করি আপনি যা উল্লেখ করছেন তা হ'ল রেফারেনশিয়াল অখণ্ডতা, যেখানে বিদ্যমান প্যারেন্ট রেকর্ড ব্যতীত শিশু রেকর্ড তৈরি করার অনুমতি নেই These এগুলি প্রায়শই বিদেশী মূল সীমাবদ্ধতা হিসাবে পরিচিত but তবে বিদেশী কীগুলির অস্তিত্ব নিয়ে বিভ্রান্ত হওয়ার দরকার নেই প্রথম স্থান.


8

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


8

আমি মনে করি আপনি ডাটাবেস দ্বারা প্রয়োগ করা বিদেশী কী বাধা সম্পর্কে কথা বলছেন । আপনি সম্ভবত ইতিমধ্যে বিদেশী কী ব্যবহার করছেন, আপনি কেবল এটি সম্পর্কে ডাটাবেসটি বলেননি।

মনে করুন কোনও প্রোগ্রামার ইতিমধ্যে সঠিক পদ্ধতিতে এটি ইতিমধ্যে করছে, তাহলে আমাদের কী সত্যই বিদেশী কীগুলির ধারণাটি দরকার?

তাত্ত্বিকভাবে, না। যাইহোক, বাগ ছাড়া কোনও সফ্টওয়্যার কখনও পাওয়া যায় নি।

অ্যাপ্লিকেশন কোডের বাগগুলি সাধারণত বিপজ্জনক নয় - আপনি ত্রুটিটি সনাক্ত করে এটি ঠিক করে দিন এবং তারপরে অ্যাপ্লিকেশনটি আবার সুচারুভাবে চলে। তবে কোনও বাগ যদি কর্কট ডেটা ডাটাবেসে প্রবেশের অনুমতি দেয় তবে আপনি এটির সাথে আটকে থাকেন! ডাটাবেসে দুর্নীতিগ্রস্থ তথ্য থেকে পুনরুদ্ধার করা খুব কঠিন।

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

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

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

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


7

এফকে খুব গুরুত্বপূর্ণ এবং আপনি ইবে না হলে আপনার স্কিমাতে সর্বদা উপস্থিত থাকা উচিত ।


2
সেই লিঙ্কটি আসলে অত্যন্ত চিত্তাকর্ষক ... আমি আরও বিশদ জানতে সত্যই চাই এবং এখন ইবে ব্যবহার করতে কিছুটা ভয় পেয়েছি। অন্যান্য লোকের জন্য: তাদের ডিবি কাঠামোর বিষয়ে তিনি কী বলেন তা দেখতে চতুর্থ প্রশ্নে ক্লিক করুন। পুরো সাক্ষাত্কারটি দেখার মতো, যদিও। এছাড়াও ...unibrow
gloomy.penguin

6

আমি মনে করি যে কোনও একক জিনিসকে বৈধ সম্পর্ক নিশ্চিত করার জন্য অবশ্যই দায়বদ্ধ হতে হবে।

উদাহরণস্বরূপ, রুবেল অন রেল বিদেশী কী ব্যবহার করে না, তবে এটি সমস্ত সম্পর্ককেই বৈধতা দেয়। যদি আপনি কেবল সেই রুবি অন রেল অ্যাপ্লিকেশন থেকে আপনার ডেটাবেস অ্যাক্সেস করেন তবে এটি ঠিক আছে।

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

এই মুহুর্তে, বিদেশী কীগুলি সত্যই প্রয়োজনীয়, কারণ তারা আপনাকে দায়িত্বটি আবার একটি পয়েন্টে স্থানান্তর করতে দেয়।


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

5

বিদেশী কী আপনাকে টেবিলে সম্পর্ক নির্ধারণ করার আগে আপনার ডাটাবেসটি না দেখে এমন কাউকে মঞ্জুরি দেয়।

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

বিদেশী কীগুলি তাদের কয়েক হাজার লাইনের কোডের মাধ্যমে ট্রলিং না করে ডাটাবেস কাঠামো বুঝতে দেয়।


5

যতদূর আমি জানি, বিদেশী কীগুলি প্রোগ্রামারকে সঠিক উপায়ে ডেটা ম্যানিপুলেট করতে সহায়তা করার জন্য ব্যবহৃত হয়।

প্রোগ্রামার যখন এটি করতে ব্যর্থ হয় এবং কখনও কখনও প্রোগ্রামারদের ফ্যাম্বলিং থেকে রক্ষা করে, তখন এফকে হ'ল ডিবিএ ব্যবহারকারীদের ভ্রষ্টতা থেকে ডেটা অখণ্ডতা রক্ষা করতে দেয় ।

মনে করুন কোনও প্রোগ্রামার ইতিমধ্যে সঠিক পদ্ধতিতে এটি ইতিমধ্যে করছে, তাহলে আমাদের কী সত্যই বিদেশী কীগুলির ধারণাটি দরকার?

প্রোগ্রামাররা মারাত্মক এবং পতনীয়। এফকে হ'ল ঘোষণামূলক, যা তাদের স্ক্রু করা শক্ত করে তোলে।

বিদেশী কীগুলির জন্য অন্য কোনও ব্যবহার রয়েছে? আমি কি এখানে কিছু মিস করছি?

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


এটি একটি দুর্দান্ত উত্তর।
ড্যান লাগেজ

4

এগুলি কড়াভাবে প্রয়োজনীয় নয়, যেভাবে সিটবেল্টগুলি কঠোরভাবে প্রয়োজনীয় নয়। কিন্তু তারা আপনাকে সত্যিই মূ .় কিছু করার থেকে বাঁচাতে পারে যা আপনার ডাটাবেসকে বিশৃঙ্খলা করে।

আপনার অ্যাপ্লিকেশনটি ভেঙে এমন একটি মোছার পুনর্গঠন করার চেয়ে এফকে সীমাবদ্ধতা ত্রুটিটি ডিবাগ করা এত সুন্দর।


4

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


3

আমি খরচ / বেনিফিট ... ইন পরিপ্রেক্ষিতে এটা আমার মনে হয় মাইএসকিউএল , একটি বাধ্যতা যোগ করার একটি একক অতিরিক্ত লাইন DDL । এটি কেবল কয়েকটি মুখ্য শব্দ এবং কয়েক সেকেন্ডের চিন্তাভাবনা। আমার মতে এটিই "ব্যয়" ...

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

আপনি যখন জিনিসগুলি একসাথে রাখছেন তখন আপনার মাথার মধ্যে যা রয়েছে তা কোড করার জন্য অল্প সময়ই আপনাকে বা অন্য কাউকে বাঁচাতে পারে কয়েক মাস বা কয়েক বছর ধরে রাস্তায়।

প্রশ্নটি:

বিদেশী কীগুলির জন্য অন্য কোনও ব্যবহার রয়েছে? আমি কি এখানে কিছু মিস করছি?

এটি কিছুটা বোঝা। "বিদেশী কী" এর জায়গায় মন্তব্য, ইনডেন্টেশন বা ভেরিয়েবল নামকরণ সন্নিবেশ করান ... আপনি যদি ইতিমধ্যে প্রশ্নে জিনিসটিকে পুরোপুরি বুঝতে পারছেন তবে এটি আপনার কোনও "ব্যবহার নয়"।


2

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

যখন আমরা উদাহরণস্বরূপ একটি অনুমান করি: প্রতিটি অর্ডারের একটি গ্রাহক রয়েছে যে অনুমানটি কোনও কিছুর দ্বারা প্রয়োগ করা উচিত । ডাটাবেসে "কিছু" হ'ল বিদেশী কী।

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

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


1

আপনি বিদেশী কীগুলি সীমাবদ্ধতা হিসাবে দেখতে পারেন যে,

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

1

আমরা বর্তমানে বিদেশী কী ব্যবহার করি না। এবং বেশিরভাগ অংশের জন্য আমরা এটির জন্য আফসোস করি না।

এটি বলেছিল - আমরা সম্ভবত একই কারণে এগুলি উভয় কারণে বিভিন্ন কারণে অদূর ভবিষ্যতে তাদের আরও অনেক বেশি ব্যবহার শুরু করব:

  1. ডায়াগ্রামিং। বিদেশী কী সম্পর্কগুলি সঠিকভাবে ব্যবহৃত হলে কোনও ডাটাবেসের ডায়াগ্রাম তৈরি করা এত সহজ।

  2. সরঞ্জাম সমর্থন। ভিজুয়াল স্টুডিও ২০০৮ ব্যবহার করে ডেটা মডেলগুলি তৈরি করা অনেক সহজ যা লিনকিউ থেকে এসকিউএল- এর জন্য উপযুক্ত বিদেশী কী সম্পর্ক থাকলে ব্যবহার করা যেতে পারে ।

সুতরাং আমি অনুমান করি আমার বক্তব্যটি হ'ল আমরা খুঁজে পেয়েছি যে আমরা যদি অনেকগুলি ম্যানুয়াল এসকিউএল কাজ করে যাচ্ছি (ক্যোয়ারী বানান, ক্যোয়ারী চালান, ব্লাহাব্লাহাব্লাহ) বিদেশী কীগুলি প্রয়োজনীয় অপরিহার্য নয়। একবার আপনি সরঞ্জামগুলি ব্যবহার শুরু করলে, সেগুলি অনেক বেশি দরকারী হয়ে ওঠে।


1
আমি এমন সিস্টেমে কাজ করি যা সেগুলি ব্যবহার করে না। এবং আমি এটি নিয়মিত অনুশোচনা। আমি আরও উদাহরণ দেখেছি যে আমি অ-সংবেদনশীল ডেটা গণনা করতে পারি যা সঠিক বাধা দ্বারা প্রতিরোধ করা যেতে পারে।
পুনরাবৃত্তির

এবং প্রায় ছয় মাস ধরে আমাদের বর্তমান প্রকল্পে বিদেশী কীগুলির সাথে কাজ করার পরে, আমি এই মন্তব্যের সাথে পুরোপুরি একমত।
জন ক্রিস্টেনসেন

1

বিদেশী কী বাধা (এবং সাধারণভাবে সীমাবদ্ধতাগুলি) সম্পর্কে সর্বোত্তম জিনিস হ'ল আপনার প্রশ্নগুলি লেখার সময় আপনি তাদের উপর নির্ভর করতে পারেন। আপনি যদি সত্য "সত্য" ধারণ করে ডেটা মডেলের উপর নির্ভর করতে না পারেন তবে অনেকগুলি প্রশ্ন অনেক বেশি জটিল হয়ে উঠতে পারে।

কোডে, আমরা সাধারণত কোথাও ছুঁড়ে দেওয়া একটি ব্যতিক্রম পাব - তবে এসকিউএলে আমরা সাধারণত "ভুল" উত্তর পেয়ে যাব।

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


স্বতন্ত্রতা সীমাবদ্ধতাগুলি উচ্চ কার্ডিনালিটি নির্দেশ করে যা একটি যোগদানের প্রক্রিয়া নির্বাচন করতে অপটিমাইজার দ্বারা ব্যবহৃত হয়।
পিটার জিতলেন

1

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

তবে সর্বদা নামকরণ কলামগুলির একধরণের কনভেনশন ছিল যা বিদেশী কী ছিল।

এটি ডাটাবেস সাধারণকরণের মতো - আপনাকে জানতে হবে আপনি কী করছেন এবং এর পরিণতি কী (মূলত সম্পাদন)।

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

এছাড়াও বিভিন্ন ডাটাবেস ইঞ্জিনগুলি বিদেশী কীগুলি বিভিন্ন উপায়ে পরিবেশন করতে পারে, যা মাইগ্রেশনের সময় সূক্ষ্ম বাগগুলি নিয়ে যেতে পারে।

ডিলিট ক্যাসকেড দিয়ে মুছে ফেলা ক্লায়েন্টের সমস্ত অর্ডার এবং চালানের অপসারণ হ'ল সুন্দর দেখাচ্ছে, তবে ভুল নকশাকৃত, ডাটাবেস স্কিমার নিখুঁত উদাহরণ।


0

হ্যাঁ. অপসারণ [নিষিদ্ধ | ক্যাসকেড] ডেটা পরিষ্কার রাখার মাধ্যমে ডেভেলপারদের ডেটা স্ট্র্যান্ডিং থেকে রক্ষা করে। আমি সম্প্রতি রেল বিকাশকারীদের একটি দলে যোগদান করেছি যারা বিদেশী কীগুলির মতো ডাটাবেসের সীমাবদ্ধতার দিকে মনোনিবেশ করেনি।

ভাগ্যক্রমে, আমি এগুলি পেয়েছি: http://www.redhillonrails.org/foreign_key_associations.html - কনফিগারেশন শৈলীতে কনভেনশনটি ব্যবহার করে রেইল প্লাগইনগুলিতে রুবি অন রেডহিল বিদেশী কী উত্পন্ন করে । সঙ্গে একটি মাইগ্রেশন PRODUCT_ID করার জন্য একটি বিদেশী কী তৈরি করবে আইডি মধ্যে পণ্য টেবিল।

লেনদেনে মোড়ানো মাইগ্রেশন সহ রেডহিলের অন্যান্য দুর্দান্ত প্লাগইনগুলি দেখুন ।


0

যদি আপনি আপনার ডেটা অ্যাক্সেস কোড তৈরি করার পরিকল্পনা করেন, যেমন, সত্তা ফ্রেমওয়ার্ক বা অন্য কোনও ওআরএম আপনি সম্পূর্ণ বিদেশী কীগুলি ছাড়াই একটি শ্রেণিবদ্ধ মডেল তৈরির ক্ষমতা হারাবেন

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