PDA

View Full Version : پیاده سازی درخت در SQL



Developer Programmer
شنبه 17 اردیبهشت 1390, 11:56 صبح
فرض کنین برای تعریف یه موجودیت میخواین جدول طراحی کنین اما این موجودیت میتونه زیر مجموعه داشته باشه و هر کدوم از زیر مجموعه ها مرتبا رشد میکنن... چیزی شبیه درخت در ساختمان داده ها.

طراحی جدول در SQL برای پیاده سازی درخت پیاده سازی کرد و چطور جدول رو باید پیمایشش کرد؟

Salah Sanjabian
شنبه 17 اردیبهشت 1390, 13:47 عصر
سلام. من تنها موردی که تاحالابهش برخورده بودم(البته شبیه این زیاده) ، مربوط به موجودیت درس در یک دیتابیس مدرسه بود.یا همون Rerefrencing
به این صورت که هر درسی میتونه چند تا پیش نیاز داشته باشه و اون درس هم میتونه باز پیش نیاز درسای دیگه باشه
به این صورت میشه پیادش کرد

Id Name Parentid

به این صورت که id کلید اصلی ماخواهد بود و parent id کلید خارجی ماست که به کلید اصلی همین جدول جاریمون رفرنس پیدا میکنه.که میتونه null باشه.البته اولین رکورد(ریشه) باید parentid ش null باشه چون فعلا رکوردی ثبت نشده:چشمک:

Developer Programmer
شنبه 17 اردیبهشت 1390, 14:08 عصر
خوب اگه هر گره به چند گره دیگه اشاره کنه، نمیشه با این حالت پیمایش کرد.

Salah Sanjabian
یک شنبه 18 اردیبهشت 1390, 12:06 عصر
من دقیقامتوجه منظورتون نمیشم.
تو اون مثال هر گره ای میتونه چندین زیر گره یاهمون child داشته باشه و خودش هم میتونه child چندین گره باشه
و میتونید با join همین جدول باخودش کل اطلاعات رو پیمایش کنید

tooraj_azizi_1035
چهارشنبه 21 اردیبهشت 1390, 12:05 عصر
سلام رفیق،
برای ذخیره درخت تو جدول باید یک فیلد ChildID و یک فیلد ParentID داشته باشی بعد یک Join بین ChildID (که کلید اصلی هست) و ParentID (که کلید خارجی هست) ایجاد کنی که به Self Referential Join مشهور هست. بعد توی Application باید به روش بازگشتی درخت رو پیمایش کنی:



private void TraverseNode(TreeNode node)
{
foreach nd in node.nodes
//do what you want
end loop

foreach nod in node.nodes
TraverseNode(nd) // این خط خود تابع را صدا می زند یعنی بازگشتی
end loop
}


تابع بالا شبه کد هست که ابتدا باید گره ریشه رو پاس بدی بقیه Node ها رو خودش پیمایش می کنه.

Developer Programmer
چهارشنبه 21 اردیبهشت 1390, 12:26 عصر
این منطق رو از درس ساختمان داده ها می دونستم. تصور من اینه که SQL قاعدتا توابع خاص خودش رو برای پیمایش درخت داره و میشه با کوئری و Select کردن ها ستونها رو پیمایش کرد. والا احتمالا پیچیدگی الگوریتم بالا در دیتابیس نباید جالب باشه

tooraj_azizi_1035
چهارشنبه 21 اردیبهشت 1390, 13:30 عصر
این لینک معادل کد بالا رو با کد SQL پیاده کرده: http://www.codeproject.com/KB/database/RecursiveSQL.aspx