কোনও টেবিল কেন তার নিজস্ব কীটিকে বিদেশী কী হিসাবে ব্যবহার করবে


21

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

আমি দেখেছি একটি শ্রেণিবদ্ধ কাঠামো তৈরি করতে একটি টেবিলের নিজের কাছে একটি বিদেশী কী থাকতে পারে তবে এটি প্রাথমিক কীটি উল্লেখ করতে অন্য কলাম ব্যবহার করবে।

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

এটি করার কোনও কারণ আছে কি?

টেবিল নিজেই যোগদান

আমি নিশ্চিত যে সীমাবদ্ধতা সেভাবে লেখা হয়েছে (কেবল চিত্রের দিকে না তাকিয়ে) কারণ একই টেবিল এবং কলামটি সংজ্ঞাটির উভয় অংশের জন্য ব্যবহৃত হয়।


6
সম্ভবত ডিজাইনারের ক্যাক হ্যান্ড ব্যবহারের মাধ্যমে আমার তত্ত্বটি রয়েছে
মার্টিন স্মিথ

উত্তর:


28

যেমনটা তুমি বলেছিলে. FOREIGN KEYএকই টেবিলটি উল্লেখ করা একটি সীমাবদ্ধতা সাধারণত শ্রেণিবদ্ধ কাঠামোর জন্য এবং এটি প্রাথমিক কীটি উল্লেখ করতে অন্য কলাম ব্যবহার করবে। একটি ভাল উদাহরণ কর্মীদের একটি টেবিল:

EmployeeId    Int     Primary Key
EmployeeName  String
ManagerId     Int     Foreign key going back to the EmployeeId

সুতরাং এক্ষেত্রে টেবিল থেকে নিজের কাছে ফিরে আসার জন্য একটি বিদেশী কী রয়েছে। সমস্ত পরিচালকরাও কর্মচারী তাই ManagerIdপ্রকৃতপক্ষে EmployeeIdপরিচালকটি the

এখন অন্যদিকে যদি আপনি বোঝাচ্ছেন যে কেউ EmployeeIdকর্মীর টেবিলে ফিরে বিদেশী কী হিসাবে ব্যবহার করেছে তবে এটি সম্ভবত একটি ভুল ছিল । আমি একটি পরীক্ষা চালিয়েছি এবং এটি সম্ভব তবে এটির আসল ব্যবহার হবে না।

CREATE TABLE Employee (EmployeeId Int PRIMARY KEY,
                        EmployeeName varchar(50),
                        ManagerId Int);


ALTER TABLE Employee ADD CONSTRAINT fk_employee 
    FOREIGN KEY (EmployeeId) REFERENCES Employee(EmployeeId);

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

6

আমি কেবলমাত্র আমার নিজস্ব ডিবিতে এই জাতীয় বিদেশী কী খুঁজে পেয়েছি এবং এটি অবশ্যই এটি তৈরি করা হয়েছিল। আমি মনে করি এটি ঠিক দুর্ঘটনার দ্বারা ঘটেছে। যদি আমি প্রাইমারি কী (ম্যানেজমেন্ট স্টুডিও, এসকিউএল 2014 এক্সপ্রেস) সহ একটি সারণীর প্রসঙ্গ মেনুতে "নতুন বিদেশী কী" তে ক্লিক করি তবে এটি ইতিমধ্যে স্বয়ংক্রিয়ভাবে নিজেকে উল্লেখ করে এমন বিদেশী কী তৈরি করে। নিচে দেখ:

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

আমি যদি তখন বুঝতে না পারি যে একটি নতুন যুক্ত করার পরিবর্তে আমার এটি পরিবর্তন করা উচিত তবে এটি সেখানেই থাকবে। অথবা, যদি আমি কেবল [ক্লোজ] বোতামটি ক্লিক করি যার অর্থ এটি একটি [বাতিল করুন] এর মতো হবে, সারণির সংজ্ঞাটি সংরক্ষণ করার পরেও বিদেশী কী তৈরি করা হবে।

সুতরাং, আমার কাছে এ জাতীয় বৈদেশিক কী কোনও অর্থবোধ করে না এবং মুছে ফেলা যায়।


এটা সম্ভব যে আপনি কোনও এফকে তৈরি করতে চেয়েছিলেন এবং প্রক্রিয়াটিতে আপনি বুঝতে পেরেছেন যে অন্য টেবিলটি এখনও তার পিকে সেট করেনি যাতে আপনি বাতিল করেন, অন্য টেবিলে যান এবং তারপরে কোনও কারণে আপনি এফকে প্রক্রিয়া চালিয়ে যেতে ভুলে যান। সেখানে আপনার পুনরাবৃত্তিকারী এফকে আছে।
অ্যান্ড্রু

4

সম্ভবত ডিজাইনার এর ব্যবহার নিষ্ক্রিয় করতে চেয়েছিলেন TRUNCATE TABLE?

TRUNCATE TABLEঅন্য টেবিলে বিদেশী কী বাধা থাকা কোনও টেবিলে ব্যবহার করা যাবে না যদিও স্ব-রেফারেন্সিয়াল বিদেশী কী থাকলে এটি ব্যবহার করা যেতে পারে । ট্র্যাঙ্কেট টেবিল (লেনদেন-এসকিউএল) এর জন্য ডকুমেন্টেশন থেকে :

বিএল এক্সট্র্যাক্ট

একটি DELETEএকটি ছাড়া বিবৃতি WHEREদফা একটি অনুরূপ একটি প্রভাব রয়েছে TRUNCATE TABLE(সারণিতে সব সারি সরানোর) কিন্তু DELETEবিবৃতি মুছুন ট্রিগার, যা করার জন্য একটি কারণ হতে পারে আগুন DELETEকিন্তু TRUNCATE TABLE

আমি অনুমতি ব্যবহার করে এটি করবো (অনুমতি DELETEমুছতে TRUNCATE TABLEপ্রয়োজন, পরিবর্তনের টেবিলের অনুমতি প্রয়োজন), তবে ডিজাইনার এটি করতে না পারার কোনও কারণ থাকতে পারে?

দ্রষ্টব্য: যদিও ডিজাইনার যা করেছে তা বাস্তবে ব্যবহারকে অক্ষম করে না TRUNCATE TABLE, আমি এখনও অনুমান করছি যে এটি তাদের উদ্দেশ্য ছিল।

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