الحذف التلقائى cascade و innodb وميزتها عن myisam

هلا السلام عليكم..

كثير منا يستخدم نوع الجداول myisam وهو رائع.. ولكن به قصور شديد لانه لا يدعم المفاتيج الاجنبيه مع ملاحظه انه يعتمدها عادى اثناء التنفيذ يعنى ما راح يعطيك خطا.. لكنه لا ينفذها..

قد تقول فى نفسك انك تستخدم مفاتيج اجنبيه وتتعامل معها برمجيا كما هو الحال فى الاقسام الاساسيه والفرعيه وربط كل قسم اساسى بقسم فرعى..

لكن شوف اذا انت راح تحذف قسم اساسى راح تحذف الاقسام الفرعيه المتعلقه به برمجيا عن طريق الاستعلامات.. ليس امر مرهق اعرف..

لكن تخيل نظام منتديات.. كل عضو له مواضيع ومشاركات ورسائل الى الاعضاء الاخرى وقد يكون ايضا جدول مخصص للاحصائيات الخاصه بالعضو و جدول الصلاحيات و جدول المجموعة و جداول كثير راح ترتبط رقم تعريف العضو..

اذا حبيت تحذف العضو و كافه نشاطه فى المنتدى راح يكون امر مزعج وقد تنسى بعض الجداول ويصير هناك حجم ذائد فى القاعده بدون فائده..

المفاتيج الاجنبيه تحل المشكله تماما ما عليك غير انك تحذف العضو فقط !!

ايضا myisam تستخدم table lock اى انها تغلق الجدول كاملا عن حدوث نفس العمليه.. مثلا عمليه الادخال تقوم باغلاق الجدول كاملا لمنع الادخال فى نفس اللحظه.. قد لا تلاحظ ذلك نظرا للسرعه لكنه يحدث..

لنفرض مثال بسيط لعضو و مواضيع و ردود على المواضيع شان نوضح الفكره..

الخطوات ببساطه لعمل مفتاح اساسى فى نظام innodb

اول شىء تعريف الحقل بتاع المفتاح العاجنبى عادى مثلا فى جدول المواضيع كالتالى


كود PHP:
   `user_idINT(250UNSIGNED NOT NULL 


الخطوه الثانيه لازم واجبارى عمل فهرسه له بمعنى index كالتالى


كود PHP:
   INDEX `threads_user_id` (`user_idASC) , 


طبعا قد ترى تعريف اندكس بطريقه مختلفه عن المذكوره وابسط قليلا لكن هذه الطريقه هى الكامله و الاصح..

الى الان هو حقل عادى ليس مفتاح اجنبى.. وهو دور الخطوه الثالثه
كود PHP:
كود PHP:
   CONSTRAINT `threads_user_id
    
FOREIGN KEY (`user_id` ) 
    
REFERENCES `my_vb`.`users` (`id` ) 
    
ON DELETE CASCADE 
    ON UPDATE NO ACTION

اول شىء ال constrain وهو بمعنى القيد.. يعنى الشىء اللى يحكم العمليه.. ويجب يكون له اسم حتى يطبع لك اسم ال contstrain اللى فشل اثناء تنفيذ العمليه..

بعدين تعريفه كمفتاح فرعى وتحديد المفتاح المربوط به فى الجدول الاساسى بتاع الاعضاء..

الخطوه الاهم وهى تحديد ما يحدث عن الحذف cascade تعنى عند حذف العضو يحذف كل ما يحمل رقم العضو كمفتاح فرعى فى جدول المواضيع..

on delete لها عده قيم منها انه يخليه فارغ ومنها cascade ومنها no action يعنى لا تسوى شىء.. وفى حاله انك اخترت انه لا يسوى شىء راح يعرض خطا ان ال constrain فشل عند حذف العضو.. لانه مرتبط بمواضيع..

on update بديهيه cascade يعنى عند تغيير المفتاح فى الجدول الاساسى يغيره لك ايضا فى الجداول الفرعيه

لكن انا شخصيا لا اغير المفاتيح الاساسيه..

الامر الاخر فى الحقلين المفتاح الاساسى والفرعى انه لازم يكونوا من نفس النوع تماما ونفس الخواص..

يعنى انا اذكر حصلت لى مشكله بسبب ان كان واحد signed والتانى unsigned ..

وللتجربه عمليه انا سارفق استعلامات تنفذها مباشره على القاعده عندك حتى تجرب وتشوف بعينك..


جدول الاعضاء

كود PHP:
كود PHP:
 -- ----------------------------------------------------- 
CREATE  TABLE IF NOT EXISTS `my_vb`.`users` ( 
  `
idINT(250UNSIGNED NOT NULL AUTO_INCREMENT 
  `
userVARCHAR(250NOT NULL 
  `
passVARCHAR(250NOT NULL 
  `
emailVARCHAR(250NOT NULL 
  `
signTEXT NOT NULL 
  `
countryVARCHAR(250NOT NULL 
  `
reg_timeINT(250NOT NULL 
  `
last_visitINT(250NOT NULL DEFAULT 
 
  
PRIMARY KEY (`id`)) 
ENGINE InnoDB 
DEFAULT CHARACTER SET utf8 
COLLATE 
utf8_general_ci
جدول المواضيع

CREATE TABLE IF NOT EXISTS `my_vb`.`threads` (
`id` INT(250) UNSIGNED NOT NULL AUTO_INCREMENT ,
`user_id` INT(250) UNSIGNED NOT NULL ,
`topic` VARCHAR(45) NOT NULL ,
`thread` MEDIUMTEXT NOT NULL ,
كود PHP:
كود PHP:
   PRIMARY KEY (`id`) , 
  
INDEX `threads_user_id` (`user_idASC) , 
 
  
CONSTRAINT `threads_user_id
    
FOREIGN KEY (`user_id` ) 
    
REFERENCES `my_vb`.`users` (`id` ) 
    
ON DELETE CASCADE 
    ON UPDATE NO ACTION

ENGINE InnoDB 
DEFAULT CHARACTER SET utf8 
COLLATE 
utf8_general_ci
طبعا مش لازم تعمل سكريبت للاشتراك و وضع المواضع.. فيك تجرب الامر مباشرة من phpmyadmin

اول شىء تضع بيانات عضو.. بعدين تضع موضوع.. بعدها جرب تحذف سجل العضو.. راح ينحذف سجل المواضيع تلقائى..

وللتطوير الامر فيك انت تسوى جدول للردود على المواضيع وتربطها بمفتاح فرعى وتضع رد بالعضو على مشاركه.. بعدها احذف الحضو تشوف انه ينحذف العضو ومواضيعه ومشاركاته تلقائى...


اذا فى اى استفسار ضعه كرد على الموضوع..

الله يوفقكمـ