বিদেশী কী একাধিক টেবিল জুড়ে প্রাথমিক কীগুলি উল্লেখ করে?


92

আমার কাছে ডাটাবেস কর্মীদের অধীনে কর্মচারী_স এবং কর্মচারী_এসএন নামে দুটি টেবিল রয়েছে।

তাদের উভয়েরই স্ব স্ব অনন্য প্রাথমিক কী কলাম রয়েছে।

আমার কাছে ছাড়ের নামক আরও একটি সারণী রয়েছে, যার বিদেশী কী কলামটি আমি কর্মচারীদের প্রাথমিক কীগুলি এবং সেই সাথে কর্মচারীদের_এসএন উল্লেখ করতে চাই। এটা কি সম্ভব?

উদাহরণ স্বরূপ

employees_ce
--------------
empid   name
khce1   prince

employees_sn
----------------
empid   name
khsn1   princess

তাহলে কি এটা সম্ভব?

deductions
--------------
id      name
khce1   gold
khsn1   silver

উত্তর:


99

ধরে নিলাম যে আমি আপনার দৃশ্যপটটি সঠিকভাবে বুঝতে পেরেছি, এটি হ'ল এটি করার জন্য আমি সঠিক উপায়ে ডাকব :

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

তারপর আপনি তিন টেবিল এই উচ্চ স্তরের বর্ণনা অনুবাদ করুন: employees, employees_ceএবং employees_sn:

  • employees(id, name)
  • employees_ce(id, ce-specific stuff)
  • employees_sn(id, sn-specific stuff)

যেহেতু সমস্ত কর্মচারী কর্মচারী (দুহ!), তাই প্রতিটি কর্মচারীর employeesটেবিলে একটি সারি থাকবে । "সিই" কর্মচারীদেরও employees_ceটেবিলে একটি সারি থাকে এবং টেবিলে "স্নে" কর্মচারীদেরও সারি থাকে employees_snemployees_ce.idকরার জন্য একটি বিদেশী চাবিকাঠি employees.idঠিক যেমন, employees_sn.idহয়।

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


17
আপনি সিআর এবং এসএন কে পারস্পরিক একচেটিয়াভাবে কীভাবে তৈরি করবেন? যেহেতু কোনও কর্মচারী একই সাথে সিআর এবং এসএন হতে পারে না তাই এটি ডাটাবেসে প্রতিফলিত করা ভাল অনুশীলন হবে। আমার এখনই এই সমস্যা হচ্ছে।
রল্ফ

আমি মনে করি একাধিক কলাম কীগুলি আমার আগের মন্তব্যে সমস্যার সাথে সহায়তা করতে পারে ... এখনই এটি সন্ধান করা।
রল্ফ

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

পরীক্ষা করে দেখুন এই উত্তরটি সম্পূর্ণ ব্যাখ্যা এবং বাস্তবায়ন বিস্তারিত জানার জন্য।
পারফরম্যান্সডিবিএ 21

কোনও নির্দিষ্ট আইডি সহ কোনও কর্মচারী কীভাবে জানবেন 'সে' বা 'এসএন'?
mhrsalehi

22

আপনি সম্ভবত দুটি বিদেশী কী বাধা যুক্ত করতে পারেন (সত্য: আমি এটি চেষ্টা করিনি), তবে এটি উভয় টেবিলে পিতৃ সারির উপস্থিতি জোর চাইবে।

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

                 employee       
employees_ce     ————————       employees_sn
————————————     type           ————————————
empid —————————> empid <——————— empid
name               /|\          name
                    |  
                    |  
      deductions    |  
      ——————————    |  
      empid ————————+  
      name

typeকর্মচারী টেবিল ceবা হতে হবে sn


আমি একাধিক বিদেশী কী যুক্ত করার চেষ্টা করেছি, তারা কাজ করেছিল তবে, একটি রেকর্ড যুক্ত করার সময়, জাভা ডার্বি আমাকে বলে যে উভয় বিদেশী কী সীমাবদ্ধতা লঙ্ঘিত হয়েছে!

আমি এটি পোস্টগ্র্রেএসকিউএল এ চেষ্টা করেছি এবং এটি সেখানে কাজ করে। উভয় টেবিলে আপনার পিতা-মাতার রেকর্ড রয়েছে?
ডারোবার্ট

পিতামাতাদের রেকর্ড বলতে আপনি বলতে চাইছেন, এমপিড?

নিশ্চয়ই সমস্যাটি "ছাড়" টেবিল থেকে "কর্মচারী" টেবিলে স্থানান্তরিত হয়েছে। কোনও ধরণের উপর ভিত্তি করে আপনি কীভাবে সম্ভাব্য বিভিন্ন সত্তা উল্লেখ করবেন?
gawpertron

4
@ গ্যাপার্পট্রন: আচ্ছা, এম্পিডটি সমস্ত প্রকারের মধ্যেই অনন্য। কোন সাব-টেবিলটি আপনাকে রেফারেন্স করতে হবে তা দেখতে আপনি 'টাইপ' ফিল্ডটি ব্যবহার করতে পারেন। বা কেবলমাত্র LEFT JOINতাদের সবই যদি যথেষ্ট পরিমাণে থাকে। 'কর্মচারী' বেস টেবিলটি ব্যবহার না করার সময়, প্রাথমিক কীটি ঘোষণা করা যায়নি (কারণ এটি টেবিলএ বা টেবিলবি বা… এখন এটা হতে পারে। বিভাজনের জ্ঞান employees_ceএবং employees_snঅনুমান করা হয়েছিল, এবং সেই অনুমানটি লক্ষ করা যায়।
ডারোবার্ট

20

আসলে আমি নিজেই এটি করি আমার কাছে 'কমেন্টস' নামক একটি টেবিল রয়েছে যাতে 3 টি অন্যান্য টেবিলের রেকর্ডের জন্য মন্তব্য রয়েছে। কোনও সমাধানই আসলে সম্ভবত আপনি যা চান তার সবকিছু পরিচালনা করে না। আপনার ক্ষেত্রে, আপনি এটি করবেন:

সমাধান 1:

  1. কর্মচারী_স এবং কর্মচারী_এসএন-তে একটি ছোট্ট ক্ষেত্র যুক্ত করুন যা একটি ডিফল্ট মান যা প্রতিটি টেবিলের মধ্যে আলাদা হয় (এই ক্ষেত্রটি একটি 'সারণী শনাক্তকারী' উপস্থাপন করে, তাই আমরা তাদের tid_ce & tid_sn বলব)

  2. টেবিলের পিকে এবং টেবিল আইডি ক্ষেত্রটি ব্যবহার করে প্রতিটি টেবিলে একটি অনন্য সূচক তৈরি করুন।

  3. বিদেশী কী (সারণী আইডি) এর দ্বিতীয়ার্ধ সংরক্ষণ করার জন্য আপনার 'ছাড়' টেবিলে একটি ক্ষুদ্র ক্ষেত্র যুক্ত করুন

  4. আপনার 'ছাড়' সারণিতে 2 টি বিদেশী কী তৈরি করুন (আপনি রেফারেন্সিয়াল অখণ্ডতা প্রয়োগ করতে পারবেন না, কারণ কোনও একটিই বৈধ হবে বা অন্যটি ... তবে উভয়ই নয়:

    ALTER TABLE [dbo].[Deductions]  WITH NOCHECK ADD  CONSTRAINT [FK_Deductions_employees_ce] FOREIGN KEY([id], [fk_tid])
    REFERENCES [dbo].[employees_ce] ([empid], [tid])
    NOT FOR REPLICATION 
    GO
    ALTER TABLE [dbo].[Deductions] NOCHECK CONSTRAINT [FK_600_WorkComments_employees_ce]
    GO
    ALTER TABLE [dbo].[Deductions]  WITH NOCHECK ADD  CONSTRAINT [FK_Deductions_employees_sn] FOREIGN KEY([id], [fk_tid])
    REFERENCES [dbo].[employees_sn] ([empid], [tid])
    NOT FOR REPLICATION 
    GO
    ALTER TABLE [dbo].[Deductions] NOCHECK CONSTRAINT [FK_600_WorkComments_employees_sn]
    GO
    
    employees_ce
    --------------
    empid    name     tid
    khce1   prince    1
    
    employees_sn
    ----------------
    empid    name     tid 
    khsn1   princess  2
    
    deductions
    ----------------------
    id      tid       name  
    khce1   1         gold
    khsn1   2         silver         
    ** id + tid creates a unique index **
    

সমাধান 2: এই সমাধানটি রেফারেন্সিয়াল অখণ্ডতা বজায় রাখার মঞ্জুরি দেয়: 1. 'ছাড়' টেবিলের মধ্যে দ্বিতীয় বিদেশী কী ক্ষেত্র তৈরি করুন, উভয় বিদেশী কীতে নাল মানকে মঞ্জুরি দিন এবং সাধারণ বিদেশী কী তৈরি করুন:

    employees_ce
    --------------
    empid   name
    khce1   prince 

    employees_sn
    ----------------
    empid   name     
    khsn1   princess 

    deductions
    ----------------------
    idce    idsn      name  
    khce1   *NULL*    gold
    *NULL*  khsn1     silver         

অখণ্ডতা কেবল তখনই পরীক্ষা করা হয় যদি কলামটি বাতিল নয়, তাই আপনি রেফারেন্সিয়াল অখণ্ডতা বজায় রাখতে পারেন।


6

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

Table 1 Fruit
pk_fruitid, name
1, apple
2, pear

Table 2 Meat
Pk_meatid, name
1, beef
2, chicken

Table 3 Entity's
PK_entityid, anme
1, fruit
2, meat
3, desert

Table 4 Basket (Table using fk_s)
PK_basketid, fk_entityid, pseudo_entityrow
1, 2, 2 (Chicken - entity denotes meat table, pseudokey denotes row in indictaed table)
2, 1, 1 (Apple)
3, 1, 2 (pear)
4, 3, 1 (cheesecake)

এসও অপের উদাহরণটি এর মতো দেখতে পাবে

deductions
--------------
type    id      name
1      khce1   gold
2      khsn1   silver

types
---------------------
1 employees_ce
2 employees_sn

1

প্রযুক্তিগতভাবে সম্ভব। আপনি সম্ভবত কর্মীদের_ ছাড় এবং কর্মচারীদের_এসএন-তে উল্লেখ করবেন। তবে আপনি কর্মচারী_এসএন এবং কর্মচারী_সাকে কেন মার্জ করবেন না? আপনার দুটি টেবিল থাকার কোনও কারণ আমি দেখতে পাচ্ছি না। অনেকের সাথে কারও সম্পর্ক নেই। এবং (এই উদাহরণে নয়) অনেকগুলি কলাম।

আপনি যদি একটি কলামের জন্য দুটি রেফারেন্স করেন তবে কোনও কর্মীর অবশ্যই উভয় সারণিতে একটি প্রবেশিকা থাকতে হবে


1

হ্যা এটা সম্ভব. তৃতীয় সারণীর জন্য আপনাকে 2 টি এফকে সংজ্ঞায়িত করতে হবে। প্রতিটি এফকে এক টেবিলের প্রয়োজনীয় ক্ষেত্রগুলি (অর্থাত বিদেশী টেবিলের জন্য 1 এফকে) নির্দেশ করে।


0

ধরে নিচ্ছি যে কোনও কারণে দু'জন কর্মচারীর ধরণের জন্য আপনার কাছে দুটি টেবিল থাকতে হবে, আমি ভাইমার্কিজের উত্তরটি প্রসারিত করব:

স্কিমা:

employees_ce (id, name)
employees_sn (id, name)
deductions (id, parentId, parentType, name)

ছাড়ের ডেটা:

deductions table
id      parentId      parentType      name
1       1             ce              gold
2       1             sn              silver
3       2             sn              wood
...

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

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