বৈদেশিক কী বাধা: কখন আপডেট এবং অপসারণটি ব্যবহার করবেন


195

আমি আমার ডাটাবেস স্কিমাটি মাইএসকিউএল ওয়ার্কবেঞ্চ ব্যবহার করে ডিজাইন করছি, এটি দুর্দান্ত কারণ আপনি চিত্রগুলি করতে পারেন এবং এটি তাদের রূপান্তরিত করে: পি

যাইহোক, আমি বিদেশী কী সমর্থন করার কারণে InnoDB ব্যবহার করার সিদ্ধান্ত নিয়েছি। যদিও আমি লক্ষ্য করেছি যে এটি আপনাকে বিদেশী কীগুলির জন্য আপডেট এবং মুছুন বিকল্পগুলি সেট করতে দেয় allows কেউ কি ব্যাখ্যা করতে পারেন যেখানে "সীমাবদ্ধ", "ক্যাসকেড" এবং সেট নাল একটি সাধারণ উদাহরণে ব্যবহার করা যেতে পারে?

উদাহরণস্বরূপ, বলুন আমার কাছে একটি userটেবিল রয়েছে যার মধ্যে একটি রয়েছে userID। এবং বলুন যে আমার কাছে একটি বার্তা টেবিল রয়েছে messageযা অনেকগুলি থেকে অনেকের কাছে 2 টি বিদেশী কী রয়েছে (যা একই প্রাথমিক কীটি উল্লেখ করে,userIDuserটেবিল)। অন ​​আপডেট এবং অন ডিলিট অপশনগুলি সেট করা কি এই ক্ষেত্রে কোনও কার্যকর? যদি তাই হয় তবে আমি কোনটি বেছে নেব? এটি যদি ভাল উদাহরণ না হয় তবে কীভাবে দয়া করে এগুলি কার্যকর হতে পারে তা বোঝানোর জন্য একটি ভাল উদাহরণ দিয়ে আসতে পারেন?

ধন্যবাদ

উত্তর:


485

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

মাইএসকিউএল সহ আপনার পোস্টগ্রিএসকিউএল এর মতো উন্নত বাধা নেই তবে কমপক্ষে বিদেশী কী সীমাবদ্ধতাগুলি বেশ উন্নত।

আমরা একটি উদাহরণ নেব, এমন একটি সংস্থার টেবিল যা ব্যবহারকারীর টেবিল সহ থিসি সংস্থার লোক রয়েছে

CREATE TABLE COMPANY (
     company_id INT NOT NULL,
     company_name VARCHAR(50),
     PRIMARY KEY (company_id)
) ENGINE=INNODB;

CREATE TABLE USER (
     user_id INT, 
     user_name VARCHAR(50), 
     company_id INT,
     INDEX company_id_idx (company_id),
     FOREIGN KEY (company_id) REFERENCES COMPANY (company_id) ON...
) ENGINE=INNODB;

চলুন ওপেন আপডেট আপডেটটি দেখুন:

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

এবং এখন মুছে ফেলার দিকে:

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

সাধারণত আমার ডিফল্ট হল: মুছে সীমিত আপডেট CASCADEON DELETE CASCADEট্র্যাক টেবিলের জন্য কিছু সহ (লগ - সমস্ত লগ নয় - এই জাতীয় জিনিস) এবং ON DELETE SET NULLযখন মাস্টার টেবিলটি বিদেশী কীযুক্ত টেবিলের জন্য 'সরল বৈশিষ্ট্য' হয়, যেমন ব্যবহারকারীর টেবিলের জন্য একটি জওবি টেবিল।

সম্পাদন করা

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

মাইএসকিউএল কেবল এসকিউএল বিবৃতি দ্বারা সারণিতে পরিবর্তনগুলির জন্য সক্রিয় করে। এগুলি ভিউ-র পরিবর্তনের জন্য সক্রিয় করে না বা মাইএসকিউএল সার্ভারে এসকিউএল বিবৃতি প্রেরণ করে না এমন APIs দ্বারা তৈরি টেবিলগুলিতে পরিবর্তন করেও সক্রিয় করে না

==> শেষ সম্পাদনার নীচে দেখুন, জিনিসগুলি এই ডোমেনে চলছে

ট্রিগারগুলি বিদেশী কী ক্রিয়া দ্বারা সক্রিয় হয় না।

এবং আমি মনে করি না এটি একদিন স্থির হয়ে যাবে। বিদেশী কী সীমাবদ্ধতাগুলি InnoDb স্টোরেজ দ্বারা পরিচালিত হয় এবং ট্রিগারগুলি মাইএসকিউএল এসকিউএল ইঞ্জিন দ্বারা পরিচালিত হয়। দুজনেই আলাদা হয়ে গেছে। ইনোডব হ'ল সীমাবদ্ধতা ব্যবস্থাপনার একমাত্র স্টোরেজ, সম্ভবত তারা একদিন সরাসরি স্টোরেজ ইঞ্জিনে ট্রিগার যুক্ত করবে, সম্ভবত না।

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

12/2017-মাইএসকিউএল সম্পর্কে এই সম্পাদনা আপডেট করা:

@ ইসতিয়াক আহমেদ মন্তব্যগুলিতে যেমন বলেছিলেন, পরিস্থিতি এই বিষয়টিতে পরিবর্তিত হয়েছে। সুতরাং লিঙ্কটি অনুসরণ করুন এবং আসল আপ-টু-ডেট পরিস্থিতি পরীক্ষা করুন (যা ভবিষ্যতে আবার পরিবর্তন হতে পারে)।


8
ON DELETE CASCADE : dangerous- এক চিমটি নুন দিয়ে নিন।
onedaywhen

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

1
ব্যবসায়ের যুক্তি হিসাবে, একটি ক্ষেত্রে এর SET NULLমধ্যে আকর্ষণীয় হতে পারে ON UPDATE: একটি কোম্পানী আপডেট করা কোম্পানির বিচ্ছিন্নতা> ব্যবহারকারী সম্পর্কের প্রতিনিধিত্ব করে। উদাহরণস্বরূপ: যদি কোনও সংস্থা তার ব্যবসায়ের ধরণ পরিবর্তন করে, পূর্ববর্তী ব্যবহারকারীরা আর সেই ব্যবসায়ের সাথে সম্পর্কিত না NULLহতে পারে , তাই এই সূচকটির পক্ষে ভাল।
সিপিএইচপিথন

1
@ গ্রেইলিও, এটি আপনার প্রথম লিঙ্কের ( dev.mysql.com/doc/refman/5.6/en/triggers.html ) mysql সাইটে লিখিত সামগ্রী পরিবর্তিত হয়েছে। This includes changes to base tables that underlie updatable viewsআপনি যা আটকিয়েছেন তার পরিবর্তে এটি বলছেThey do not activate for changes in views
ইসতিয়াক আহমেদ

6
"আমি চাইব না যে কোনও গ্রাহক তার আগে থাকা আদেশের আর্থিক তথ্য মুছে ফেলতে চাইবেন।" সেরকম পরিস্থিতিতে, আপনার এখনও সম্ভবত গ্রাহকের ডেটা প্রয়োজন। আপনার নকশাটি সম্ভবত গ্রাহকটিকে নিষ্ক্রিয় হিসাবে চিহ্নিত করা উচিত, ডাটাবেস থেকে তাদের সারিটি মোছা হবে না। অনুশীলনে, এটি আমার পেশাদার অভিজ্ঞতা যে আপনি খুব কমই কোনও কিছু মুছতে চান , ডিফল্টরূপে নিষ্ক্রিয় চিহ্নিত করতে পছন্দ করেন। স্থায়ীভাবে মুছে ফেলা হয় যেখানে ক্ষেত্রে হয় ঠিক আছে, CASCADE DELETEসাধারণত এছাড়াও, ঠিক আছে এমনকি পছন্দ করা হয়। আমি এটিকে বিশেষত বিপজ্জনক হিসাবে বিবেচনা করি না।
গ্র্যান্ডওপেনার

3

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

উদাহরণস্বরূপ যদি আপনি ওআরএম ব্যবহার করে কোনও রেকর্ড মুছে ফেলেন DELETE CASCADEএবং সম্পর্কিত টেবিলগুলিতে আপনার রেকর্ডগুলি মুছে ফেলা হয়, তবে সম্পর্কিত সম্পর্কিত রেকর্ডগুলি (প্রায়শই স্বয়ংক্রিয়) মোছার জন্য ওআরএমের প্রচেষ্টা ত্রুটির কারণ হতে পারে।


11
এটি সেই নির্দিষ্ট ওআরএম ব্যবহার না করার কারণ হবে। ডাটাবেস সমর্থনে দুর্বল এমন কোনও সরঞ্জাম বিশ্বাসযোগ্য নয়। বিদেশী কী এবং ক্যাসকেডিং মোছা বা আপডেটগুলি ডিবি বেসিকগুলি উন্নত ধারণা নয় এবং বিদেশী কী বাধা ছাড়াই কোনও রিশনাল ডেটাবেস ডিজাইন করা উচিত নয়!
এইচএলজিইএম

সমস্যা তারা ত্রুটি নিক্ষেপ করা হয়। মুছে ফেলা প্রতিরোধ করা কিন্তু ইঞ্জিনটি ত্রুটিগুলি উত্পন্ন না করে তবে শব্দার্থকে বজায় রাখতে পারে? একই সাথে অন্য ডেটা মোছা থেকে রক্ষা করার জন্য আমি আমার প্রোগ্রামটি এখনও চালিয়ে যেতে চাই।
TheRealChx101

2

অ্যাপ্লিকেশন প্রসঙ্গে আপনার এটি বিবেচনা করতে হবে। সাধারণভাবে, আপনার একটি অ্যাপ্লিকেশন ডিজাইন করা উচিত, কোনও ডাটাবেস নয় (ডাটাবেসটি কেবল অ্যাপ্লিকেশনটির অংশ হিসাবে রয়েছে)।

আপনার আবেদনের বিভিন্ন ক্ষেত্রে কীভাবে সাড়া দেওয়া উচিত তা বিবেচনা করুন।

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

ব্যক্তিগতভাবে, আমি InnoDB ব্যবহার করব কারণ এটিতে আপনার ডেটা ট্র্যাশ করে না (সিএফ মাইআইএসএএম, যা করে) এটির পরিবর্তে এফকে সীমাবদ্ধতা রয়েছে।

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