বিদেশী কীটি কী কী প্রাথমিক কী হিসাবে রাখা ভাল?


107

আমার দুটি টেবিল রয়েছে:

  • ব্যবহারকারী (ব্যবহারকারীর নাম, পাসওয়ার্ড)
  • প্রোফাইল (প্রোফাইল আইড, লিঙ্গ, তারিখ জন্ম, ...)

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

আমি আমার বন্ধুর পরামর্শে বিভ্রান্ত হয়েছি: "ইউজারআইডি" ক্ষেত্রটি বিদেশী এবং প্রাথমিক কী হিসাবে এবং "প্রোফাইলআইডি" ক্ষেত্রটি মুছতে। কোন পদ্ধতির ভাল?


4
সত্তা ফ্রেমওয়ার্ক জিরোআরওনে (এবং একটি) - এক সম্পর্কের জন্য (কোডটির সাথে প্রথমে) উত্পন্ন করে। সুতরাং ... এটা সম্ভব। এটি কি সেরা উপায় ... এটি অন্য একটি প্রশ্ন। তবে এটি বৈধ। নিজের ডেটাবেস তৈরি করার সময় আমি কখনই তা করি নি (তবে আমি এটি কখনও ভাবিওনি)।
রাফাল আলথাউস

উত্তর:


137

বিদেশী কীগুলি প্রায়শই "ডুপ্লিকেটকে মঞ্জুর করুন" থাকে যা এগুলি প্রাথমিক কী হিসাবে অনুপযুক্ত করে তুলবে।

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

এর একমাত্র ব্যতিক্রম হ'ল এক-এক সম্পর্কের টেবিলগুলি যেখানে লিঙ্কযুক্ত টেবিলের বিদেশী কী এবং প্রাথমিক কী এক এবং একই।


76
দুটি বৈদেশিক কী সমন্বিত একটি যৌগিক প্রাথমিক কীটি বহু-থেকে-বহু সম্পর্ক বাস্তবায়নের জন্যও পুরোপুরি সূক্ষ্ম।
ডানফোল্ড

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

4
বিদেশী কী সম্পর্কে কিছুই হুকুম দেয় না যে এটি অনেকের কাছে 1 (বা লিখিত হিসাবে "নকলকে অনুমতি দিন")। মূল সীমাবদ্ধতা এবং স্বতন্ত্রতা একটি ডাটাবেসে দুটি পৃথক ধারণা এবং সহজেই খুব সহজে মিশ্রিত করা যায় ঠিক তত সহজে একটি সূচক যুক্ত করার সাথে (যা তৃতীয় পৃথক ধারণা হবে)।
অন্ধচুক্তি

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

42

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


11

হ্যাঁ, একটি প্রাথমিক কী বৈদেশিক কী থাকা বৈধ is এটি বিরল নির্মাণ, তবে এটি এর জন্য প্রযোজ্য:

  • একটি 1: 1 সম্পর্ক। দুটি সারণী একের সাথে একত্রীকরণ করা যাবে না কারণ বিভিন্ন অনুমতি এবং সুবিধাগুলি কেবলমাত্র টেবিল স্তরে প্রয়োগ হয় (২০১৩ হিসাবে, এই জাতীয় ডাটাবেসটি বিজোড় হবে)।

  • a 1: 0..1 সম্পর্ক। ব্যবহারকারীর ধরণের উপর নির্ভর করে প্রোফাইল উপস্থিত থাকতে পারে বা নাও থাকতে পারে।

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


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

4

একে অপরের মধ্যে সম্পর্ক স্থাপন করা সাধারণত খারাপ অভ্যাস হিসাবে বিবেচিত হয়। এটি কারণ আপনি কেবল একটি টেবিলে ডেটা উপস্থাপন করতে পারেন এবং একই ফলাফল অর্জন করতে পারেন।

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

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


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

4
@ টেডি অনুরূপভাবে আমি যা বলেছি তাতে বেশিরভাগ ক্ষেত্রেই আমি একমত। তবে, মূল প্রশ্নে তারা বলেছে "... তার প্রোফাইল রেকর্ডটি স্বয়ংক্রিয়ভাবে তৈরি হয়ে গেছে ..." বোঝানো হচ্ছে যে প্রোফাইল সারণী .চ্ছিক নয়। এমন একটি পরিস্থিতিতে যেখানে প্রোফাইল টেবিলটি alচ্ছিক ছিল তবে হ্যাঁ এটি পৃথক টেবিল হিসাবে রাখা কার্যকর। তবে তারপরে, তারা একই টেবিলে কেবলমাত্র কলামগুলি ব্যবহার করতে পারে।
Tshsmith

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

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

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

4

হ্যাঁ, এই টেবিলগুলির মধ্যে একের মধ্যে সম্পর্কের ক্ষেত্রে একটি বিদেশী কী প্রাথমিক কী হতে পারে


4
এটি সুপার টাইপ-সাব-টাইপ ডিজাইনের জন্যও দরকারী। সাব-টাইপ টেবিলগুলির প্রাথমিক কীটি সুপার টাইপের সারণীতে বিদেশী কী উল্লেখ হওয়া উচিত।
axelioo

2

আমি সেটা করতাম না. আমি profileIDটেবিলের প্রাথমিক কী হিসাবে রাখবProfile

একটি বিদেশী কী দুটি টেবিলের মধ্যে কেবল একটি রেফারেন্সিয়াল সীমাবদ্ধতা

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

http://www.aisintl.com/case/primary_and_foreign_key.html


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

1

এটি ব্যবসা এবং সিস্টেমের উপর নির্ভর করে।

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


0

সংক্ষিপ্ত উত্তর: ডিপেন্ডস .... এই বিশেষ ক্ষেত্রে এটি ঠিক আছে। তবে বিশেষজ্ঞরা প্রায় প্রতিবারই এর বিরুদ্ধে সুপারিশ করবেন; আপনার মামলা সহ।

কেন?

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

আমি ডিবি বিশেষজ্ঞ নই, তবে আপনি যদি আপনার পিকে হিসাবে স্বয়ংক্রিয়ভাবে উত্পন্ন মানটি যুক্তিযুক্তভাবে প্রমাণ করতে পারেন তবে আমি তা করব। যদি এটি ব্যবহারিক না হয়, তবে দু'জনের (বা আরও বেশি) এফকে আপনার পিকে হিসাবে পরিবেশন করতে পারে। কিন্তু, আমি এমন কোনও ক্ষেত্রেই ভাবতে পারি না যেখানে একক এফকে মানটিকে পিকে হিসাবে ন্যায়সঙ্গত করা যায়।

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