|
|
|
| Так как у меня структура таблиц ещё окончательно не сформирована, прошу подсказать варианты, как лучше это сделать. Объясню всю задачу подробнее.
Есть около 200-300 игрушечных моделей машин. В обозримом будущем их кол-во может увеличиться раза в 2, может в 3, но до десятков-сотен тысяч моделек дело не дойдет, т.ч. варианты с гигантскими таблицами нестрашны. Каждая игрушечная модель имеет своего производителя. Производители им присваивают номер модели. У одного это просто 3-значное число, у другого комбинация букв и цифр. Каждая игрушечная модель имеет свой реальный прототип, например, Феррари, Ламборджини и т..д. О реальном машине надо знать марку и эмблему. Реальные машины участвовали в гонках, соответственно у них есть год, когда она гонялась, и есть пилот. Иногда один, иногда два, правда есть одна модель, у которой 3 пилота. О пилотах надо знать Имя/фамилия, фотография, из какой он страны (а для страны нужен флаг). Также пилот один год мог гоняться в одной команде,затем в другой команде. Из одной страны может быть много пилотов.
Нужно создать каталог игрушечных моделей. Пользователь может захотеть просмотреть модели по: 1 - производителю игрушечной модели; 2 - производителю реальной машины; 3 - по году участия в гонках. При любом из этих вариантов на экран выводится список тех моделей, который удовлетворяет одному из этих трех критериев поиска.
Я начал делать таблицы следующим образом. Таблица Страна (национальность гонщиков)- поле с названием страны и флагом (название графического файла). Таблица Пилоты - имя/фамилия (объединил в одно поле), национальность, фотография пилота. Таблица Производитель реальной модели - фирма, эмблема. И Таблица Моделей, куда я записываю - код модели, производитель, фотография игрушечной модели, производитель реальной модели, год когда принимала участие в гонках, имя/фамилия пилота. Вот тут и возник вопрос, сколько полей для пилотов создавать в этой таблице. Если создавать поле Пилот1 и поле Пилот2, то второе поле часто может быть пустое, и как тогда будет работать запрос с Left/right join'ами.
Так же интересует вопрос какие бы вы делали таблицы и как их связывали бы. | |
|
|
|
|
|
|
|
для: zuka86
(05.08.2010 в 00:50)
| | Иногда один, иногда два, правда есть одна модель, у которой 3 пилота.
оппачки.. "вот оно что Михалыч" :)
а если завтра появиться модель у которой было 10 гонщиков? будет полная седалище))
об этом я и говорил ранее. В любом случае таблицу нужно спроектировать так, что бы количество пилотов было вообще не ограничено
Я бы посоветовал вот что:
таблица compiya - связь команды с пилотом
id | com_id | pilot_id | year
где
id - идентификатор строки
com_id - идентификатор команды
pilot_id - идентификатор пилота
year - год в котором пилот выступал за эту команду
Причем если пилот выступал в этой команде два и более года, то соответственно записей (строк) в таблице будет две и более и отличаться они будут только полем года.
кстати вопрос на засыпку, может ли команда в один год принадлежать одной стране, а в другой год быть продана и принадлежать другой стране?
___
Сегодня поздно уже, а вопрос определения структуры таблиц достаточно серьезный, но думаю дня за два-три управимся :)
возможно в эту же таблицу можно будет добавить идентификатор машины, завтра подумаем | |
|
|
|
|
|
|
|
для: Valick
(05.08.2010 в 01:28)
| | кстати вопрос на засыпку, может ли команда в один год принадлежать одной стране, а в другой год быть продана и принадлежать другой стране?
Де-юре новая страна может выдать свою автогоночную лицензию, но де-факто производство и/или подготовка машин будет производиться на старой базе в старой стране. Страна, которой принадлежит команда - только формальность, которую лучше опустить. Другое дело что при продаже новому владельцу, как правило, меняется название команды. Поэтому в таблицу Команды надо записывать новое название и считать её никак не связанной с предыдущем названием. | |
|
|
|
|
|
|
|
для: zuka86
(05.08.2010 в 09:57)
| | считать её никак не связанной с предыдущем названием
в таблице которую я предложил это без проблем.
По поводу национальности пилотов, я думаю тоже можно ограничиться страной где пилот родился, потому как кто-то может иметь двойное гражданство. | |
|
|
|
|
|
|
|
для: Valick
(05.08.2010 в 10:34)
| | Да, страну берем только одну.
Ещё какие-нибудь советы, как построить таблицы будут? | |
|
|
|
|
|
|
|
для: zuka86
(07.08.2010 в 15:50)
| | угу...
таблица стран
country
cou_id | name | flag
где:
cou_id - идентификатор страны
name - название страны
flag - название картинки с флагом
таблица пилотов
pilots
pil_id | name | fam | foto | cou_id
где:
pil_id - идентификатор пилота
name - имя
fam - фамилия
foto - название фотографии пилота
cou_id - идентификатор страны
таблица команд
com_id | name | shild | about | trener | sponsor
где:
com_id - идентификатор команды
name - название команды
shild - эмблема команды
about - описание команды, история, достижения.
trener - главный тренер (для примера)
sponsor - главный спонсор (если конечно спонсор постоянный..
ну или еще куча всяких полей относящихся к команде)
таблица связи команды с пилотом и машиной (получилась таблица именно соревнований)
compiya
piy_id | com_id | pil_id | avt_id | year | gonka | trassa
где
piy_id - идентификатор строки (идентификатор соревнований)
com_id - идентификатор команды
pil_id - идентификатор пилота
avt_id - идентификатор автомобиля
year - год в котором пилот выступал за эту команду на этом авто
gonka - название гонки (обычно их как-нить называют)
trassa - название трассы
таблица автомобилей
avto
avt_id | venavto | marka | class | vin | shild | fotoavto | venmodel | fotomodel
где:
avt_id - идентификатор автомобиля
venavto - производитель автомобиля
marka - марка автомобиля
class - еще какая-нить служебная информация... можно выкинуть это поле
как можно добавить много полей с характеристиками автомобиля
(объем, макс скорость, число колес, тип кузова, цвет (потому как
реч идет о конктетном автомобиле, а не о серии автомобилей), тип двигателя и тд)
vin - если достанете VIN-номер реального автомобиля, то я думаю это будет ценная информация для фанатов гонки :)
shild - эмблема производителя автомобиля
fotoavto - фото реального автомобиля
venmodel - производитель модельки
fotomodel - фотомодельки :)
и например таблица с фотографиями аварий автомобилей (ее можно и потом добавить)
crash
cra_id | avt_id | foto | piy_id
где:
cra_id - идентификатор строки
avt_id - идентификатор авто
foto - имя фотографии с аварией автомобиля
piy_id - идентификатор из таблицы compiya
|
в таблицу автомобилей можно добавлять сколь угодно много автомобилей даже если все параметры будут одинаковые, отличаться они будут только id и vin-номером
так же и в таблицу аварий можно добавить сколь угодно много фоток связав их с конкретными автомобилями, пилоты тоже могут иметь даже одинаковые имя и фамилию и даже страну (и даже фото если они двойняшки, но это врядли :) )
в принципе информацию о соревнованиях тоже скорее всего лучше вынести в отделную таблицу (gon_id | year | gonka | trassa) вставив в таблицу compiya идентификатор соревнований gon_id | |
|
|
|
|
|
|
|
для: Valick
(05.08.2010 в 10:34)
| | Valick , спасибо, сделал по твоему примеру таблицу Команда_гонщик_модель (ещё тут же есть поля год и гонка). Если на одной машине выступали 2 гонщика, я в эту таблицу заношу две записи, отличающиеся по гонщикам. Вот сейчас и возникает главный вопрос. Если в таблице есть 2 такие похожие записи, где только гонщики отличаются, надо их найти и вывести так, чтобы возле модели было бы оба гонщика.
Когда я делаю запрос, я записываю его так: $modrow = mysql_fetch_array($models); (хотя вместо mysql_fetch_array возможно нужна другая функция, просто я в них ещё не разобрался, какая к чему).
потом вывести на экран можно так:
do
{
.....
}
while ( $modrow = mysql_fetch_array($models) );
Так оно, конечно, выводит две такие похожие записи по отдельности. Я понимаю надо сделать проверку следующей строки в $modrow с помощью If, и если у двух записей всё, кроме гонщиков, одинаковое, эти 2 записи вывести за раз.
Вопрос, как обратиться к следующей строке в $modrow. Этот массив индексированный? | |
|
|
|
|
|
|
|
для: zuka86
(09.08.2010 в 22:39)
| | Сожгите диск с видеокурсом Е Попова!!! :)
Раз уж Вы попали на этот форум, то Попов Вам не советчик)
Этот массив индексированный?
Выборку лучше производить по средствам mysql_fetch_assoc() - эта функция возвращает ассоциативный массив строки
mysql_fetch_array() - возвращает два массива, индексный и ассоциативный
Не используйте do while() по крайней мере так как это предлагает делать Попов.
использовать нужно цикл while()
while($modrow = mysql_fetch_array($models)){
echo "<PRE>";
print_r($modrow);
echo "</PRE>";
}
|
думаю разберетесь, ключ массива - название поля, ну а значение массива соответственно значение поля
но вывод это не так страшно как кажется, гораздо сложнее составить грамотный запрос к БД.
_____
по поводу двух одинаковых записей не совсем понятно, покажите запрос | |
|
|
|
|
|
|
|
для: zuka86
(05.08.2010 в 00:50)
| | Записи почти одинаковые
В таблице Команда_Гонщик_Модель есть, например, 3 записи
id | team_name | driver_id | my_models_code | year | race
1 | Ferrari | Ivanov | F1 | 1980 | GP Mexico
2 | Ferrari | Petrov | F2 | 1981 | GP Italy
3 | Ferrari | Sidorov | F2 | 1981 | GP Italy
Так как у меня каталог моделей, надо вывести в таком виде:
F1 Ferrari Ivanov 1980 GP Mexico
F2 Ferrari Petrov, Sidorov 1981 GP Italy
Запросом вся нужная инфо выбирается нормально
$viborteam = "SELECT
team_driver_model.id as id,
team_driver_model.team_name as team_name,
team_driver_model.driver_id as driver_id,
team_driver_model.my_models_code as my_models_code,
team_driver_model.year as year,
team_driver_model.grandprix as grandprix,
modelslist.my_models_code as my_models_code2,
modelslist.models_code as models_code,
modelslist.author as author,
modelslist.models_photo as models_photo,
modelslist.team as team,
modelslist.cars_code as cars_code,
drivers.driver_id as driver_id2,
drivers.country as country,
drivers.driversphoto as driversphoto,
countries.country as country2,
countries.flag as flag,
teams.team_name as team_name2,
teams.logo as logo,
teams.description as description
FROM team_driver_model JOIN modelslist JOIN teams JOIN drivers JOIN countries
ON team_driver_model.driver_id=drivers.driver_id AND drivers.country=countries.country AND
team_driver_model.team_name= teams.team_name AND team_driver_model.my_models_code=modelslist.my_models_code
WHERE team_driver_model.team_name='$usermodels'
ORDER BY team_driver_model.my_models_code" or die("Ne mogu vipolnitj takoj SELECT");
|
Затем
$models = mysql_query($viborteam) or die( 'netu resulta' );
$modrow = mysql_fetch_assoc($models);
|
Т.к. записи отсортированы по my_models_code, то хотелось бы проверить, если следующая запись (где id=3 из примера выше) имеет такой же код модели, и если команда, год и гонка совпадают, то вывести первую запись (где id=2 из примера выше) + к ней добавить гонщика из второй записи (где id=3 из примера выше), чтобы получить что Петров и Сидоров как бы относятся к одной модели. А затем вторую запись (где id=3 из примера выше) больше не выводить, а переходить к выводу записи, где id будет равен 4. | |
|
|
|
|