SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 03.06.2012 01:53:55

Akylenok
Участник
Зарегистрирован: 27.05.2010
Сообщений: 15

Хранение произвольных характеристик и подбор по ним.

Добрый день.

помогите решить очень большую головоломку smile

Суть такая:

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

1. числовое значение
к примеру процессор - характеристика количество ядер
или цена товара

поиск должен осуществляться как больше, меньше, равно или в диапазоне

2. текстовый
к примеру - описание товара

поиск должен осуществляться по вхождению искомого текста

3. булёвый
к примеру - наличие товара на складе

ну как бы поиск по значению "истина"

4. перечисление
тут немного сложно объяснить, но постараюсь донести суть.
К примеру характеристика Производитель. Для товара он выбирается один из списка производителей.

и еще так - Принтер, есть характиритика "подключение к сети" и варианты в списке будут такие lan, wi-fi, так вот принтер

может быть как со всеми типами подключения, как с одним из них так и вообще без них.

это как бы многозначный булёвый тип(хранится несколько значений сразу)


добавился 5й тип:
5. дата
поиск осуществляется по дате (равно, больше, меньше, или в диапазоне)


Что можете подсказать по этой задачке? Как поступить?


P.S. тема очень интересная, я думаю что она много кому поможет в будущем.


Начну с того, что товары и группы я планирую хранить в одной таблице, в иерархической структуре.

Примерно так:

Таблица: goods
id - идентификатор
parent_id - идентификатор родителя
name - наименование группы/товара
alias - псевдоним для URL адресной строки (опционально)

далее идет таблица для хранения характеристик групп

Таблица: options
id - идентификатор
good_id - идентификатор группы, из таблицы goods
name - наименование характеристики
alias - псевдоним для URL адресной строки (опционально)
type_option - тип опции (1,2,3,4 - описаны выше)


для 4-го типа (перечисление) создам еще одну таблицу для хранения вариантов

Таблица: enumerations
id - идентификатор
option_id - идентификатор характеристики
name - название варианта перечисления
alias - псевдоним для URL адресной строки (опционально)

таким образом при помощи трех таблиц я описываю "все возможные параметры для группы и варианты значений для перечисления".

Теперь встает вопрос: для каждого товара нужно хранить значения этих характеристик с последующим подбором товаров в группе по этим типам характеристик.

Отредактированно Akylenok (05.06.2012 14:25:20)

Неактивен

 

#2 04.06.2012 13:13:22

Akylenok
Участник
Зарегистрирован: 27.05.2010
Сообщений: 15

Re: Хранение произвольных характеристик и подбор по ним.

В дополнение выкладываю схему (чтобы ручками не создавать):

CREATE TABLE enumerations
(
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор',
  option_id INT(11) UNSIGNED NOT NULL COMMENT 'Идентификатор характеристики',
  name VARCHAR(255) NOT NULL COMMENT 'Нзвание варианта перечисления',
  alias VARCHAR(255) NOT NULL COMMENT 'Псевдоним для URL адресной строки (опционально)',
  PRIMARY KEY (id),
  INDEX option_id (option_id)
)
ENGINE = INNODB
AUTO_INCREMENT = 1
CHARACTER SET utf8
COLLATE utf8_general_ci;

CREATE TABLE goods
(
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор',
  parent_id INT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Идентификатор родителя',
  name VARCHAR(255) NOT NULL COMMENT 'Наименование группы/товара',
  alias VARCHAR(255) NOT NULL COMMENT 'Псевдоним для URL адресной строки (опционально)',
  PRIMARY KEY (id)
)
ENGINE = INNODB
AUTO_INCREMENT = 1
CHARACTER SET utf8
COLLATE utf8_general_ci;

CREATE TABLE options
(
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор',
  good_id INT(11) NOT NULL DEFAULT 0 COMMENT 'идентификатор группы, из таблицы goods',
  name VARCHAR(255) NOT NULL COMMENT 'Наименование характеристики',
  alias VARCHAR(255) NOT NULL COMMENT 'Псевдоним для URL адресной строки (опционально)',
  type_option TINYINT(4) UNSIGNED NOT NULL COMMENT 'тип опции (1,2,3,4 - описаны выше)',
  PRIMARY KEY (id),
  INDEX good_id (good_id)
)
ENGINE = INNODB
AUTO_INCREMENT = 1
CHARACTER SET utf8
COLLATE utf8_general_ci;

Неактивен

 

#3 05.06.2012 00:42:02

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

Re: Хранение произвольных характеристик и подбор по ним.

Если я правильно понял, то вам нужны таблица товаров, таблица характеристик и таблица связей между ними (идентификатор товара, идентификатор характеристики и значение характеристики).

Посмотрите пример в теме http://sqlinfo.ru/forum/viewtopic.php?id=5324

Неактивен

 

#4 05.06.2012 00:53:51

Akylenok
Участник
Зарегистрирован: 27.05.2010
Сообщений: 15

Re: Хранение произвольных характеристик и подбор по ним.

Бегло прочитал, завтра с утрица посижу посерьезнее.

Но, а в целом у меня поиск будет более сложным.
Но для этого я (тоже к сожалению завтра) приведу схему таблиц, в которых я собираюсь хранить значения для товаров.

P.S. меня терзает такой вопрос - вот понаделаю я кучу разделенных таблиц, а на соединение не будет ли идти много ресурсов и времени? smile просто у меня нет такого опыта smile
но это предлагаю обсудить после схемы таблиц хранения значений.

Неактивен

 

#5 05.06.2012 14:21:12

Akylenok
Участник
Зарегистрирован: 27.05.2010
Сообщений: 15

Re: Хранение произвольных характеристик и подбор по ним.

Выкладываю схему таблиц для хранения значений параметров товаров:

CREATE TABLE values_bool
(
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор',
  good_id INT(11) UNSIGNED NOT NULL COMMENT 'Идентификатор товара',
  option_id INT(11) UNSIGNED NOT NULL COMMENT 'Идентификатор параметра',
  value TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'Значение типа БУЛЁВО',
  PRIMARY KEY (id),
  INDEX good_option (good_id, option_id)
)
ENGINE = INNODB
AUTO_INCREMENT = 1
CHARACTER SET utf8
COLLATE utf8_general_ci
COMMENT = 'Таблица значений в формате БУЛЁВО';

CREATE TABLE values_date
(
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор',
  good_id INT(11) UNSIGNED NOT NULL COMMENT 'Идентификатор товара',
  option_id INT(11) UNSIGNED NOT NULL COMMENT 'Идентификатор параметра',
  value TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Значение типа ДАТА',
  PRIMARY KEY (id),
  INDEX good_option (good_id, option_id)
)
ENGINE = INNODB
AUTO_INCREMENT = 1
CHARACTER SET utf8
COLLATE utf8_general_ci
COMMENT = 'Таблица значений в формате ДАТА-ВРЕМЯ';

CREATE TABLE values_num
(
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор',
  good_id INT(11) UNSIGNED NOT NULL COMMENT 'Идентификатор товара',
  option_id INT(11) UNSIGNED NOT NULL COMMENT 'Идентификатор параметра',
  value FLOAT NOT NULL DEFAULT 0 COMMENT 'Значение (число с плавающей точкой)',
  PRIMARY KEY (id),
  INDEX good_option (good_id, option_id)
)
ENGINE = INNODB
AUTO_INCREMENT = 1
CHARACTER SET utf8
COLLATE utf8_general_ci
COMMENT = 'Таблица значений в формате ЧИСЛО (с плавающей точкой)';

CREATE TABLE values_text
(
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор',
  good_id INT(11) UNSIGNED NOT NULL COMMENT 'Идентификатор товара',
  option_id INT(11) UNSIGNED NOT NULL COMMENT 'Идентификатор параметра',
  value TEXT NOT NULL COMMENT 'Значение',
  PRIMARY KEY (id),
  INDEX good_option (good_id, option_id),
  FULLTEXT INDEX value (value)
)
ENGINE = MYISAM
AUTO_INCREMENT = 1
CHARACTER SET utf8
COLLATE utf8_general_ci
COMMENT = 'Таблица значений в формате СТРОКА (с плавающей точкой)';

Неактивен

 

Board footer

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