







|
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,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
32016
|
|