Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как организовать таблицы?
 
 автор: zuka86   (05.08.2010 в 00:50)   письмо автору
 
 

Так как у меня структура таблиц ещё окончательно не сформирована, прошу подсказать варианты, как лучше это сделать. Объясню всю задачу подробнее.

Есть около 200-300 игрушечных моделей машин. В обозримом будущем их кол-во может увеличиться раза в 2, может в 3, но до десятков-сотен тысяч моделек дело не дойдет, т.ч. варианты с гигантскими таблицами нестрашны. Каждая игрушечная модель имеет своего производителя. Производители им присваивают номер модели. У одного это просто 3-значное число, у другого комбинация букв и цифр. Каждая игрушечная модель имеет свой реальный прототип, например, Феррари, Ламборджини и т..д. О реальном машине надо знать марку и эмблему. Реальные машины участвовали в гонках, соответственно у них есть год, когда она гонялась, и есть пилот. Иногда один, иногда два, правда есть одна модель, у которой 3 пилота. О пилотах надо знать Имя/фамилия, фотография, из какой он страны (а для страны нужен флаг). Также пилот один год мог гоняться в одной команде,затем в другой команде. Из одной страны может быть много пилотов.
Нужно создать каталог игрушечных моделей. Пользователь может захотеть просмотреть модели по: 1 - производителю игрушечной модели; 2 - производителю реальной машины; 3 - по году участия в гонках. При любом из этих вариантов на экран выводится список тех моделей, который удовлетворяет одному из этих трех критериев поиска.
Я начал делать таблицы следующим образом. Таблица Страна (национальность гонщиков)- поле с названием страны и флагом (название графического файла). Таблица Пилоты - имя/фамилия (объединил в одно поле), национальность, фотография пилота. Таблица Производитель реальной модели - фирма, эмблема. И Таблица Моделей, куда я записываю - код модели, производитель, фотография игрушечной модели, производитель реальной модели, год когда принимала участие в гонках, имя/фамилия пилота. Вот тут и возник вопрос, сколько полей для пилотов создавать в этой таблице. Если создавать поле Пилот1 и поле Пилот2, то второе поле часто может быть пустое, и как тогда будет работать запрос с Left/right join'ами.
Так же интересует вопрос какие бы вы делали таблицы и как их связывали бы.

  Ответить  
 
 автор: Valick   (05.08.2010 в 01:28)   письмо автору
 
   для: zuka86   (05.08.2010 в 00:50)
 

Иногда один, иногда два, правда есть одна модель, у которой 3 пилота.
оппачки.. "вот оно что Михалыч" :)
а если завтра появиться модель у которой было 10 гонщиков? будет полная седалище))
об этом я и говорил ранее. В любом случае таблицу нужно спроектировать так, что бы количество пилотов было вообще не ограничено
Я бы посоветовал вот что:
таблица compiya - связь команды с пилотом
id | com_id | pilot_id | year
где
id - идентификатор строки
com_id - идентификатор команды
pilot_id - идентификатор пилота
year - год в котором пилот выступал за эту команду

Причем если пилот выступал в этой команде два и более года, то соответственно записей (строк) в таблице будет две и более и отличаться они будут только полем года.
кстати вопрос на засыпку, может ли команда в один год принадлежать одной стране, а в другой год быть продана и принадлежать другой стране?
___
Сегодня поздно уже, а вопрос определения структуры таблиц достаточно серьезный, но думаю дня за два-три управимся :)
возможно в эту же таблицу можно будет добавить идентификатор машины, завтра подумаем

  Ответить  
 
 автор: zuka86   (05.08.2010 в 09:57)   письмо автору
 
   для: Valick   (05.08.2010 в 01:28)
 

кстати вопрос на засыпку, может ли команда в один год принадлежать одной стране, а в другой год быть продана и принадлежать другой стране?

Де-юре новая страна может выдать свою автогоночную лицензию, но де-факто производство и/или подготовка машин будет производиться на старой базе в старой стране. Страна, которой принадлежит команда - только формальность, которую лучше опустить. Другое дело что при продаже новому владельцу, как правило, меняется название команды. Поэтому в таблицу Команды надо записывать новое название и считать её никак не связанной с предыдущем названием.

  Ответить  
 
 автор: Valick   (05.08.2010 в 10:34)   письмо автору
 
   для: zuka86   (05.08.2010 в 09:57)
 

считать её никак не связанной с предыдущем названием
в таблице которую я предложил это без проблем.
По поводу национальности пилотов, я думаю тоже можно ограничиться страной где пилот родился, потому как кто-то может иметь двойное гражданство.

  Ответить  
 
 автор: zuka86   (07.08.2010 в 15:50)   письмо автору
 
   для: Valick   (05.08.2010 в 10:34)
 

Да, страну берем только одну.

Ещё какие-нибудь советы, как построить таблицы будут?

  Ответить  
 
 автор: Valick   (07.08.2010 в 16:55)   письмо автору
 
   для: 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

  Ответить  
 
 автор: zuka86   (09.08.2010 в 22:39)   письмо автору
 
   для: 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. Этот массив индексированный?

  Ответить  
 
 автор: Valick   (10.08.2010 в 00:14)   письмо автору
 
   для: 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   (10.08.2010 в 13:30)   письмо автору
 
   для: 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.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования