PDA

View Full Version : شجره نامه



tabib_m
پنج شنبه 06 مرداد 1384, 21:50 عصر
با سلام و عرض احترام خدمت تمامی دوستان

من دارم یه برنامه شجره نامه نویسی مینویسم. توی این برنامه از یه سیستم استفاده کردم که به صورت زیره:
شجره نامه به صورت کامل نمایش داده نمی شود . یعنی در نمایش شجره نامه باید یک نفر مشخص شود و شجره نامه مخصوص به آن شخص نمایش داده شود. یعنی شکلی به صورت تصویر زیر در می آید. فرد اصلی به رنگ آبی نمایش داده میشود و به وسیله نقطه چین به همسرش وصل شده و از وسط نقطه چین فرزندان در زیر آن لیست میشوند. و پدر و مادر در بالای سر و برادر و خواهر ها در کنار شخصیت اصلی پدیدار میشوند.
در اینجا هر اسمی به صورت لینک بوده و میتوان با کلیک بر روی نام شخصیت ها به شجره نامه آن شخص منتقل شد . یعنی از این طریق کاربر میتواند به تمامی شجره نامه دسترسی داشته باشد.(اگر اشتباه میکنم راهنماییم کنید.) البته این تصویری که در ضمیمه گذاشته ام ناقص است. یعنی من هنوز برنامه ام را تکمیل نکرده ام. من میخواهم رابطه شخص مورد نظر با یک شخصیت اصلی که برای شجره نامه در نظر گرفته میشود مشخص شود. یعنی در صورتی که شخصیتی که در حال نمایش است نواده شخصیت اصلی باشد تمامی اجداد رابط یعنی پدر ، پدربزرگ ، مادر پدربزرگ و ... به زیر هم نمایش داده شوند تا به شخصیت منتخب برسیم.

یک تیبل شخصیات داریم که فیلد های آن عبارت اند از:
id, name, family, father_id,mother_id,و ...

هر شخصیت یک رکورد دارد که در آن آیدی خودش و آیدی پدر و مادرش مشخص شده است.
یعنی میتوان نام پدر و مادر و حتی برادرها و خواهرها را بدست آورد.

و اما مشکل من:

من میخواهم بفهمم که آیا شخصیت منتخب با شخصیت اصلی شجره نامه ارتباط دارد یا نه (یعنی نواده است یا نه) آیا تنها راه این است که تمامی اجداد شخص مورد نظر رو جست و جو کنم و ببینم که آیا در میان آنها id شخصیت اصلی هست یا نه؟

این کار به نظر من برنامه را خیلی سنگین میکند.
راه دیگه ای نیست؟

از شما کمک میخواهم.

oxygenws
جمعه 07 مرداد 1384, 04:33 صبح
امیدوارم منظورت رو درست فهمیده باشم!!! برای توضیح بهتر، دو شخصیت زیر رو توضیح بده!!! "شخصیت منتخب با شخصیت اصلی"

برای حرکت درختی در بانک، در MySQL، تابعی نداریم....
اما مثلا در اوراکل، چنین چیزی به راحتی ممکن می باشد :)

tabib_m
جمعه 07 مرداد 1384, 15:00 عصر
منظور از شخصیت منتخب ، شخصیتیه که الآن داریم شجره نامش رو میبینیم. یعنی صفحه مربوط به اون بازه که این صفحه شامل نامهای پدر ، مادر ، برادر ها و خواهر ها ، همسر و فرزندان شخصیت منتخب است. همون طور که در تصویر نمایش داده شده. شخصیت منتخب در تصویر "هدی" است. ولی شخصیت اصلی در حقیقت شخصیت اصلی تمام شجره نامه است. یعنی من میگم توی کل برنامه یک شخصیت اصلی انتخاب میشه و وقتی که میخوایم شجره نامه شخص منتخب رو ببینیم ، در صورتی که شخصیت منتخب یکی از نوادگان شخصیت اصلی باشه اونوقت رابطه شخصیت منتخب با شخصیت اصلی مشخص میشه یعنی در بالای صفحه شخصیت اصلی ، بعد فرزند اون ، بعد نوه اون و به همین ترتیب تا به پدر یا مادر شخصیت منتخب برسیم یعنی من یه چیزی مثل تصویر زیر میخوام.
فقط مشکل من طریقه بدست آوردن ارتباط شخصیت منتخب با شخصیت اصلیه. تنها راهی که به نظرم رسید اینه که بیام تمامی اجداد شخصیت منتخب رو سرچ کنم، بعد ببینم که آیا شخصیت اصلی توی اونها هست یا نه. که به نظرم این کار برنامه رو خیلی سنگین میکنه.

oxygenws
شنبه 08 مرداد 1384, 09:40 صبح
فقط مشکل من طریقه بدست آوردن ارتباط شخصیت منتخب با شخصیت اصلیه. تنها راهی که به نظرم رسید اینه که بیام تمامی اجداد شخصیت منتخب رو سرچ کنم، بعد ببینم که آیا شخصیت اصلی توی اونها هست یا نه. که به نظرم این کار برنامه رو خیلی سنگین میکنه.

تنها راه همینه..... (جواب قبلیم درست بود)
در نسخ فعلی MySQL و فکر کنم همه بانک های دیگه غیر از اوراکل، این امکان وجود نداره.
برنامه سنگین میشه، اما به نظر میرسه هیچ راه دیگه ای نباشه.

فقط یک احتمال هست..... اونم اینه که اگر کمی رو ساختار بانکت فکر کنی یا از یکی دو تا بانک کمکی استفاده کنی، ممکنه بتونی این کار رو کلی بهینه کنی....

می تونی توی اینترنت دنبال عباراتی مثل recursive query بگرد.

ممنون میشم من رو هم در جریان بذاری :)

tabib_m
شنبه 08 مرداد 1384, 18:30 عصر
ممنونم از راهنماییتون

یه راه حل دارم ، ازتون میخوام اگه مشکلی داره بهم بگید:

در تیبل شخصیات یک فیلد اضافه میکنیم که یکی از مقادیر ترو یا فالس رو میگیره
در صورت ترو بودن فیلد برای هر شخصیت نشانگر این باشه که این شخصیت نواده شخصیت اصلی شجره نامه است. یعنی در صورتی که شخصیت اصلی تغییر کرد ، برنامه فقط کافیه یک بار از بالا شروع کنه و رکورد های بچه های شخصیت اصلی رو آپدیت کنه و مقدار ترو رو به فیلد جدید بده و به همین ترتیب نوه ها و ...

در این صورت هر کس نواده باشه مشخص میشه. اونوقت برای نمایش هر کدوم خیلی سریع میدونیم که اون نواده هست یا نه.
البته باز هم یه مشکل دیگه دارم:
شخصیت منتخب میتونه با شخصیت اصلی بیش از یک رابطه داشته باشه. یعنی ممکنه هم از طرف مادری نواده باشه و هم از طرف پدری. حالا اینجا من باید یک راه رو انتخاب کنم.
باید چیکار کنم؟؟

oxygenws
یک شنبه 09 مرداد 1384, 12:54 عصر
من روشت رو درست نفهمیدم!!
ولی به هر حال روشی خوبه که مشکل نداشته باشه.

در نهایت تاکید می کنم که بانک هایی مثل اوراکل..... روشی تو مایه های چندین کوئری رو اجرا می کنند.... (البته در اون حالت بانک نمی دونه که --حتما-- باید این کار رو انجام بده) اما ممکنه راه سریع تری باشه.... باز هم فکر و جستجو کن :)

tabib_m
یک شنبه 09 مرداد 1384, 19:49 عصر
ممنون از راهنماییتون