• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
واکشی داده ها با join (داده های سلسله مراتبی)
#1
جدول یک cms پرسش و پاسخ رو بررسی میکردم به موضوع جالبی برخوردم به اسم داده های سلسله مراتبی
فرض کنید داده ها درون جدول به صورت زیر ذخیره شده باشند

کد:
+------+----------+-------+
|  id  | parentid | type  |
+------+----------+-------+
|  1   |     0    |   Q   |
+------+----------+-------+
|  2   |     1    |   A   |
+------+----------+-------+
|  3   |     0    |   Q   |
+------+----------+-------+
|  4   |     2    |   C   |
+------+----------+-------+
|  5   |     2    |   C   |
+------+----------+-------+
|  6   |     1    |   A   |
+------+----------+-------+
|  7   |     3    |   C   |
+------+----------+-------+
|  8   |     1    |   C   |
+------+----------+-------+
|  9   |     0    |   Q   |
+------+----------+-------+
|  10  |     9    |   C   |
+------+----------+-------+
|  11  |     9    |   A   |
+------+----------+-------+
|  12  |    11    |   C   |
+------+----------+-------+

a جواب q سوال , c کامنتهای پرسش یا پاسخ هستند وقتی id=1 واکشی میشه قطعا تمام پاسخ ها و کامنتهای مربوط به این پاسخ ها و پرسش نیز واکشی میشن .

برای مثال اگه بخوایم پرسش یک و تمام پاسخ ها و کامنتهای وابسته (مرتبط) رو واکشی کنیم :

کد:
+------+----------+-------+
|  id  | parentid | type  |
+------+----------+-------+
|  1   |     0    |   Q   |
+------+----------+-------+
|  8   |     1    |   C   |
+------+----------+-------+
|  2   |     1    |   A   |
+------+----------+-------+
|  4   |     2    |   C   |
+------+----------+-------+
|  5   |     2    |   C   |
+------+----------+-------+
|  6   |     1    |   A   |
+------+----------+-------+
به چنین خروجی چطور می تونیم دست پیدا کنیم؟چندجا سوالا پرسیدم فقط به واکشی با join اشاره کردن ولی هنوز نتونستم کئری صحیحی براش بنویسم
یه سوال دیگه هم دارم اینکه چهار روش کلی برای واکشی همچین داده های پیشنهاد شده بود
Adjacency list
Nested sets
Path enumeration
Closure table

کدوم راه بهتره ؟
هرچند جدول بالا ظاهرا بر اساس راه اول طراحی شده

هيچ اگر سايه پذيرد منم آن سايه هيچ
  پاسخ
تشکر شده توسط :
#2
دوتا اون وسط parentid شون ۲ هست، این منطق برنامه هست ؟‌‌ ( اگه آره بیشتر توضیح میدین راجع به رابطه ها ؟‌ )
اگه نه ( مثلا اشتباه تایپی بود ) خب مشکل شما با join کردن چی هست ؟
غایب
  پاسخ
تشکر شده توسط :
#3
همونطور که گفتم جدول یک cms پرسش و پاسخه و فیلد parentid ای دی نوشته های مرتبط با هم رو ذخیره میکنه
به طور مثال برای سوال (id=1) دوتا پاسخ و یک کامنت وجود داره parentid=1 و همچنین برای پاسخ (id=2) دوتا کامنت وجود داره parentid=2
حالا من میخوام بدونم چطور یه خروجی مانند جدول شماره 2 می تونم داشته باشم که اطلاعات به صورت مرتب شده باشند یعنی ابتدا خود سوال بعد اگه کامنتی مربوط به سواله واکشی (تووی سوال یک ای دی کامنت 8 هست ) بعد پاسخها و کامنتهای مربوط به هر پاسخ و...

هيچ اگر سايه پذيرد منم آن سايه هيچ
  پاسخ
تشکر شده توسط :
#4
سلام
هر چند من از این ساختارش اصلا خوشم نیومده ولی راه حل به شکل زیره به نظرم:
باید یک master id تعریف بشه تا بشه کل پست های مربوط به سوال رو استخراج کرد وگر نه مجبوری از حلقه های تو در توی پیچیده استفاده کنی.
اگه این master id تعریف بشه می تونی مثلا همه رو با ذکر نوع تو یه آرایه بذاری بعد به ترتیب زمان ارسال کنی تو نمایشش هم داده ها رو بر اساس نوعشون نمایش بدی.

من تا حالا چنین ساختاری ندیدم ولی به نظرم معقول ترین کار اینه که مثلا سوال ها تو یه جدول باشه، جواب ها تو یه جدول و کامنت ها تو جدول دیگه.
اینجوری جستجو کردن تو مقدار خاصی راحت تر می شه. به نظرم فشار به سرور هم کاهش پیدا می کنه.
  پاسخ
تشکر شده توسط :
#5
این ساختار مربوط به question2answer هستش کوپری زیر رو هم استفاده کردم تقریبا کار میکنه
http://sqlfiddle.com/#!2/20180/3
به نظرتون فراخوانی از چند جدول مختلف کار درستیه ؟
چون ممکنه جداول دیگه ایی هم وجود داشته باشه که به همراه هر پست باید فراخوانی بشه،جدول کاربران ،امتیاز،سوال،پاسخ،کامنت و....

هيچ اگر سايه پذيرد منم آن سايه هيچ
  پاسخ
تشکر شده توسط :


پرش به انجمن:


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