Как правильно структурировать БД с большим числом параметров?

humbert
На сайте с 16.03.2006
Offline
540
820

Есть объект, он принадлежит разным категориям, ему присвоены разные цвета (несколько цветов сразу). Всего объектов более 100.000, у каждого в среднем по 4 категории и по 3 цвета.

Как правильно создать БД, чтобы потом можно было выбирать объект по этим параметрам достаточно быстро?

Была идея создать по каждому параметру (цвет, категории) отдельные таблицы, например, по категориям таблица с полями id_obj и id_category, поставить два индекса (id_obj и id_category). Ищет по такой таблице быстро, даже если записей 500.000

А если использовать поиск по категориям и цветам, то это поиск в двух таблицах - уже долго ищет.

Если сделать одну таблицу, где предусмотреть id_obj, id_category и id_color, то записей в ней будет примерно 100.000 * 4 * 3 = 1.200.000 причем часть данных будет повторяться, т.е. лишние данные. И поиск по такой толстой таблице тоже начинает тормозить - ведь данные постоянно добавляются.

P.s. MySQL это

Парсинг прайс-листов, наполнение интернет-магазина товаром. (https://humbert.ru) Любая CMS (Битрикс, OpenCart, Prestashop и даже Woo Commerce )
T
На сайте с 13.04.2008
Offline
67
t3s
#1

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

иначе как обьяснить вашу фразу "у каждого в среднем по 4 категории и по 3 цвета"?

webamator (http://webamator.ru) приглашает потестить сервис бесплатной оптимизации CSS и JavaScript (http://service.webamator.ru/) Занимаюсь проектами любой сложности. Качественно. Дорого. Примеры некоторых работ (http://blog.webamator.ru/category/portfolio)
humbert
На сайте с 16.03.2006
Offline
540
#2

Есть одна таблица objects, где перечислены все объекты (название, id, дата добавления, количество просмотров, текстовое описание)

Таблица категорий - название и id

Таблица цветов - название и id

Каждый объект имеет по несколько категорий и несколько цветов - как правильно создать связи?

Раньше я всегда делал отдельные таблицы связей obj_cat, где прописывал id_obj и id_cat - таким образом можно каждому объекту присвоить несколько категорий или наоборот категориям-объекты.

Но если делать такие связи по нескольким таблицам, более двух, то поиск нужного объекта в БД занимает много времени.

T
На сайте с 13.04.2008
Offline
67
t3s
#3

касаемо "поиска в двух таблицах" - не знаю как это реализовано у вас, но если делаете двумя запросами то ознакомьтесь с возможностью сделать одним.

вот тут - MySQL.ru

humbert
На сайте с 16.03.2006
Offline
540
#4

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

Если сделать одну большую таблицу с параметрами и выбрать из неё id_obj, а потом по этим id_obj выбрать данные по объектам - так получается быстрее, но все равно долго, около 1 сек. выполняется вывод данных в браузер(php).

Т.е. запрос

Select o.id_obj, name_obj From objects o, category c, color col where o.id_obj=c.id_obj and col.id_obj=o.id_obj and id_cat=1 and id_col=12

будет выполняться дольше, чем пара запросов

Select Distinct id_obj From objects_parameters where id_cat=1 and id_col=12

далее выбираем все объекты с id_obj из первого запроса

Select *From objects o where id_obj IN (список id_obj)
[umka]
На сайте с 25.05.2008
Offline
456
#5

Вообще, крайне сложно определить, что будет работать быстрее — один сложный запрос или два простых. Точно это можно определить только на конкретных таблицах, запросах и объёмах данных.

А на глазок прикинуть можно только если вы подробно распишете структуру. И укажете, какие данные участвуют в поиске и выборке.

Лог в помощь!
Polimer
На сайте с 01.09.2006
Offline
84
#6

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

1. делайте отдельную таблицу сочетаний параметров combinations с полями:

id_combination|category|color

2. заполняйте ее всеми возможными, встречаемыми комбинациями (id_combination - автоинкремент).

3. в таблицу объектов добавьте поле-ссылку на нужную комбинацию параметров (id_combination).

Ну, грубо: id_object|name|desc|id_combination

Что дальше делать, думаю, понятно.

----

Сорри, стормозил. Не заметил, что категорий и цветов может быть одновременно несколько. Тогда стабильное решение - то, что в 3-м посте. По поводу тормозов надо смотреть план выполнения, может где индексов не сделали. Либо менять движок СУБД, либо наращивать железо, но это слишком банально.

Программные решения для бизнеса. (http://frontsoft.ru/) На заказ. Дорого.
humbert
На сайте с 16.03.2006
Offline
540
#7

Такая таблица есть, более 3 млн. записей получилось, около 400 Мб данных.

Слишком много повторов там, не полностью, но частчно данные повторяются.

S
На сайте с 23.05.2004
Offline
315
#8

Цветов и прочего много ? Если до 32, то битовая логика, на основе int типа поле и сравнения по нему.

Битовая логика происходит в десятки раз быстрее, чем вхождение таблиц.

Это просто подпись.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий