@rklimcorp

Как правильно сделать структуру базы данных?

Здравствуйте, дали такое задание:

Разработать структуру данных автопарка, в котором машины делятся по типу, грузовые, автобусы, самосвалы и др. У каждой машины есть свои атрибуты (год выпуска, марка, модель, макс скорость и т.д.)
Какие именно атрибуты - это зависит от того какой это тип машины, к примеру, если самосвал - тоннаж, если автобус - количество мест.

Самое главное, что тип машины и его атрибуты должны администрироваться, т.е. администратор автопарка
может добавлять свои атрибуты редактировать старые и удалять в зависимости от того какой тип машины(грузовик, автобус, легковая). Так же чтоб была возможность поиска машины по атрибутам! Как правильно сделать структуру?

_______________________________________________________________________

Я сделал такую структуру базы данных
zEx0ggawObs.jpg
и заполнил ее соответственно такими значениями
Mh4H5AvBKgE.jpg
и сделал запрос на поиск

SELECT * 
FROM `attr_сar` ac 
inner join `cars` c on ac.id_car = c.id 
inner join `attr` a on ac.id_attr = a.id 
WHERE 
/* условие для категории */ 
(a.category_id = c.category and c.category = 1) and 
/* условие для года выпуска автомобиля*/ 
(a.id = '4' and ac.val >= 2004 AND ai <= 2008) and
/* условие для пробега автомобиля*/ 
(a.id = '3' and ac.val >= 10000 AND ai <= 90000)


Данный запрос не работает. Я думаю из за того что:
1) не правильно сделал структуру БД
2) из за того что в запросе мы имеем конструкцию типа такого select * from ... where id=3 and id=4
конструкция через IN не подойдет т.к. он работает с условием OR а мне надо конкретно автомобили с пробегом от "10000" до "90000" и годом выпуска от "2004" до "2008".

Причем запрос на поиск будет абсолютно разный всегда, это я сейчас ищу по 2 параметрам, а будет 10+.
Помогите пожалуйста
  • Вопрос задан
  • 1077 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
В такой структуре БД поиск по группе параметров делается JOIN'ами
SELECT *
  FROM `cars` AS `c`
  JOIN `cars_attr` AS `ca1` ON `ca1`.`id_car` = `c`.`id` 
    AND `ca1`.`id_attr` = 4 AND `ca1`.`val` >= 2004 AND `ca1`.`val` <= 2008
  JOIN `cars_attr` AS `ca2` ON `ca2`.`id_car` = `c`.`id` 
    AND `ca1`.`id_attr` = 3 AND `ca1`.`val` >= 10000 AND `ca1`.`val` <= 90000
  JOIN `cars_attr` AS `ca` ON `ca`.`id_car` = `c`.`id` 
  JOIN `attr` AS `a` ON `a`.`id` = `ca`.`id_attr`
  WHERE `c`.`category` = 1

или через IN
SELECT *
  FROM `cars` AS `c`
  JOIN `cars_attr` AS `ca` ON `ca`.`id_car` = `c`.`id` 
  JOIN `attr` AS `a` ON `a`.`id` = `ca`.`id_attr`
  WHERE `c`.`category` = 1
    AND `c`.`id` IN (
      SELECT `id_car` FROM `cars_attr` 
        WHERE `ca1`.`id_attr` = 4 AND `ca1`.`val` >= 2004 AND `ca1`.`val` <= 2008
    ) AND `c`.`id` IN (
      SELECT `id_car` FROM `cars_attr` 
        WHERE `ca1`.`id_attr` = 3 AND `ca1`.`val` >= 10000 AND `ca1`.`val` <= 90000
    )
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы