• 3 رای - 4.33 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل در حذف رکورد ( بخش ، مجموعه ، زیر مجموعه)
#21
خوب باید عرض کنم که بله ما همش در حال تغییر نیستیم (دیتا بیس) بلکه مدیر (Administrator) در محیط خودش بر حسب نیاز میخواهد که لیست رو تغییراتی اعمال کند (مانند حذف) برای همین این لیست باید چنان پویایی داشته باشد که با حذف یک مورد تمامی موارد وابسته یا زیر لیست یا فرزند این مورد هم به ناچار (اصولاً و منطقی حتماً) حذف میشوند.
حالا این و چطور ینویسم که همیشه همراه DB باشه یا چرا این چرا اون و بهونه های مختلف دیگه جایز نیست چون گشتیم و پر سو جو کردم (پیر شدم) که متوجه شدم :
1- همیشه نوشتن کد PHP راه کار مناسبی نیست و البته این کار لود مشخصی را برای کاربر بر روی Forceground ایجاد میکند در صورتی که اگه در background (که توسط حالا Trigger در Mysql انجام می پذیرد) و کاربر اون فرآیند رو احساس نمیکند خیلی بهتر است (بازم به تجریه من عرض کردم) . خوب این از این که چرا حالا این مورد و اسرار داری و این بدو این خوبه.!!!ConfusedConfused
2- برای Performance بله با توجه به گفته من حق با شماست دوست عزیز(سید سجاد شاهچراغیان)
حالا اگر کسی لطف میکنه و با توجه به دانشش میتونه به من کمک کنه که واقعا ممنون. در غیر این صورت بازم ممنون.!!!RolleyesBig Grin
دوستان یاری میطلبم ممنون از همکاری و حسن نیت شما دوستان.
  پاسخ
تشکر شده توسط :
#22
(۱۳۹۲ فروردین ۰۷, ۱۲:۴۷ ب.ظ)evergreen نوشته: ... از این که چرا حالا این مورد و اسرار داری و این بد و ...

یادش به خیر یه زمانی هر کسی غلط املایی داشت می کشتیمش Big Grin

حالا:
خب این بسته به کار شما داره
ببین مثلن شما یه جدول داری که که می خای یکی از سطر ها رو پاک کنی.
اون سطر ۱۰ تا فرزند تو یه جدول دیگه داره و هر فرزند ۱۰۰۰ تا فرزند تو یه جدول دیگه.

خب تو تمام مدتی که قراره این کارا انجام بشه جداول شما قفل می شه و بار زیادی روی دیتابیس وارد می شه

برای همین برای استفاده از اینها باید به کارتون نگا کنید و توی استفاده اش دقت کنید

نمی دونم اگه اشتباه می کنم دوستان کمک کنن Smile
همه جوره اش رو داریم ظاهرن
  پاسخ
تشکر شده توسط :
#23
با عرض شرمندگی در تایپ سریع این اتفاق افتاد و اشتباه گرفتم کلید s (س) و w (ص) .
درسته من اشتباه تایپ کردم اصرار درست میباشد با عرض پوزش

دوست گرامی با توجه به گفته شما که صحیح هم هست حالا اگه بیایم همین کارو با PHP انجام بدیم که خیلی بدتر اتفاق میوفته و وب سرور و هندلینگ درخواست + استفاده از Query های بیشتر برای بدست آوردن Id ها و اینکه parent کیه و ID آن حالا چی میشه با توجه به گفته خودن که خیلی بدتره.
  پاسخ
تشکر شده توسط :
#24
کلن اگه به جا استفاده بشه بد نیست
ولی طبق مستنداتی که من خوندم استفاده ی زیاد ازش باعث می شه که سرعتت خیلی بیاد پایین و با هر کی در این مورد حرف زدم(حرفه ای ها) گفتن که بهتره سمت پی اچ پی این کارو بکنی
همه جوره اش رو داریم ظاهرن
  پاسخ
تشکر شده توسط :
#25
(۱۳۹۲ فروردین ۰۷, ۱۲:۲۸ ب.ظ)molana نوشته: ...
موافقم که برای کارای کوچیک و متوسط می شه از تریگر ها استفاده کرد Wink

اما مشکلاتی هم هست:
  • دیباگ کردنش سخته چون سمت سرور اجرا می شه
  • فقط برای sql می تونی ازش استفاده کنی
آخه عزیزم این چه صحبتی شما می کنی.
اولا بنده که از تریگرها حرف زدم، بله چرا اون اولش یکی از دوستان پیشنهاد تریگر دادند بنده هم تأیید کردم اما چندتا تاپیک بعدش گفتم که یه راه خیلی بهره دیگه هم وجود دارد اون هم اینه که شما بیای یه جدول را به خودش relation بدی و روی اون relation برای delete و update نو عملیات را تعیین کنی. در این روش شما برای delete یا update هر رکورد برای اعمال به فرزندانش و تا هر سطحی که باشد هیچ نقشی ندارید بلکه این خود دیتابیس هست این کار را برای شما می کند. این هم نمونه جدول:
[عکس: selfRelation.png]
و این هم اطلاعات بیشتر:
http://dev.mysql.com/doc/refman/5.5/en/i...aints.html
http://www.w3schools.com/sql/sql_foreignkey.asp
باز هم میگم این بهترین راه است.
سالهــــا مـــــى گــــــذرد، حادثه ها مى آید
انتظـــــار فـــــــرج از نیمـــــه خــــــرداد کشم

[عکس: ShowPicture.aspx?ID=52750d12-5d92-4286-9...height=100]
  پاسخ
تشکر شده توسط :
#26
عزیزم این اتفاق قرار نیست توی یه تیبل بیافته
همه جوره اش رو داریم ظاهرن
  پاسخ
تشکر شده توسط :
#27
سلام و خسته نباشید.

دوستان گرامی اگر بخوایم با php و sql کوئری کار کنیم میگم داستان داره نگید نه!!!! (توضیح میدم بعد با Trigger نویسی مقایسه کنید هم از نظر لود بار توجه کنید) من یه الگوریتم بنظرم میرسه که ببینم نظر شما چیه بازم میگین php بزنم یا Trigger و اینکه کد زدنشم کمک کنید همین . ممنون .

1 - اول باید ایتمی که برای حذف انتخاب شده رو ID و Parent اون را بدست بیاریم (یک select و یک delete تا اینجا).
2 - دوم باید ببینیم تو جدول این ID ایتم ما Parent ایتم دیگه ای هست یا نه (چون ممکن برگ نباشه و خودش یک پدر باشه) که اگر هست تمامی آنها را الان داریم و ادامه اگر نه برو به شماره 5 و تمام (یک select دیگه و به تعداد ایتم های بدست امده delete بزنیم تا اینجا).
3 - سوم حالا اینجا باز باید تمامی ID ایتم های پیدا شده قبلی رو برای گشتن دوباره کوئری میزنیم (این قسمت به این خاطر تکرار شده که حالت ID و Parent عوض شده و متغییرش فرق میکنه) حالا این قسمت تو حلقه میوفته برای هر آیتم یعنی میشه گفت هر آیتم اگه هر چقدر فرزند داره باید کوئری خورده بشه (به تعداد هر ایتم و تعداد فرزندانش select و delete تکرار میشود).
4 - برو به (2) تا زمانی که از ID این ایتم Parent نبود .
5 - پایان کار (تمام) .

جالا دوستان اگه این داستان درست باشه که دوست دارم نظر بدیم حالا باز کد php زدن و این همه Query زدن درسته یا نه همه این کارا را رو بسپاریم به Trigger و کاری به این کارا نداشته باشیم.Big Grin
  پاسخ
تشکر شده توسط :
#28
(۱۳۹۲ فروردین ۰۴, ۰۸:۱۶ ب.ظ)evergreen نوشته: ...
کد پی‌اچ‌پی:
CREATE TABLE IF NOT EXISTS `set` (
  `
id_setint(11NOT NULL AUTO_INCREMENT COMMENT 'ID Number of Set',
  `
id_secint(11NOT NULL COMMENT 'ID Number of Section',
  `
nametext NOT NULL COMMENT 'Name of Set',
  `
parentint(11) DEFAULT NULL COMMENT 'Parent of Set',
  
PRIMARY KEY (`id_set`)
ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='Set Of List' AUTO_INCREMENT=20 
...

(۱۳۹۲ فروردین ۰۸, ۰۶:۲۲ ب.ظ)molana نوشته: عزیزم این اتفاق قرار نیست توی یه تیبل بیافته
والا این چیزی است که توی اولین تاپیک به عنوان سوال مطرح شده که یک تیبل را در نظر دارد.
حالا اگر بیشتر از یک تبل هم باشد فرقی نمی کند. امکان پیاده سازی دارد.

نمی دونم چرا همه فکر می کنند منظور بنده استفاده از تریگرها است.
بابا نه والا، به بلا، منظورم استفاده از یک کلید خارجی ساده است نه تریگر. اینها باهم خیلی فرق می کنند.
سالهــــا مـــــى گــــــذرد، حادثه ها مى آید
انتظـــــار فـــــــرج از نیمـــــه خــــــرداد کشم

[عکس: ShowPicture.aspx?ID=52750d12-5d92-4286-9...height=100]
  پاسخ
تشکر شده توسط :
#29
کسی نیست راه حل بده همه فقط توضیح کاره خودشون رو میدن که این خوبه این بده تا الانم جواب و راهنمایی اساسی نشده دیگه داریم بیخیال میشیم تو این انجمن دنبال جواب بگردیم .

با عرض پوزش البته و خسته نباشید خدمت همه دوستان و عزیزان که خواستن منو در پیشروی هدفم کمکم کنند.Shy
  پاسخ
تشکر شده توسط :
#30
بهترین راه کار استفاده از FOREIGN KEY هست.
http://dev.mysql.com/doc/refman/5.5/en/i...aints.html
شما باید مشخص کنید که اگر یک رکورد حذف شد چه اتفاقی برای رکوردهایی بیفتد که به این رکورد اشاره دارن.
بحث پرفورمنس و ... رو بزاریم کنار مهمترین چیز صحت داده هست. وقتی شما داری این مسئله رو در سمت نرم افزار حل می کنی یه جورایی صحت داده هات از بین میره. صحت داده هات رو باید حفظ کنی. و بهترین راه حل همون FOREIGN KEY هست.
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان