SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 05.02.2014 07:53:50

63ek
Участник
Зарегистрирован: 03.02.2014
Сообщений: 4

Как лучше хранить большой список параметров в MySQL? Проектирование структуры

Имеется много элементов, например "машины" и у каждого элемента есть большое количество разных параметров, например: грузовая, новая, ремонт, автомат, левыйруль и тд...

Раньше мы хранили все следующим образом:

CREATE TABLE IF NOT EXISTS `example` (
  `id_car` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `a` tinyint(1) unsigned NOT NULL,
  `b` tinyint(1) unsigned NOT NULL,
  `c` tinyint(1) unsigned NOT NULL,
  PRIMARY KEY (`id_car`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Сейчас появилась задача изменить структуру, чтобы дать возможность пользователям добавлять новые параметры - подобно тому как в toster.ru добавляются теги для каждого вопроса. Подскажите как правильно организовать подходящую структуру в БД?

Неактивен

 

#2 05.02.2014 14:01:45

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Как лучше хранить большой список параметров в MySQL? Проектирование структуры

Классика жанра: машины, параметры, таблица связей (id_машаны, id_параметра).

Неактивен

 

#3 05.02.2014 14:50:19

63ek
Участник
Зарегистрирован: 03.02.2014
Сообщений: 4

Re: Как лучше хранить большой список параметров в MySQL? Проектирование структуры

vasya написал:

Классика жанра: машины, параметры, таблица связей (id_машины, id_параметра).

Насколько накладно будет использование IN() для вывода ID машины по параметрам IN(A,B,C)... ожидаемое кол-во строк в таблице > 30 000 000... при использовании уникалльного индекса на (id_машины, id_параметра). Какие подводный камни ждут с IN?

Неактивен

 

#4 05.02.2014 15:42:08

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Как лучше хранить большой список параметров в MySQL? Проектирование структуры

Посмотрите FAQ №5
Если вы ищите по параметрам, то вам нужен индекс (id_параметра, id_машины) или (id_параметра)

P.S. Кто знает, когда делается пересечение индексов, есть ли доп расходы в случае составного? Что будет проще покрывающий составной (id_параметра, id_машины) или (id_параметра) в случае поиска по параметрам типа IN(список параметров)?

to 63ek
Практика критерий истины. Проверьте оба варианта и поделитесь результатом.

Неактивен

 

#5 13.02.2014 10:26:04

MaximCarrera
Участник
Зарегистрирован: 08.08.2013
Сообщений: 12

Re: Как лучше хранить большой список параметров в MySQL? Проектирование структуры

В принципе, можно извратиться и хранить перечень параметров через поле, чем-то похожее на регистр флагов процессора, со списком параметров в нём. Логически это оправдано, но насколько сложна будет обработка по параметрам, я с ходу сообразить не могу.

Неактивен

 

#6 14.02.2014 13:45:02

Suguby
Участник
Зарегистрирован: 26.12.2011
Сообщений: 21

Re: Как лучше хранить большой список параметров в MySQL? Проектирование структуры

Что нить вроде:


CREATE TABLE IF NOT EXISTS `mydb`.`cars` (
  `id` INT NOT NULL,
  `name` VARCHAR(45) NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `mydb`.`params` (
  `id` INT NOT NULL,
  `name` VARCHAR(45) NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `mydb`.`car_params` (
  `id` INT NOT NULL,
  `param_id` INT NOT NULL,
  `car_id` INT NOT NULL,
  `value` VARCHAR(45) NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_car_param_params_idx` (`param_id` ASC),
  INDEX `fk_car_param_cars1_idx` (`car_id` ASC),
  CONSTRAINT `fk_car_param_params`
    FOREIGN KEY (`param_id`)
    REFERENCES `mydb`.`params` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_car_param_cars1`
    FOREIGN KEY (`car_id`)
    REFERENCES `mydb`.`cars` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

 

Отредактированно Suguby (14.02.2014 13:47:59)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson