View Full Version : داده های سلسله مراتبی
majid1605
شنبه 11 مرداد 1393, 00:07 صبح
+------+----------+-------+
| 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 |
+------+----------+-------+
یک جدول به صورت بالا دارم میخوام اطلاعات رو واکشی کنم به طور مثال تمام اطلاعات وابسته به id=1
miladamirzadeh
شنبه 11 مرداد 1393, 09:02 صبح
یک جدول به صورت بالا دارم میخوام اطلاعات رو واکشی کنم به طور مثال تمام اطلاعات وابسته به id=1
منظورت از وابسته چیه؟
SELECT * FROM mytable WHERE id=1
SELECT * FROM mytable WHERE parentid=1
SELECT * FROM mytable WHERE id=1 OR parentid=1
اگر مثالی از خروجی مورد نظرتون بزنید بهتر می تونیم کمکتون کنیم.
majid1605
شنبه 11 مرداد 1393, 12:32 عصر
این جدول مربوط به یک cms پرسش و پاسخه که a جواب q سوال , c کامنتهای پرسش یا پاسخ هستند وقتی id=1 واکشی میشه قطعا تمام پاسخ ها و کامنتهای مربوط به این پاسخ ها و پرسش نیز واکشی میشن .
برای مثال من جدول بالا رو یکم تغییر دادم و اگه بخوایم پرسش یک و تمام پاسخ ها و کامنتهای وابسته (مرتبط) رو واکشی کنیم :
+------+----------+-------+
| id | parentid | type |
+------+----------+-------+
| 1 | 0 | Q |
+------+----------+-------+
| 2 | 1 | A |
+------+----------+-------+
| 4 | 2 | C |
+------+----------+-------+
| 5 | 2 | C |
+------+----------+-------+
| 6 | 1 | A |
+------+----------+-------+
| 8 | 1 | C |
+------+----------+-------+
یه سوال دیگه هم دارم اینکه چهار روش کلی برای واکشی همچین داده های پیشنهاد شده بود
Adjacency list
Nested sets
Path enumeration
Closure table
کدوم راه بهتره ؟
هرچند جدول بالا ظاهرا بر اساس راه اول طراحی شده
miladamirzadeh
شنبه 11 مرداد 1393, 17:34 عصر
اونجور که من متوجه شدم در دیتابیس شما حداکثر دو عمق وجود دارد، اگر چنین باشد شاید ساده ترین راه کوئری زیر باشد:
SELECT * FROM qa WHERE id=1
UNION
SELECT * FROM qa WHERE parentid=1
UNION
SELECT * FROM qa WHERE parentid IN (SELECT id parentid FROM qa WHERE parentid=1)
ORDER BY id;
اما اگر قرار باشد پای بازدهی وسط بیاید، احتمالا این بهترین راه نخواهد بود. من هم به این نوع مساله علاقه مند شدم، قطعاً اگر به نتیجه ی مطلوبی برسم در انجمن به اشتراک خواهم گذاشت.
majid1605
شنبه 11 مرداد 1393, 17:47 عصر
این دوتا مطلب رو پیدا کردم بد نیست ببینید
http://www.slideshare.net/billkarwin/models-for-hierarchical-data
http://9px.ir/note/work-with-hierarchical-data-in-a-database
majid1605
پنج شنبه 16 مرداد 1393, 16:09 عصر
یه سوال این جدول برای استفاده از روش Adjacency List طراحی شده و تووی این روش هرجا صحبت شده از join استفاده کردن چرا؟ولی کوپری شما چندتا select که فکر کنم اینجوری پرفرمنس کمی داره ولی نتایجی که می گیریم نسبت به join منظم تره چون join دادهای دیگه رو با کوئری اول ادغام میکنه همین کوئری بالا رو میشه با join نوشت که همین نتایج رو بده؟
majid1605
چهارشنبه 22 مرداد 1393, 23:11 عصر
یک سوال دیگه داده ها بعد از واکشی چطور مورد استفاده قرار می گیرند؟
روش معمول استفاده از یک حلقه برای واکشی و استفاده از داده هاست حالی تووی این جدول وقتی یک سوال واکشی میشه کلی پاسخ و کامنت همراهش ممکنه واکشی بشه ولی این دست کوئری ها اطلاعات رو به صورت دسته بندی شده مثل جدول پست شماره 3 نمایش نمیدن مشکل دستور ORDER BY هستش برحسب id باشه ممکنه کامنتی id=5 باشه و قبلش یه پاسخ باشه که id=4 و...
یه جدول به صورت زیر :
| id | parentid | type |
+------+----------+-------+
| 1 | 0 | Q |
+------+----------+-------+
| 2 | 1 | A |
+------+----------+-------+
| 4 | 2 | C |
+------+----------+-------+
| 5 | 1 | C |
+------+----------+-------+
| 6 | 1 | A |
+------+----------+-------+
| 8 | 2 | C |
+------+----------+-------+
مشکل زمانیه که تووی تگهای html بخوایم چنین چیزی رو داشته باشیم
<div>
<div class="questin&answer">
id=0
<div class="comment">
id=1
</div>
</div>
<div class="questin&answer">
id=1
<div class="comment">
id=2
</div>
<div class="comment">
id=2
</div>
</div>
<div class="questin&answer">
id=1
</div>
</div>
در صورتیکه اطلاعات به صورت مرتب نشده باشند اگه از یک حلقه بخوایم استفاده کنیم چون حلقه به ترتیب نتایج رو واکشی میکنه نتایج به صورت اشتباه در خرجی نمایش داده می شوند
majid1605
چهارشنبه 22 مرداد 1393, 23:12 عصر
یک سوال دیگه داده ها بعد از واکشی چطور مورد استفاده قرار می گیرند؟
روش معمول استفاده از یک حلقه برای واکشی و استفاده از داده هاست حالی تووی این جدول وقتی یک سوال واکشی میشه کلی پاسخ و کامنت همراهش ممکنه واکشی بشه ولی این دست کوئری ها اطلاعات رو به صورت دسته بندی شده مثل جدول پست شماره 3 نمایش نمیدن مشکل دستور ORDER BY هستش برحسب id باشه ممکنه کامنتی id=5 باشه و قبلش یه پاسخ باشه که id=4 و...
یه جدول به صورت زیر :
| id | parentid | type |
+------+----------+-------+
| 1 | 0 | Q |
+------+----------+-------+
| 2 | 1 | A |
+------+----------+-------+
| 4 | 2 | C |
+------+----------+-------+
| 5 | 1 | C |
+------+----------+-------+
| 6 | 1 | A |
+------+----------+-------+
| 8 | 2 | C |
+------+----------+-------+
مشکل زمانیه که تووی تگهای html بخوایم چنین چیزی رو داشته باشیم
<div>
<div class="questin&answer">
id=0
<div class="comment">
id=1
</div>
</div>
<div class="questin&answer">
id=1
<div class="comment">
id=2
</div>
<div class="comment">
id=2
</div>
</div>
<div class="questin&answer">
id=1
</div>
</div>
در صورتیکه اطلاعات به صورت مرتب نشده باشند اگه از یک حلقه بخوایم استفاده کنیم چون حلقه به ترتیب نتایج رو واکشی میکنه نتایج به صورت اشتباه در خرجی نمایش داده می شوند
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.