ডাটাবেসে বা কোনও অ্যাপ্লিকেশনটির কোড অংশে বিদেশী কীগুলি সংজ্ঞায়িত করা ভাল?
ডাটাবেসে বা কোনও অ্যাপ্লিকেশনটির কোড অংশে বিদেশী কীগুলি সংজ্ঞায়িত করা ভাল?
উত্তর:
বিদেশী কীগুলি ডাটাবেসে রাখুন। এমনকি আপনি সেভ করার আগে অ্যাপ্লিকেশনটিতে ডেটা বৈধতা দিলেও এফকে এর একটি ভাল টুকরো কিউএ ব্যাকআপ। প্রথম অনুমানের জন্য, অ্যাপ্লিকেশনগুলিতে সর্বদা ডেটা সমস্যা থাকে। সিস্টেমের বাইরে এই জাতীয় নিয়ন্ত্রণ ছেড়ে যাওয়া ব্যর্থতার মোডগুলিকে আমন্ত্রণ জানায় যেখানে নীরবে ডেটা নষ্ট হয়ে যায়।
এটি কার্যকর অবস্থায় দেখার জন্য কয়েক বছর ধরে ডেটা গুদামে কাজ করার মতো কিছুই নেই। আপনি অ্যাপ্লিকেশন বিকাশকারীরা নোডি ভুল করার পরে টুকরো বাছাই করতে ব্যয় করেছেন যারা ভেবেছিলেন যে তারা অ্যাপ্লিকেশন কোডটিতে ডেটা অখণ্ডতা প্রয়োগ করতে পারে। এটি করতে যে কোনও সময় ব্যয় করুন এবং আপনি উপসংহারে পৌঁছে যাবেন যে অ্যাপ্লিকেশন পরিচালিত ডেটা অখণ্ডতা একটি অহঙ্কার চেয়ে কিছুটা বেশি।
তদ্ব্যতীত, ক্যোয়ারী অপ্টিমাইজারটি টেবিলের সাথে যোগ দেয় এমন বিষয়গুলি নির্ধারণের জন্য বিদেশী কীগুলি ব্যবহার করতে পারে, সুতরাং এফকে এর আরও কার্যকর ক্যোয়ারী পরিকল্পনার ফলস্বরূপ।
পাশাপাশি বিদেশী কীগুলিতে প্রচুর অন্যান্য সুবিধা রয়েছে। প্রত্যেককে উপকার করুন - ডাটাবেসে এফকে রাখুন।
রেফারেনশিয়াল ইন্টিগ্রিটি সর্বনিম্ন সম্ভব স্তরে পরিচালনা করা উচিত, যা অন্তর্নিহিত ডাটাবেস হবে। রিলেশনাল ডেটাবেস ম্যানেজমেন্ট সিস্টেমগুলি এটি পরিচালনা করতে অনুকূলিত হয়েছে। প্রবাদবাক্যটি পুনরায় উদ্ভাবন করার কোনও অর্থ নেই।
এমনকি ডিআইএমএল স্টেটমেন্টটিকে আরআই ব্যতিক্রম করতে না পারায় অ্যাপ্লিকেশন কোডে ডোমেন লজিক সংজ্ঞায়িত করা গ্রহণযোগ্য, তবে এটি ডাটাবেসে বিদেশী কী সম্পর্কের প্রতিস্থাপন হিসাবে দেখা উচিত নয়।
আমি এখানে একটি অঙ্গ প্রত্যাহার করতে যাচ্ছি এটি সম্পূর্ণরূপে প্রত্যাশা করে যে এটি একটি ডিবিএ-কেন্দ্রিক গোষ্ঠী হওয়ায় নিচে ভোট হবে।
আমি একমত যে কঠোর বিদেশী কী ব্যবহার করা বেশিরভাগ পরিস্থিতিতে সেরা সিদ্ধান্ত the যাইহোক, কিছু ক্ষেত্রে রয়েছে যেখানে বিদেশী কীগুলি সমাধানের চেয়ে আরও বেশি সমস্যা সৃষ্টি করে।
আপনি যখন খুব উচ্চতর ট্র্যাফিক ওয়েব অ্যাপ্লিকেশনের মতো অত্যন্ত পরিবেশগত পরিবেশের সাথে ডিল করছেন এবং একটি সুপ্রতিষ্ঠিত, শক্তিশালী ওআরএম ব্যবহার করছেন তখন বিদেশী কীগুলি লকিংয়ের সমস্যা সৃষ্টি করতে পারে যা একটি সার্ভারকে স্কেলিং এবং বজায় রাখা কঠিন করে তোলে। চাইল্ড টেবিলে সারিগুলি আপডেট করার সময়, প্যারেন্ট সারিটিও লক থাকে। অনেক পরিস্থিতিতে, লক করার বিরোধিতার কারণে এটি সামঞ্জস্যতা মারাত্মকভাবে সীমাবদ্ধ করতে পারে। অতিরিক্তভাবে, কখনও কখনও আপনাকে পৃথক টেবিলগুলিতে রক্ষণাবেক্ষণ করতে হয়, যেমন সংরক্ষণাগার প্রক্রিয়াগুলি যেখানে আপনার প্রয়োজন হতে পারে (ইচ্ছাকৃতভাবে) সাময়িকভাবে সাময়িকভাবে রেফারেনশিয়াল অখণ্ডতা বিধিগুলি ভঙ্গ করতে হবে। বিদেশী কীগুলি স্থানে থাকা, এটি অবিশ্বাস্যরূপে কঠিন হতে পারে এবং কিছু আরডিবিএমএস বিদেশী কী সীমাবদ্ধতাগুলি অক্ষম করার ফলে টেবিলটি পুনর্নির্মাণের কারণ হতে পারে, একটি সময় সাপেক্ষ প্রক্রিয়া যার জন্য যথেষ্ট ডাউনটাইম প্রয়োজন হতে পারে।
বুঝতে হবে যে আমি আপনাকে সাবধান করে তুলছি যে আপনাকে অবশ্যই একটি শক্তিশালী কাঠামো ব্যবহার করতে হবে যা ডেটাবেসের বহিরাগত রেফারেন্সিয়াল অখণ্ডতা বুঝতে সক্ষম। তবুও, আপনি সম্ভবত কিছু রেফারেন্সিয়াল অখণ্ডতা ইস্যু দিয়ে শেষ করতে হবে। তবে এমন অনেকগুলি ক্ষেত্রে রয়েছে যেখানে অনাথ সারি বা সামান্য রেফারেন্সিয়াল অখণ্ডতা লঙ্ঘন করা এত বড় চুক্তি নয়। আমি যুক্তি দেব যে ওয়েব অ্যাপ্লিকেশন সর্বাধিক এই বিভাগের অধীনে।
বলা হচ্ছে, কেউ ফেসবুক হিসাবে শুরু হয় না। আপনার ডাটাবেসে বিদেশী কীগুলি সংজ্ঞায়িত করে শুরু করুন। নজরদারী। যদি আপনার সমস্যা শেষ হয় তবে বুঝতে হবে আপনার সেই কয়েকটি প্রতিবন্ধকতা স্কেল করার দরকার পড়তে পারে।
উপসংহারে: বেশিরভাগ ডাটাবেসে বিদেশী কী থাকা উচিত। উচ্চতর একযোগে পরিবেশ বিদেশী কীগুলি ছাড়াই ভাল। আপনি যদি এই মুহুর্তে পৌঁছে থাকেন তবে আপনার সেই সীমাবদ্ধতাগুলি বাদ দেওয়ার বিষয়ে বিবেচনা করা প্রয়োজন।
আমি এখন আমার শিখা- retardant মামলা ডন যেতে যাচ্ছি।
সম্পাদনা করুন 2012-03-23 7:00 এএম
বিদেশী কীগুলির লকিংয়ের পরিণতিগুলি সম্পর্কে চিন্তাভাবনা করে, আমি সার্ভার লোডে যুক্ত করে অভ্যন্তরীণভাবে সমস্ত অতিরিক্ত সারি লুক্কুলের ব্যয় উল্লেখ করতে অবহেলা করেছি।
শেষ পর্যন্ত, আমার বক্তব্যটি হ'ল বিদেশী কীগুলি বিনামূল্যে নেই। বেশিরভাগ ক্ষেত্রে, ব্যয়টি মূল্যবান, তবে এমন পরিস্থিতি রয়েছে যেখানে এই ব্যয়টি তাদের সুবিধার চেয়ে বেশি।
সম্পাদনা করুন 2012-03-23 7:38 পূর্বাহ্ন
আসুন কংক্রিট হই। আমি এই উদাহরণে মাইএসকিউএল / ইনোডিবি বেছে নিচ্ছি, যা এর বিদেশী কী আচরণের জন্য খুব বেশি সম্মানিত নয়, তবে এটিই আমি সবচেয়ে বেশি পরিচিত এবং সম্ভবত সবচেয়ে বেশি ব্যবহৃত ওয়েব ডাটাবেস database আমি যে নির্দিষ্ট ডেটাবেসটি প্রদর্শন করতে চলেছি তার সাথে আরও ভাল ভাড়া দিতে পারে তা আমি নিশ্চিত নই।
পিতামাতাকে উল্লেখ করে একটি বিদেশী কী সহ একটি শিশু টেবিল বিবেচনা করুন। উদাহরণ হিসাবে, মাইএসকিউএলে সাকিলা নমুনা ডাটাবেসে ফিল্ম এবং ফিল্ম_অ্যাক্টর টেবিলগুলি দেখুন:
CREATE TABLE `film` (
`film_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`description` text,
`release_year` year(4) DEFAULT NULL,
`language_id` tinyint(3) unsigned NOT NULL,
`original_language_id` tinyint(3) unsigned DEFAULT NULL,
`rental_duration` tinyint(3) unsigned NOT NULL DEFAULT '3',
`rental_rate` decimal(4,2) NOT NULL DEFAULT '4.99',
`length` smallint(5) unsigned DEFAULT NULL,
`replacement_cost` decimal(5,2) NOT NULL DEFAULT '19.99',
`rating` enum('G','PG','PG-13','R','NC-17') DEFAULT 'G',
`special_features` set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') DEFAULT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`film_id`),
KEY `idx_title` (`title`),
KEY `idx_fk_language_id` (`language_id`),
KEY `idx_fk_original_language_id` (`original_language_id`),
CONSTRAINT `fk_film_language` FOREIGN KEY (`language_id`) REFERENCES `language` (`language_id`) ON UPDATE CASCADE,
CONSTRAINT `fk_film_language_original` FOREIGN KEY (`original_language_id`) REFERENCES `language` (`language_id`) ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8
CREATE TABLE `film_actor` (
`actor_id` smallint(5) unsigned NOT NULL,
`film_id` smallint(5) unsigned NOT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`actor_id`,`film_id`),
KEY `idx_fk_film_id` (`film_id`),
CONSTRAINT `fk_film_actor_actor` FOREIGN KEY (`actor_id`) REFERENCES `actor` (`actor_id`) ON UPDATE CASCADE,
CONSTRAINT `fk_film_actor_film` FOREIGN KEY (`film_id`) REFERENCES `film` (`film_id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
সম্পর্কিত সীমাবদ্ধতা আমার উদাহরণের জন্য ফিল্ম_অ্যাক্টর (fk_film_actor_film)।
session1> BEGIN;
session1> INSERT INTO film_actor (actor_id, film_id) VALUES (156, 508);
Query OK, 1 row affected (0.00 sec)
session2> BEGIN;
session2> UPDATE film SET release_year = 2005 WHERE film_id = 508;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
নোট করুন যে আমি শিশু টেবিলের মধ্যে whileোকানোর সময় প্যারেন্ট সারিটিতে একটি সম্পর্কযুক্ত ক্ষেত্র আপডেট করতে অক্ষম ছিলাম। এটি ঘটেছিল কারণ InnoDB সারিতে একটি ভাগ করা লক ধরে রেখেছে যেখানে ফিল্ম_এক্টরে FK সীমাবদ্ধতার কারণে ফিল্ম.ফিল্ম_আইডি = 508, সুতরাং সেই সারিতে থাকা UPDATE একচেটিয়া লকটি পেতে পারে না। আপনি যদি সেই অপারেশনটি উল্টো করেন এবং প্রথমে আপডেট আপডেট করেন তবে আপনার একই আচরণ থাকলেও INSERT ব্লক করা আছে।
session1> BEGIN;
session1> UPDATE film SET release_year = 2005 WHERE film_id = 508;
Query OK, 1 row affected (0.00 sec)
session2> BEGIN;
session2> INSERT INTO film_actor (actor_id, film_id) VALUES (156, 508);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
users
একটি ওয়েব অ্যাপ্লিকেশনটিতে এমন একটি সারণী বিবেচনা করুন যেখানে প্রায়শই ডজন ডজন সম্পর্কিত সারণী থাকে। মূলত কোনও সম্পর্কিত সারিতে যে কোনও ক্রিয়াকলাপ প্যারেন্ট সারিটিতে আপডেট আটকায়। যখন আপনার একাধিক বিদেশী কী সম্পর্ক এবং প্রচুর সম্মতি থাকে তখন এটি চ্যালেঞ্জিং সমস্যা হতে পারে।
এফকে সীমাবদ্ধতাগুলিও টেবিল রক্ষণাবেক্ষণকে চ্যালেঞ্জ হিসাবে কার্যকর করতে পারে। পারকোনার পিটার জায়েটসেভের একটি ব্লগ পোস্ট রয়েছে যা এটি আমার চেয়ে আরও ভাল ব্যাখ্যা করেছে: হাইজ্যাকিং ইনোডব বিদেশী কীগুলি ।
ডাটাবেসে বিদেশী কী ব্যবহার করা ভাল অনুশীলন। এটা সাহায্য করে-
ON DELETE CASCADE