Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Вопрос по оптимизации и производительности. (cheezy) 10/08/2007 - 13:18:45



From: cheezy - 10/08/2007 - 13:18:45
Subject:Вопрос по оптимизации и производительности.
-----------------
Всем привет. У меня возник вопрос по оптимизации и производительности.
Сразу к делу.
Предположим, у меня есть три базы данных (структура, типы данных и планируемое количество записей совпадают с моими реальными базами):
база данных личностей, база автомобилей и третья база, которая используется для привязки автомобилей к владельцам из базы пользователей.
У каждой машины - максимум один хозяин или его нет вообще, у каждого пользователя может быть несколько машин или он может не имть машины.

<u>Cars</u>
car_id: TINYINT
model: VARCHAR(30)
...

<u>Users</u>
user_id: TINYINT
name: VARCHAR(20)
...

<u>Owners</u>
car_id: TINYINT
owner_id: TINYINT


Сразу напрашивается идея о ненужности Owners, ведь можно хранить ID владельцев в Cars или ID машин в Users. НО. Не каждый пользователь имеет машину и не каждая машина имеет хозяина.. =)
Если, например, нужно вывести список всех хозяев со своими машинами, я делаю так:

$link = ...
$query = "SELECT
owners.car_id AS o_car_id,
owners.owner_id AS o_user_id,
users.name AS u_name,
users.age AS u_age,
cars.model AS d_model
FROM
owners
LEFT JOIN users ON owners.owner_id = users.user_id
LEFT JOIN cars ON owners.car_id = cars.car_id
ORDER BY u_name";

$result = mysql_query($query, $link) or die(mysql_error());
$data = array();
while ($row = mysql_fetch_assoc($result))
{
$data[$row['o_user_id']]['cars'][$row['o_car_id']] = $row['d_model'];
$data[$row['o_user_id']]['name'] = $row['u_name'];
$data[$row['o_user_id']]['age'] = $row['u_age'];
}

print"<table>
<tr>
<th>Хозяин (Возраст) #ID</th>
<th>Машина #ID</th>
</tr>";

while (list ($user_id, $user_data) = each ($data))
{
printf("<tr><td>%s (%s) #%s</td>", $user_data['name'], $user_data['age'], $user_id);
echo "<td>";
while (list ($car_id, $car_name) = each ($user_data['cars']))
{
printf("%s #%s<br>", $car_name, $car_id);
}
echo "</td></tr>";
}
echo "</table>";

...


В результате получаем таблицу. Все работает. Даже если пользователя, указанного в OWNERS, не существует, или же нет машины с указанным CAR_ID.
Вот в чем вопрос: нельзя ли как-то по-другому сделать выборку данных?
Ведь, как видно, приходится два раза пробегать по выделенным данным: первый раз, запоминая их в массив, второй раз - извлекая их.
Загвоздка в том, что на один OWNER_ID в OWNERS может быть несколько CAR_ID. Можно ли как-нибудь сделать так, чтобы не вручную перегонять их в массив, а чтобы они сразу приходили, как массив.
Или по-другому что-нибудь организовать? Буду рад любой помощи!


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
32016



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |