Sql ट्रिगर्स के बारे में इंटरनेट पर पहले से ही बहुत सारे लेख हैं, लेकिन मैं उन लोगों के लिए सामग्री को ठीक करने के लिए पर्याप्त उदाहरणों के साथ एक और जोड़ दूंगा जो "विषय में" हैं और उन लोगों के लिए सामग्री को बेहतर ढंग से समझने के लिए जिन्होंने ज़ेन sql को समझना शुरू कर दिया है। उसी समय और विषय पर एक चर्चा बनाएँ।
मैं तुरंत एक आरक्षण दूंगा कि मेरी राय सिर्फ मेरी राय है, यह कभी-कभी बहुत स्पष्ट है। कई कारणों से, आपको अत्यधिक भरी हुई साइटों और जटिल वेब एप्लिकेशन के साथ काम करना होगा।
एक मूल्यवान अनुभव उन पर काम करने से सीखा गया था - प्राथमिकताओं और आँकड़ों की निगरानी के लिए। इसका क्या मतलब है? यह सरल है: यदि आपके पास एक ब्लॉग है और इसमें प्रति दिन 2-3-4-10012 मिलियन आगंतुक हैं, और लेख केवल 1-2-3-3435 बार एक दिन में लिखे गए हैं (विचारों की संख्या से कम परिमाण का एक क्रम), तो लेख को बचाने की गति ( और इस की जटिलता) लेख के प्रदर्शन की गति के संबंध में, आनुपातिक रूप से कम हो सकती है। हम जितना अधिक दिखाते हैं, प्रदर्शन उतना ही महत्वपूर्ण होता है, और लेख / पृष्ठ / तालिका का संरक्षण नहीं होता है। जिसका मतलब यह नहीं है कि आप आराम कर सकते हैं। एक ब्लॉग में 3-5-10 सेकंड के लिए एक लेख को सहेजना पर्याप्तता के ढांचे के भीतर है, लेकिन 2 सेकंड से अधिक के लिए एक पृष्ठ उत्पन्न करना (+ जबकि चित्रों के साथ स्क्रिप्ट और शैलियों को लोड किया जाता है) "क्या एक धीमा साइट है, मैं किसी और को पढ़ा हूँ" के कगार पर है। , और इससे भी बदतर, "मैं दूसरी जगह खरीदूँगा।"
यदि हम एक वोट / कर्म, टिप्पणियों, पृष्ठ प्रदर्शन काउंटर, आदि के साथ एक औसत साइट लेते हैं, तो कई डेवलपर्स तुरंत निर्माण के साथ आते हैं जैसे कि सेलेक्ट काउंट (*) कमेंट से। खैर, रेटिंग की मात्रा, टिप्पणियों की मात्रा की गणना करने के लिए प्रत्येक लेख के बारे में सोचें। और, हमारे पास प्रत्येक खंड से मुख्य पृष्ठ 10 लेख हैं। प्रति सेकंड 10 लोगों के ट्रैफ़िक के साथ, औसत VPS पर, आप प्रति पृष्ठ 60-100 प्रश्न प्रति पृष्ठ (hi, bitrix) वहन कर सकते हैं।
लेकिन गीत के साथ नरक (मुझे यह पहले से ही मिला, शायद)। नग्न डेटा:
टेबल ब्लॉग
CREATE TABLE IF NOT EXISTS `blog` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(128) NOT NULL,
`text` text NOT NULL,
`creation` datetime NOT NULL,
`modification` datetime NOT NULL,
`img` varchar(128) NOT NULL DEFAULT 'default.png',
`status` tinyint(4) NOT NULL DEFAULT '2',
`user_id` int(11) NOT NULL,
`rate` int(11) NOT NULL,
`relax_type` tinyint(4) NOT NULL,
`timers` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`contest` tinyint(1) NOT NULL DEFAULT '0',
`views` int(11) NOT NULL DEFAULT '0',
`comment` int(11) NOT NULL,
`url` varchar(128) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `url` (`url`),
KEY `country_id` (`country_id`),
KEY `user_id` (`user_id`),
KEY `status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1456435 ;
comments
CREATE TABLE IF NOT EXISTS `comments` (
`owner_name` varchar(50) NOT NULL,
`owner_id` int(12) NOT NULL,
`id` int(12) NOT NULL AUTO_INCREMENT,
`parent_id` int(12) DEFAULT NULL,
`user_id` int(12) DEFAULT NULL,
`text` text,
`creation` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`status` int(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `owner_name` (`owner_name`,`owner_id`),
KEY `parent_id` (`parent_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=243254252 ;
, ( comment).
:
1. —
2. / — .
, — .
, 2 ( 3): ( — («», . .).
, .
: .
:
CREATE TRIGGER `add_count_comment` AFTER INSERT ON `comments`
FOR EACH ROW BEGIN
//
UPDATE user SET user.countcomment= user.countcomment+1 WHERE user.id = NEW.user_id;
//
CASE NEW.`owner_name`
WHEN 'Blog' THEN UPDATE `blog` SET `blog`.`comment` = `blog`.`comment`+1 WHERE `blog`.id = NEW.`owner_id` ;
WHEN 'Article' THEN UPDATE `article` SET `article`.`comment` = `article`.`comment`+1 WHERE `article`.`id` = NEW.`owner_id` ;
WHEN 'PopulatePlace' THEN UPDATE `populate_place` SET `populate_place`.`comment` = `populate_place`.`comment`+1 WHERE `populate_place`.`id` = NEW.`owner_id` ;
END CASE;
//
// url ,
CASE NEW.`owner_name`
WHEN 'Blog' THEN SET userurl = (SELECT url FROM `blog` WHERE `blog`.id= NEW.`owner_id`);
WHEN 'Article' THEN SET userurl = (SELECT url FROM `article` WHERE article.id=NEW.`owner_id`);
WHEN 'PopulatePlace' THEN SET userurl = ``;
END CASE;
// ,
CASE NEW.`owner_name`
WHEN 'Blog' THEN SET usertitle = (select title from `blog` where blog.id=NEW.`owner_id`);
WHEN 'Article' THEN SET usertitle = (select title from `article` where article.id=NEW.`owner_id`);
WHEN 'PopulatePlace' THEN SET usertitle = ` `;
END CASE;
INSERT INTO user_has_events VALUES (NEW.user_id,NEW.id,"Comments",NOW(),userurl , usertitle );
END
:
CREATE TRIGGER `del_count_comment` AFTER DELETE ON `comments`
FOR EACH ROW BEGIN
UPDATE user SET user.countcomment= user.countcomment -1 WHERE user.id = OLD.user_id;
CASE OLD.`owner_name`
WHEN 'Blog' THEN UPDATE `blog` SET `blog`.`comment` = `blog`.`comment`-1 WHERE `blog`.`id` = OLD.`owner_id` ;
WHEN 'Article' THEN UPDATE `article` SET `article`.`comment` = `article`.`comment`-1 WHERE `article`.`id` = OLD.`owner_id` ;
WHEN 'PopulatePlace' THEN UPDATE `populate_place` SET `populate_place`.`comment` = `populate_place`.`comment`-1 WHERE `populate_place`.`id` = OLD.`owner_id` ;
END CASE;
END
, :
1. sql (, , )
2. ( . .)
3. .
4. .
5. ( 1 , «» .)
sphinx , . modification.
:
CREATE TRIGGER `ins_blog` BEFORE INSERT ON `blog`
// «» .
FOR EACH ROW BEGIN
SET NEW.modification = NOW();
END
.
:)
CREATE TRIGGER `ins_blog` BEFORE UPDATE ON `blog`
// «» .
FOR EACH ROW BEGIN
SET NEW.modification = NOW();
END
— .
sql — . sql , .
UPD: .