আমি এখানে কিছু চক্রযুক্ত দেখতে পাচ্ছি না। আছে মানুষ এবং পোস্ট এবং এই সত্ত্বা মধ্যে দুটি স্বাধীন সম্পর্ক। আমি এই সম্পর্কের একটি বাস্তবায়ন হিসাবে পছন্দ দেখতে পাবেন ।
- একজন ব্যক্তি অনেকগুলি পোস্ট লিখতে পারেন, একটি পোস্ট একজন ব্যক্তি লিখেছেন:
1:n
- একজন ব্যক্তি অনেক পোস্ট পছন্দ করতে পারেন একটি পোস্ট অনেক মানুষ পছন্দ করেছে করা যেতে পারে:
n:m
এন এম সম্পর্ক অন্য সম্পর্ক সঙ্গে বাস্তবায়িত করা যাবে না: likes
।
বেসিক বাস্তবায়ন
বেসিক বাস্তবায়ন পোস্টগ্র্রেএসকিউএল এর মতো দেখতে পারে :
CREATE TABLE person (
person_id serial PRIMARY KEY
, person text NOT NULL
);
CREATE TABLE post (
post_id serial PRIMARY KEY
, author_id int NOT NULL -- cannot be anonymous
REFERENCES person ON UPDATE CASCADE ON DELETE CASCADE -- 1:n relationship
, post text NOT NULL
);
CREATE TABLE likes ( -- n:m relationship
person_id int REFERENCES person ON UPDATE CASCADE ON DELETE CASCADE
, post_id int REFERENCES post ON UPDATE CASCADE ON DELETE CASCADE
, PRIMARY KEY (post_id, person_id)
);
বিশেষত নোট করুন যে কোনও পোস্টে অবশ্যই একজন লেখক ( NOT NULL
) থাকতে হবে, যখন পছন্দগুলির অস্তিত্ব isচ্ছিক। বিদ্যমান লাইক জন্য অবশ্য post
এবং person
আবশ্যক উভয় রেফারেন্সড করা (দ্বারা জারি PRIMARY KEY
উভয় কলাম তোলে NOT NULL
স্বয়ংক্রিয়ভাবে (আপনি স্পষ্টভাবে এই সীমাবদ্ধতার যোগ পারে, redundantly) যাতে বেনামী লাইক এছাড়াও অসম্ভব হয়।
এন: মি বাস্তবায়নের জন্য বিশদ:
স্ব-পছন্দ প্রতিরোধ করুন
আপনি আরও লিখেছেন:
(তৈরি ব্যক্তি নিজের পোস্ট পছন্দ করতে পারে না)।
এটি উপরের বাস্তবায়নে এখনও প্রয়োগ করা হয়নি। আপনি একটি ট্রিগার ব্যবহার করতে পারে ।
বা এই দ্রুত / আরও নির্ভরযোগ্য সমাধানগুলির মধ্যে একটি:
একটি ব্যয়ের জন্য রক-সলিড
এটা হতে দরকার হয় তবে শিলা কঠিন , আপনার কাছ থেকে এফ কে প্রসারিত পারে likes
থেকে post
অন্তর্ভুক্ত করা author_id
redundantly। তারপরে আপনি সাধারণ CHECK
বাধা দিয়ে অজাচারকে অস্বীকার করতে পারেন ।
CREATE TABLE likes (
person_id int REFERENCES person ON UPDATE CASCADE ON DELETE CASCADE
, post_id int
, author_id int NOT NULL
, CONSTRAINT likes_pkey PRIMARY KEY (post_id, person_id)
, CONSTRAINT likes_post_fkey FOREIGN KEY (author_id, post_id)
REFERENCES post(author_id, post_id) ON UPDATE CASCADE ON DELETE CASCADE
, CONSTRAINT no_self_like CHECK (person_id <> author_id)
);
এই প্রয়োজন একটি অন্যথায় এছাড়াও অপ্রয়োজনীয় UNIQUE
মধ্যে বাধ্যতা post
:
ALTER TABLE post ADD CONSTRAINT post_for_fk_uni UNIQUE (author_id, post_id);
আমি সেখানে থাকা অবস্থায় একটি দরকারী সূচক সরবরাহauthor_id
করতে প্রথমে রেখেছি ।
আরও সঙ্গে সম্পর্কিত উত্তর:
একটি CHECK
সীমাবদ্ধতা সহ সস্তা
উপরের "বেসিক বাস্তবায়ন" এর উপর বিল্ডিং।
CHECK
প্রতিবন্ধকতা অপরিবর্তনীয় বোঝানো হয়। একটি চেকের জন্য অন্যান্য সারণিগুলি উল্লেখ করা কখনই অপরিবর্তনীয় নয়, আমরা ধারণাটি এখানে কিছুটা আপত্তি করছি। আমি NOT VALID
সঠিকভাবে প্রতিফলিত করতে সীমাবদ্ধতা ঘোষণা করার পরামর্শ দিই । বিবরণ:
CHECK
এই বিশেষ ক্ষেত্রে একটি সীমাবদ্ধতা যুক্তিসঙ্গত বলে মনে হয়, কারণ কোনও পোস্টের লেখক এমন একটি বৈশিষ্ট্যের মতো লাগে যা কখনও পরিবর্তন হয় না। নিশ্চিত হতে সেই ক্ষেত্রের আপডেটগুলি বাতিল করুন।
আমরা একটি ফাংশন জালIMMUTABLE
:
CREATE OR REPLACE FUNCTION f_author_id_of_post(_post_id int)
RETURNS int AS
'SELECT p.author_id FROM public.post p WHERE p.post_id = $1'
LANGUAGE sql IMMUTABLE;
আপনার টেবিলগুলির আসল স্কিমা দিয়ে 'সর্বজনীন' প্রতিস্থাপন করুন।
এই CHECK
সীমাবদ্ধতার মধ্যে এই ফাংশনটি ব্যবহার করুন :
ALTER TABLE likes ADD CONSTRAINT no_self_like_chk
CHECK (f_author_id_of_post(post_id) <> person_id) NOT VALID;