একই টেবিলে দুটি সারি কীভাবে সম্পর্কিত


11

আমার একটি টেবিল রয়েছে যেখানে সারিগুলি একে অপরের সাথে সম্পর্কিত হতে পারে এবং যৌক্তিকভাবে, সম্পর্কটি দুটি সারির মধ্যে উভয় পথে (মূলত, দিকনির্দেশনা) হয়। (এবং যদি আপনি ভাবছেন, হ্যাঁ, এটি সত্যিই একটি টেবিল হওয়া উচিত It এটি একই একই যৌক্তিক সত্তা / প্রকারের দুটি জিনিস)) আমি এটি উপস্থাপনের কয়েকটি উপায় সম্পর্কে ভাবতে পারি:

  1. সম্পর্ক এবং এর বিপরীত সংরক্ষণ করুন
  2. সম্পর্কের এক উপায়ে স্টোর করুন, ডাটাবেসটিকে অন্য উপায়ে সংরক্ষণ করতে বাধা দিন এবং এফকে-র বিপরীত আদেশের সাথে দুটি সূচী করুন (একটি সূচকটি পিকে সূচক)
  3. দুটি সূচকের সাথে সম্পর্কের এক উপায়ে স্টোর করুন এবং দ্বিতীয়টি যেকোন উপায়ে প্রবেশ করানোর অনুমতি দিন (ইয়াকির মতো ধরণের, তবে ওহে, সম্পূর্ণতা)
  4. কিছু ধরণের গ্রুপিং টেবিল তৈরি করুন এবং এটিতে মূল টেবিলে একটি এফকে রাখুন। (প্রচুর প্রশ্ন উত্থাপন করে Grou গ্রুপিং টেবিলে কেবল একটি সংখ্যা থাকবে; এমনকি টেবিলটি কেন? এফকে নালাগুলি তৈরি করুন বা একক সারির সাথে গোষ্ঠী যুক্ত আছে?)

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

এখানে খেলতে এখানে একটি এসকিউএলফিডাল রয়েছে: http://sqlfiddle.com/#!12/7ee1a/1/0 । (পোস্টগ্র্রেএসকিউএল হতে চলেছে যেহেতু আমি এটিই ব্যবহার করছি তবে আমি মনে করি না যে এই প্রশ্ন পোস্টগ্র্রেএসকিউএল এর সাথে খুব সুনির্দিষ্ট।) বর্তমানে এটি সম্পর্ক এবং এর বিপরীত উভয়ই কেবল উদাহরণ হিসাবে সঞ্চয় করে।


প্রদত্ত মানটি কি একে অপরের সাথে সম্পর্কিত হতে পারে? একটি প্রদত্ত মান সর্বদা কি অন্যের সাথে সম্পর্কিত? তারা কি একই অন্যান্য সাধারণ তথ্য ভাগ করে?
ফিলি

হ্যাঁ, এগুলি 1 টিরও বেশি সারি সম্পর্কিত হতে পারে। না, এগুলি সর্বদা অন্য সারির সাথে সম্পর্কিত নয়। অগত্যা তাদের কাছে কোনও সাধারণ তথ্য নেই। ধন্যবাদ.
jpmc26

উফ। @ ফিল ভুলে গেছেন আমার কাছে ঘটে যাওয়া একটি সম্ভাব্য কাঠামো যুক্ত করতে সম্পাদিতও ed
jpmc26

উত্তর:


9

আপনি যা ডিজাইন করেছেন তা ভাল। সম্পর্কের দিকনির্দেশনা তৈরি করার জন্য একটি সীমাবদ্ধতা যা যুক্ত করা দরকার। সুতরাং, আপনার পাশাপাশি (1,5)একটি (5,1)সারি যুক্ত করা ছাড়া একটি সারি থাকতে পারে না।

এই মার্জিত হতে পারে * সেতু টেবিলের উপর একটি স্ব উল্লেখ বাধ্যতা সঙ্গে।

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

সুতরাং, পোস্টগ্রিসে নিম্নলিখিতগুলি আপনার প্রয়োজনীয়তার সাথে মেলে:

CREATE TABLE x
(
  x_id SERIAL NOT NULL PRIMARY KEY,
  data VARCHAR(10) NOT NULL
);

CREATE TABLE bridge_x
(
  x_id1 INTEGER NOT NULL REFERENCES x (x_id),
  x_id2 INTEGER NOT NULL REFERENCES x (x_id),
  PRIMARY KEY(x_id1, x_id2),
  CONSTRAINT x_x_directionless
    FOREIGN KEY (x_id2, x_id1)
    REFERENCES bridge_x (x_id1, x_id2)
);

পরীক্ষিত: এসকিউএল-ফিডল

আপনি যদি একটি সারি যুক্ত করার চেষ্টা করেন (1,5):

INSERT INTO bridge_x VALUES
(1,5) ;

এটি এতে ব্যর্থ হয়:

ত্রুটি: "ব্রিজ_এক্স" টেবিলের উপর সন্নিবেশ বা আপডেট করা বিদেশী কী বাধা "x_x_directionless" লঙ্ঘন করে
বিশদ: কী (x_id2, x_id1) = (5, 1) "ব্রিজ_এক্স" সারণীতে উপস্থিত নেই:
INSERT INTO Bridge_x VALUES (1,5)

অতিরিক্তভাবে, আপনি CHECKযদি (y,y)সারিগুলি নিষিদ্ধ করতে চান তবে আপনি একটি সীমাবদ্ধতা যুক্ত করতে পারেন :

ALTER TABLE bridge_x
  ADD CONSTRAINT x_x_self_referencing_items_not_allowed
    CHECK (x_id1 <> x_id2) ;

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

CREATE TABLE bridge_x
(
  x_id1 INTEGER NOT NULL REFERENCES x (x_id),
  x_id2 INTEGER NOT NULL REFERENCES x (x_id),
  PRIMARY KEY(x_id1, x_id2),
  CONSTRAINT x_x_directionless
    CHECK (x_id1 <= x_id2)                       -- or "<" to forbid `(y,y)` rows
);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.