Здравствуйте. Встала задача:
Есть ~15к элементов с множеством параметров. Если посчитать все уникальные-то их будет 172. В среднем у каждого элемента по 3-4 параметра. у 1% только от 10 и выше.
Так вот сама задача-нужно хранить в базе эти элементы и организовать поиск не только по названию элемента,но и по параметрам. Первая идея была использовать полнотекстовой поиск и все параметры хранить одним текстом примерно так:
Элемент1
Параметр1,Параметр2,..ПараметрN
Но некоторые параметры имеют диапазон и тогда полнотекстовой поиск может не справится,если мне нужно найти,например,вещь с параметромX > 45 и параметромY <60
Создавать таблицу с 172+-10 полями это верх глупости как по мне и я решила сделать так:в первой таблице будет хранится название элемента,ид и т.д,а во второй такая структура таблицы:
id
id_elem
name_parameter
value
То есть в "name_parameter" будет хранится название параметра,а в value значение этого параметра(или диапазон)
Но как тогда сделать поиск по этим самым параметрам и вообще умное ли это решение или верх глупости?
P.S. обычный вывод(без поиска) даже без вопросов-все легко,а вот с поиском по параметрам как быть.
Цитата (Эли4ка @ 5.10.2018 - 14:14) |
вообще умное ли это решение или верх глупости? |
Решение нормальное, только тут надо не 2 а 3 таблицы. 1 таблица элементы, вторая таблица параметры и третья таблица связи элемент-параметр, первичный ключ можно повесить на два поля id_elem и id_param. (от себя лично и учитывая недавний холивар, я бы всё таки именовал поля сначала именем таблицы, а потом именем поля, т.е elem_id и param_id)
_____________
Стимулятор ~yoomoney - 41001303250491
Эли4ка, с поиском гораздо сложнее, тут надо конкретно подходить к тому, что и как искать.
_____________
Стимулятор ~yoomoney - 41001303250491
Нужно именно по параметрам
Эли4ка, так параметры разные, вот и поиск будет комбинированный
_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
7.10.2018 - 00:57
Цитата (Эли4ка @ 5.10.2018 - 15:14) |
Но как тогда сделать поиск по этим самым параметрам и вообще умное ли это решение или верх глупости? |
Нормальное решение

При поиске джойнишь первую таблицу со второй, связывая данные по айди элемента, одновременно накладывая нужные тебе ограничения на величину параметра. Получаешь для каждого элемента столько строк, сколько его параметров соответствуют условию. Либо можно сделать так, что на выходе эти параметры (соответствующие условию) будут объединены в одно поле. С любым разделителем, например с запятой.
Цитата (Valick @ 5.10.2018 - 15:46) |
только тут надо не 2 а 3 таблицы |
А зачем? У Элички всё правильно написано. Одна таблица - список элементов и их всякие уникальные причиндалы. А во второй - параметры с привязкой к айди элемента из первой таблицы. Как ты предлагаешь 3-ю таблицу использовать?
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
sergeiss, там всё предельно ясно написано. Отношение многие ко многим - это три таблицы.
_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
7.10.2018 - 11:47
Цитата (Valick @ 7.10.2018 - 07:08) |
Отношение многие ко многим - это три таблицы. |
Если так, то да. Но из описания я так понял, что там "один (элемент) ко многим (параметрам)".
Эличка, поясни, что там на самом деле!
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
15к элементов у которых надо в БД хранить 172+-10 параметров,но ни у одного элемента нет сразу этих 172+-10 параметров,а в средней у каждого элемента по 3-4 параметра.
так попонятнее или нет?
Цитата (Эли4ка @ 5.10.2018 - 14:14) |
Создавать таблицу с 172+-10 полями это верх глупости как по мне |
Некашерно? Соглашусь.
Но не глупо. Если в итоге скрипт будет проще, работать будет быстрее и ресурсов съест меньше — это никак не глупо.
_____________
Бесплатному сыру в дырки не заглядывают...