PDA

View Full Version : سوال: بهینه ترین روش برای نمایش اطلاعات گرو ها و زیر گروه ها



as13851365
پنج شنبه 27 آبان 1389, 07:59 صبح
فرم زیر را در نظر بگیرید :
================================
برنامه نویسی (5)



دلفی (50)
وی بی (3)
جاوا (30)
سی شارپ (55)
پی اچ پی (13)


سخت افزار (3)



سخت افزار های کامپیوتر (19)
سخت افزار های ابتکاری (5)
طراحی سخت افزار (11)

================================
اطلاعات مربوط به فرم بالا در دو تا جدول قرار داره
1) جدول مربوط به گروه و زیر گروه
2) جدول مربوط به پست ها ( برای هر گروه )

من برای این که اطلاعات رو به صورت زیر نشان بدم از همچین کدی استفاده می کنم :


<?php
// انتخاب تمام گروه های اصلی
$sql = "SELECT id,name,type
FROM table1
WHERE type = 1";

$result = mysql_query($sql);
if (!$result) {
echo "Could not successfully run query ($sql) from DB: " . mysql_error();
exit;
}

if (mysql_num_rows($result) == 0) {
echo "No rows found, nothing to print so am exiting";
exit;
}

while ($row = mysql_fetch_assoc($result)) {
// انتخاب زیر گروه های هر گروه

$sql1= 'select id,name,type,idtype
from table1 where type=2 and idtype='.$row["id"];
$result1 = mysql_query($sql1);

// قرار دادن گروه اصلی به همراه تعداد زیر گروه
// begin
if (mysql_num_rows($result1) == 0) {
echo '--'.$row["name"].'(0)<br />'
}
else{
echo '--'.$row["name"].'('.mysql_num_rows($result1).')<br />';
// End

// انتخاب زیر گروه های مربوط به هر گروه
$sql2= 'select id,name,type,idtype
from table1 where type=2 and idtype='.$row["id"];

$result2 = mysql_query($sql2);
while ($row2 = mysql_fetch_assoc($result2)) {
// انتخاب تعداد پست های مربوط به هر زیر گروه
$sql3= 'select id,name
from table2 where idtype='.$row2["id"];

$result3 = mysql_query($sql3);
// قرار دادن تعداد پست های مربوط به هر زیر گروه
if (mysql_num_rows($result3) == 0) {
echo '--'.$row2["name"].'(0)<br />'
}
else{
echo '--'.$row2["name"].'('.mysql_num_rows($result3).')';
echo '<br />';

}
}// حلقه مربوط به زیر گروه ها
}
}// حلقه مربوط به گروه اصلی

?>در این روش چهار بار دستورات SQL فراخوانی شده است که دو تا از آنها داخل حلقه هستش

حالال می خواستم بدونم آیا این روش مناسب است
:متفکر: 1 ) به سرور فشار و .... وارد نمی شه ؟ ( پردازش و رم و ... )
:متفکر: 2 ) روی سرعت پردازش و لود شدن سایت تاثیر زیادی نداره ؟
:متفکر: 3 ) باعث استفاده بیش از حد از منابع سرور نشه ؟ ( در صورتی که تعداد بازدید زیاد باشه )
:خجالت: 4 ) اگه کد اصلاح شده ای دارید و یا روش بهینه تری خوشحال می شم در این تایپیک قرار دهید .

funpatogh
پنج شنبه 27 آبان 1389, 22:13 عصر
می توانید جدول را به شکل زیر طراحی کنید:

کد:

create table test ( id int auto_increment primary key not null, parent_id int, title varchar(25) ); هر عنوان ممکن است خودش زیرشاخه باشد یا نباشد اگر زیر شاخه بود شما parent_id آن را برابر id سر شاخه ی آن قرار دهید و اگر خودش سرشاخه بود و parent نداشت parent_id آن را برابر 0 قرار دهید.
برای نمایش آنها هم شما باید اول سرشاخه ها را دریافت کنید و هربار که یک سرشاخه را دریافت می کنید باید چک کنید آیا زیر شاخه دارد یا نه آگر دارد یک حلقه با دفعات تکرار تعداد زیر شاخه های آن اجرا می کنید و با استفاده از لیست ها آنها را نمایش می دهید البته اگر شما بخواهید هر زیرشاخه خودش تعدادی فرزند داشته باشد باید همین کار را برای زیرشاخه ها هم تکرار کنید.

شما هم چون تعداد زیر شاخه و تعداد مطالب داخل هر زیر شاخه رو جلوش نمایش میدهی دیگه بهینه تر نمیشه و نمیتونه از حلقه هات کم کنی

xoogle.ir
پنج شنبه 27 آبان 1389, 22:20 عصر
روشی که استفاده کردید مورد تایید هست. گمون نمیکنم راه بهتری باشه.
جواب تمام سوالاتتون هم خیر هست.

bestirani2
شنبه 29 آبان 1389, 06:01 صبح
استفاده از لوپ سمت اپلکیشن بهینه نیست چون دو محیط دیتابیس و اپلکیشن خواهیم داشت که این کار اصلاً بهینه نیست
شما نتیجه رو سمت خود اس کیو ال باید بدست بیارید و در نهایت با explain به بهترین سرعت دست پیدا کنید
قبلاً در این مورد بحث شده و یک کلاس آماده برای این کار هم توی انجمن هست
جستجو کنید

امیـرحسین
شنبه 29 آبان 1389, 14:31 عصر
واسه هدفی با این حجم، روش زیر هم روش خوبیه که با یک کوئری همه اطلاعات رو میگیره و سنگینی رو به حجم انتقال منتقل میکنه. به نظر من این روش بهتریه چون اتصال و کوئری گرفتنهای مکرر از دیتابیس زمان بیشتری تلف میکنه:
SELECT
parent.id AS parentId, parent.name AS parentName, parent.type AS parentType,
child.id AS childId, child.name AS childName, child.type AS childType,
COUNT(childChildTable.id) AS lowLevelCount
FROM theTable childTable
LEFT JOIN theTable parentTable ON parentTable.id = childTable.idType
LEFT JOIN theTable childChildTable ON childChildTable.idType = childTable.id
WHERE 1
ORDER BY parentTable.id
GROUP BY child.id
بقیه‌اش دیگه بازی با حلقه‌هاست.