ক্যাসকেড (অপসারণ / অপসারণের আপডেট) আচরণের ভাল ব্যাখ্যা


98

আমি প্রতিদিন স্কিমা ডিজাইন করি না, তবে আমি যখন করি তখন প্রশাসনকে আরও সহজ করার জন্য ক্যাসকেড আপডেট / ডিলিটগুলি সঠিকভাবে সেটআপ করার চেষ্টা করি। আমি বুঝতে পারি কীভাবে ক্যাসকেডগুলি কাজ করে তবে কোন টেবিলটি কোন তা আমি কখনই মনে করতে পারি না।

উদাহরণস্বরূপ, যদি আমার কাছে দুটি টেবিল থাকে - Parentএবং Child- Childসেই উল্লেখগুলিতে একটি বিদেশী কী সহ Parentএবং রয়েছে ON DELETE CASCADE, কোন রেকর্ডগুলি একটি ক্যাসকেডকে ট্রিগার করে এবং কোন রেকর্ডগুলি ক্যাসকেড দ্বারা মুছে ফেলা হয়? আমার প্রথম অনুমানটি হবে Childরেকর্ডগুলি মুছে ফেলা হলে Parentরেকর্ডগুলি মুছে ফেলা হবে, যেহেতু Childরেকর্ডগুলি রেকর্ডের উপর নির্ভর করে Parent, তবে এটি ON DELETEঅস্পষ্ট; এটি মুছে মানে হতে পারে Parentরেকর্ড যখন Childরেকর্ড মুছে ফেলা হয়, অথবা এটি মুছে ফেলতে মানে হতে পারে Childরেকর্ড যখন Parentমুছে ফেলা হয়। তাহলে এটি কোনটি?

আমি আশা করি সিনট্যাক্স ছিল ON PARENT DELETE, CASCADE, ON FOREIGN DELETE, CASCADEঅস্পষ্টতা অপসারণ অনুরূপ কিছু বা। এটি মনে রাখার জন্য কারও কি স্মৃতিশক্তি আছে?

উত্তর:


138

আপনি যদি চান তাহলে Parentএবং Childশর্তাবলী এবং আপনি যদি মনে করেন তারা মনে রাখা সহজ হয়, আপনি অনুবাদ পছন্দ করতে পারেন ON DELETE CASCADEথেকেLeave No Orphans!

যার অর্থ হ'ল যখন কোনও Parentসারি মুছে ফেলা হয় (হত্যা করা হয়), কোনও অনাথ সারি Childটেবিলের মধ্যে বেঁচে থাকা উচিত নয় । প্যারেন্ট সারির সমস্ত শিশুকেও হত্যা করা হয় (মুছে ফেলা)। এই শিশুদের মধ্যে যদি কোনও নাতি-নাতনি থাকে (অন্য বিদেশী কী এর মাধ্যমে অন্য টেবিলে) এবং ON DELETE CASCADEসংজ্ঞায়িত হয় তবে এগুলিও হত্যা করা উচিত (এবং সমস্ত বংশধরেরা, যতক্ষণ না কোনও ক্যাসকেড প্রভাব সংজ্ঞায়িত থাকে))

FOREIGN KEYবাধ্যতা নিজেই এছাড়াও হিসাবে বর্ণনা করা যেতে পারে Allow No Orphans!(প্রথম স্থানে)। কোন Childকি কখনো অনুমতি প্রদান করা উচিত সন্তানের টেবিলে (লিখিত) যদি এটি একটি নেই Parent(পিতা বা মাতা সারণিতে একটি সারি)।

ধারাবাহিকতার জন্য, এটি ON DELETE RESTRICTঅনুবাদ করা যেতে পারে (কম আক্রমণাত্মক) You Can't Kill Parents!কেবল নিঃসন্তান সারিগুলি হত্যা করা যেতে পারে (মুছে ফেলা হয়েছে)


3
অনুভূতিতে এখনও কিছু অনুপস্থিত মনে হচ্ছে। কোনও সন্তানের একাধিক পিতা-মাতা থাকতে পারে না? এক্ষেত্রে একজন পিতামাতাকে মেরে ফেলা কি সন্তানকে এতিম করে তুলবে?
Jus12

7
@ Jus12 না, বিদেশী কী বাধা কেবলমাত্র 1 জন পিতামাতার সাথে কাজ করে। এই দিকটি সম্পর্কে এটি একটি ভাল উপমা নয়।
ypercubeᵀᴹ

1
@ টাইপারকিউব: এটি কি অনুমোদিত নয়? Order(custID, itemID, orderID)যেখানে সারণীতে একটি প্রাথমিক কী বোঝায় custIDএবং Customersটেবিলে itemIDএকটি প্রাথমিক কী বোঝায় ItemsOrderদু'জন বাবা-মা থাকবে না ?
Jus12

4
@ জাস 12 এটি অবশ্যই অনুমোদিত তবে এটি 2 টি বিদেশী কী বাধা হবে। তারপরে প্রতিটি সন্তানের (অর্ডার) একজন পিতামাতা (গ্রাহক) এবং একটি পিতামাতার (আইটেম) থাকবে। 2 টি এফ-এর আচরণগততা যদিও আলাদা হতে পারে। (সুতরাং, উদাহরণস্বরূপ, এটি হতে পারে যে গ্রাহকরা হত্যার ফলে তাদের সমস্ত (আদেশ) শিশুদের হত্যা করা হবে তবে আইটেমগুলি হত্যা তাদের আদেশটি
হারাবে না

1
আমরা "অনাথ" না বললে পিতামাতার উপমাটি এখনও কাজ করতে পারে। যদি শিশু প্রবেশের ক্ষেত্রে দুটি পৃথক পিতা-মাতার দুটি উল্লেখ থাকে তবে এটি এখনও বিবাহবিচ্ছেদপ্রাপ্ত দম্পতির সন্তান হিসাবে দেখা যেতে পারে। সীমাবদ্ধ: "আমি তোমাকে আমার মাকে হত্যা করতে দেব না" ক্যাসকেড: "আপনি যদি আমার বাবাকে হত্যা করেন তবে আমিও মরে যাব"
ক্রিস্টোফার ম্যাকগোয়ান

31

উদাহরণস্বরূপ, যদি আমার দুটি টেবিল থাকে - পিতা বা মাতা এবং শিশু - যেখানে সন্তানের রেকর্ডগুলি পিতা-মাতার রেকর্ডের মালিকানাধীন থাকে, কোন টেবিলটি অন ডিলেট ক্যাসকেডের প্রয়োজন?

ডিলিট ক্যাসকেড হ'ল বিদেশী কী ঘোষণার একটি claচ্ছিক ধারা। সুতরাং এটি বিদেশী কী ঘোষণার সাথে যায় । (অর্থ, "শিশু" টেবিলের মধ্যে))

... এর অর্থ শিশুর রেকর্ডটি মুছে ফেলা হলে পিতামাতার রেকর্ডটি মুছতে পারে, বা এর অর্থ পিতামাতার মুছে ফেলা হলে শিশু রেকর্ডটি মুছতে পারে। তাহলে এটি কোনটি?

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

যখন আপনি "পিতামাতা" সারণী থেকে একটি সারি মুছে ফেলেন - "সেই_তালিকা" থেকে - আপনি "সন্তানের" টেবিলের জন্য সম্ভাব্য মানগুলি থেকে একটি বৈধ মান সরিয়ে ফেলেন। ডেটা অখণ্ডতা বজায় রাখতে, আপনাকে "শিশু" সারণিতে কিছু করতে হবে। ক্যাসকেডিং মোছা হ'ল একটি জিনিস যা আপনি করতে পারেন।


2

এসকিউএল: ২০১১ স্পেস

এর জন্য পাঁচটি বিকল্প রয়েছে ON DELETEএবং ON UPDATEএটি প্রয়োগ করতে পারে FOREIGN KEY। এগুলিকে <referential actions>সরাসরি এসকিউএল থেকে বলা হয় : ২০১১ স্পেস

  • ON DELETE CASCADE: যদি রেফারেন্স টেবিলের একটি সারি মুছে ফেলা হয়, তবে রেফারেন্সিং টেবিলের সমস্ত সারণী মুছে ফেলা হবে।
  • ON DELETE SET NULL: যদি রেফারেন্স টেবিলের একটি সারি মুছে ফেলা হয়, তবে রেফারেন্সিং টেবিলের সাথে সব মিলিয়ে সারিগুলিতে সমস্ত রেফারেন্সিং কলামগুলি বাতিল করতে সেট করতে হবে।
  • ON DELETE SET DEFAULT: যদি রেফারেন্স টেবিলের একটি সারি মুছে ফেলা হয়, তবে রেফারেন্সিং টেবিলের সমস্ত মিলে যাওয়া সারিগুলিতে সমস্ত রেফারেন্সিং কলামগুলি কলামটির ডিফল্ট মানতে সেট করতে হবে।
  • ON DELETE RESTRICT: রেফারেন্সিং টেবিলের যদি সেই সারিটির কোনও মিলের সারি থাকে তবে রেফারেন্স টেবিলের একটি সারি মুছে ফেলা নিষিদ্ধ।
  • ON DELETE NO ACTION (ডিফল্ট) : কোনও রেফারেনশিয়াল মোছার ক্রিয়া নেই; রেফারেন্সিয়াল সীমাবদ্ধতা কেবল একটি সীমাবদ্ধতা পরীক্ষা করে।

বিদেশী কী নির্ভরশীল সম্পর্ক স্থাপন করে। <referential action>যখন সম্পর্ক দ্রবীভূত হয় তখন কি হবে নির্ধারণ করে।

উদাহরণ / রূপক / ব্যাখ্যা

এই উদাহরণস্বরূপ, আমরা সমাজ এবং অর্থনীতির সাধারণ মডেলটি গ্রহণ করব: যেখানে প্রত্যেকেই businessএমন একটি সংস্থা যা এর bourgeoisieমাধ্যমে একটি সম্পর্ক বজায় রাখে fatcat_owner

CREATE TABLE bourgeoisie(
  fatcat_owner varchar(100) PRIMARY KEY
);
INSERT INTO bourgeoisie(fatcat_owner) VALUES
  ( 'Koch Brothers' );

CREATE TABLE business (
  name         varchar(100),
  fatcat_owner varchar(100) REFERENCES bourgeoisie
);
INSERT INTO business(name, fatcat_owner)
  VALUES ('Georgia-Pacific', 'Koch Brothers');

যদি সমস্ত businessএগুলি সরাসরি bourgeoisieতাদের দ্বারা প্রভাবিত হয় fatcat_ownerতবে আপনি শ্রমিকদের বিপ্লব করার পরে আপনি কী করবেন যখন আপনি এই লোকদের শুচি করবেন fatcat_ownerএবং শ্রেণিবিহীন সমাজ রাখবেন?

-- Viva la revolución 
BEGIN;
  DELETE FROM bourgeoisie;
END;

আপনার এখানে কয়েকটি বিকল্প রয়েছে,

  • বিপ্লব বন্ধ করুন। এসকিউএল পার্লেন্সে RESTRICT,। কিছু লোক বিশ্বাস করেন যে এটি কম মন্দ, তবে তারা সাধারণত ভুল হয়।
  • এটি চালিয়ে যাওয়ার অনুমতি দিন। যদি তাই হয় যখন বিপ্লব ঘটে এসকিউএল আপনাকে চারটি বিকল্প দেয়,

    • SET NULL-- ফাকাই রাখুন. কে জানে, সম্ভবত পুঁজিবাদ পুনরুদ্ধার হয়ে bourgeoisieআসে এবং অলিগার্কস এর রোলটি পূরণ করে fatcat_owners। গুরুত্বপূর্ণ দ্রষ্টব্য, কলামটি অবশ্যই হবে NULLABLE(না NOT NULL) অথবা এটি কখনই ঘটতে পারে না।
    • SET DEFAULT- সম্ভবত আপনি কি DEFAULTএটি পরিচালনা করেছিলেন ? ক DEFAULTএকটি ফাংশন কল করতে পারেন। হতে পারে আপনার স্কিমা বিপ্লব-প্রস্তুত, ইতিমধ্যে।
    • CASCADE- কোনও ক্ষতি নিয়ন্ত্রণ নেই। যদি bourgeoisieযায়, তাই না business। যদি কোনও ব্যবসায়ের অবশ্যই একটি থাকে fatcat_pig, তবে কখনও কখনও কোনও businessটেবিলে অ-ব্যবসা করার চেয়ে ডেটা হারাতে আরও বেশি অর্থ হয় ।
    • NO ACTION- এটি মূলত চেকটি বিলম্ব করার একটি পদ্ধতি, মাইএসকিউএলে এটির চেয়ে আলাদা RESTRICTনয়, তবে পোস্টগ্রিসকিউএল-তে আপনি করতে সক্ষম হবেন

      -- Not a real revolution.
      -- requires constraint be DEFERRABLE INITIALLY DEFERRED
      BEGIN;
        SET CONSTRAINTS ALL DEFERRED;
        DELETE FROM bourgeoisie;
        INSERT INTO bourgeoisie VALUES ( 'Putin' );
        UPDATE business SET fatcat_pig = 'Putin';
      END;

      এই জাতীয় সিস্টেমে লেনদেন শুরুর আগেই সীমাবদ্ধতা বৈধ হয়। এর ফলে বিপ্লব বন্ধ হতে পারে তবে আপনি লেনদেনে পুনরুদ্ধার করতে পারেন - কিছুটা ডিগ্রির জন্য "পুনরুদ্ধার"।


কি referencedটেবিল পিতা বা মাতা টেবিল অর্থ referencingটেবিল শিশু টেবিল মানে?
সাক 552

@ sg552 হ্যাঁ, আপনি এটি সঠিকভাবে বুঝতে পেরেছিলেন।
informatik01

0

একটি সাধারণ স্মৃতিচারণা হবে

এখানে প্যারেন্ট ক্যাসকেডকে মোছা [মোছার মাধ্যমে] এখানে

এটি আপনাকে জানায় যে কোন মুছে ফেলা (পিতামাতার মুছে ফেলাগুলি) ক্যাসকেড হয়, যেখানে অন ​​ডিফল্ট ক্যাসকেড বিবৃতিটি (সন্তানের উপরে) যায় এবং কী মুছে যায় (শিশু) the


-3

ভাল, সম্ভবত আমরা সিনট্যাক্স যুক্তিযুক্ত করতে পারেন। আসুন একটি পাইথনের উদাহরণ নিই:

class Parent(self):
    # define parent's fields

class Child(self):    
    # define child's fields
    parent_pk_is_childs_foreign_key = models.ForeignKey(Parent, on_delete=models.CASCADE)

এই লাইনটি যা বলে তা হল পিতামাতার অনডিলিট (যা ঘটনাক্রমে বিবৃতিতে উল্লেখ করা হয়েছে), দয়া করে সন্তানের উপরে মুছে ফেলুন c এজন্য CASCADE বিবৃতিটি শিশু পর্যায়ে সংজ্ঞায়িত করা হয়েছে, এটি সেই শিশুদের চিহ্নিত করে যা মুছতে হবে

উদাহরণস্বরূপ আপনার যদি অন্য একটি ক্লাস থাকে

class GrownUpChild(self):    
        # define grown up child's fields
        parent_pk_is_childs_foreign_key = models.ForeignKey(Parent, on_delete=models.DO_NOTHING)

এই কাঠামোটি স্পষ্টভাবে দেখিয়ে দেবে যে এতিম হওয়া সত্ত্বেও শিশুদের মধ্যে কোনটিকে (শিশু) অপসারণ করা উচিত এবং কোনটি (গ্রাউনআপপিল্ড) রাখা উচিত

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


1
'প্রকৃতপক্ষে মুছে যাওয়া পিতামাতার সন্তানদের অডিটিং এবং রিপোর্টের কারণে এবং দুর্ঘটনাজনিত মোছা পুনরুদ্ধারের কারণে প্রায়শই কাঙ্ক্ষিত আচরণ' - এটি একটি (বুদ্ধিমান) ডাটাবেসে বিপর্যয়কর হবে।
dezso

@ ইনডপুট জন্য ধন্যবাদ ডেডসো। তবে একাধিক এন্টারপ্রাইজ স্তরের সিআরএম সিস্টেম ঠিক তা করে।
জর্জ মোগিলিভস্কি

টিবিএইচ এটি এটিকে আর বুদ্ধিমান করে না। এই ধরণের পদ্ধতির ফলে ছিটে ফিক্স করার জন্য আমি একবার একটি অ্যাসাইনমেন্ট পেয়েছি - বেতনটি ছাড়াই কোনও আনন্দ নেই।
dezso

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

হ্যাঁ, এটি একটি জ্ঞাত এবং বুদ্ধিমান প্যাটার্ন - তবে তারপরে এটি প্রতিফলিত করার জন্য আপনার উপরের শব্দটি সম্ভবত পরিবর্তন করা উচিত।
dezso
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.