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

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

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

Вы не зашли.

#1 25.08.2017 22:59:39

webJunior
Завсегдатай
Зарегистрирован: 30.03.2017
Сообщений: 30

Json и индексы

Здравствуйте, есть база данных объявлений. Атрибуты объявлений храню в json, так как в зависимости от категории атрибуты у объявлений будут разные.


CREATE TABLE `categories` (
  `id` mediumint(8) UNSIGNED NOT NULL,
  `img_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `left_key` mediumint(8) UNSIGNED NOT NULL,
  `right_key` mediumint(8) UNSIGNED NOT NULL,
  `level` tinyint(3) UNSIGNED NOT NULL,
  `parent_id` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',
  `title` varchar(50) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `attributes` (
  `id` mediumint(8) UNSIGNED NOT NULL,
  `title` varchar(50) NOT NULL,
  `type` tinyint(3) UNSIGNED NOT NULL COMMENT '1 - числовой тип, 2- список',
  `attr_alias` varchar(255) NOT NULL COMMENT 'псевдоним атрибута',
  `attr_unit` varchar(20) NOT NULL DEFAULT '' COMMENT 'единица измерения'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `attribute_list` (
  `id` mediumint(8) UNSIGNED NOT NULL,
  `title` varchar(50) NOT NULL,
  `attribute_id` mediumint(8) UNSIGNED NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `category_attribute` (
  `category_id` mediumint(8) UNSIGNED NOT NULL,
  `attribute_id` mediumint(8) UNSIGNED NOT NULL,
  `status` tinyint(1) UNSIGNED NOT NULL COMMENT '0 - не выводить на странице поиска, 1 - выводить на странице поиска'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `ads` (
  `id` int(10) UNSIGNED NOT NULL,
  `category_id` mediumint(8) UNSIGNED NOT NULL,
  `user_id` int(10) UNSIGNED NOT NULL,
  `city_id` smallint(5) UNSIGNED NOT NULL,
  `text` text NOT NULL,
  `first_image_id` int(10) UNSIGNED NOT NULL,
  `price` mediumint(8) UNSIGNED NOT NULL,
  `ads_property` json DEFAULT NULL,
  `status` tinyint(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '0 - новое объявление, на рассмотрении, 1 - объявление активно,  2 - срок объявления истек или был запрос на удаление, 4 - объявление не прошло модерацию ',
  `date` date NOT NULL COMMENT 'Дата создания объявления',
  `date_end` date NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 


В таблице ads, в поле ads_property, атрибуты хранятся в таком виде:

{"list": {"id1": 2}, "numerical": {"id2": 500}}

"list" - список выбранных атрибутов, "numerical" - числовой тип атрибутов (например: ширина, высота и т.д). Внутри них id атрибута и значение.

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

Отредактированно webJunior (25.08.2017 23:00:12)

Неактивен

 

#2 28.08.2017 08:45:53

Александр Трофимов
Завсегдатай
Откуда: Юрмала
Зарегистрирован: 19.09.2011
Сообщений: 95

Re: Json и индексы

Вы сами ответили себе на вопрос. +))
Похоже, что у вас огромная проблема с проектированием БД. Не бывает так, чтобы атрибутов было бесконечно много. Даже eBay и Amazon умудряются структурировать атрибуты товаров, выставляемых у них на площадках. А у вас объявления, у которых атрибутов много меньше, чем у товаров.

Неактивен

 

#3 28.08.2017 13:27:43

webJunior
Завсегдатай
Зарегистрирован: 30.03.2017
Сообщений: 30

Re: Json и индексы

Александр Трофимов написал:

Вы сами ответили себе на вопрос. +))
Похоже, что у вас огромная проблема с проектированием БД. Не бывает так, чтобы атрибутов было бесконечно много. Даже eBay и Amazon умудряются структурировать атрибуты товаров, выставляемых у них на площадках. А у вас объявления, у которых атрибутов много меньше, чем у товаров.

Под каждый тип объявления создать отдельную таблицу? Что посоветуете?

Отредактированно webJunior (28.08.2017 13:28:45)

Неактивен

 

#4 28.08.2017 13:41:53

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

Re: Json и индексы

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

Неактивен

 

#5 28.08.2017 13:50:42

webJunior
Завсегдатай
Зарегистрирован: 30.03.2017
Сообщений: 30

Re: Json и индексы

klow написал:

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

Про выделенное можно по подробнее? Второй вариант не подходит, так как нужен будет фильтр объявлений по этим атрибутам, в данный момент все в одной таблице, только атрибуты хранятся в json.

Неактивен

 

#6 28.08.2017 14:01:45

webJunior
Завсегдатай
Зарегистрирован: 30.03.2017
Сообщений: 30

Re: Json и индексы

Еще как вариант, может дублировать объявление в nosql, например mongodb и делать поиск уже в ней?

Неактивен

 

#7 28.08.2017 15:16:36

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

Re: Json и индексы

Например,
1. таблица атрибутов
PropertyID, Name, TypeDB
2. Таблица значений атрибутов для целого
ObjId, PropertyID, Value (Int)
3. Таблица значений атрибутов для даты
ObjId, PropertyID, Value (Date)
...
В зависимости от TypeDB используем ту или иную таблицу для сохранения значений.

Отредактированно klow (28.08.2017 16:19:13)

Неактивен

 

#8 28.08.2017 15:22:59

webJunior
Завсегдатай
Зарегистрирован: 30.03.2017
Сообщений: 30

Re: Json и индексы

klow написал:

Например,
1. таблица атрибутов
PropertyID, Name, TypeDB
2. Таблица значений атрибутов для целого
ObjId, PropertyID, Value (Int)
3. Таблица значений атрибутов для даты
ObjId, PropertyID, Value (Date)
...
В зависимости от TypeDB используем ту ли иную таблицу для сохранения значений.

Я так понимаю это EAV? В начале я делал как раз такую структуру, но к сожалению при поиске по атрибутам получается слишком большое количество join - ов

Отредактированно webJunior (28.08.2017 15:24:24)

Неактивен

 

Board footer

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