#mysql
Как я понял, аналога Explode в MySQL нет. Но как быть с такими ситуациями? Есть набор материалов в базе данных, каждый из которых имеет строковой параметр с перечисленными значениями (11,12,35), и по этому параметру необходимо обеспечить поиск. Ну, вернее, по его части. Например, 11. Когда же дело доходит до поиска, например, по значению 1, то, как и следовало ожидать, находятся все материалы, куда включено данное значение: 1, 11, 12, 21,... Как быть в такой ситуации? Заводить отдельную таблицу со значениями параметров и затем третью, связывающую их "многие ко многим"? Но таких параметров много, причем, большинство из них ограничено парой десятков значений, а некоторые - и вообще, двумя-тремя, то есть, заводить +2 таблицы для каждого из таких параметров было бы неприятно. Хотя, возможно, это и правильное решение... Пока вопрос решил записью в базу данных параметров, окруженных запятыми (,1,2,3,) - если в такой строке искать ,1,, то проблем с другими значениями возникнуть не должно. Правда, этот вариант исключает возможность поиска по нескольким параметрам.
Ответы
Ответ 1
С подобными строками одна проблема - использование индексов для поиска невозможно. и любой поиск будет полностью перебирать всю таблицу. Вообще есть функция find_in_set, которая ищет значение в списке через запятую, но опять же полным перебором. или concat(',',filed,',') like '%,1,%'. Или вообще concat(',',filed,',') regexp ',(1|15|23),' для поиска любого из 3х перечисленных значений. Отдельная таблица для быстрого поиска - наиболее правильное решение, т.к. наверняка в ней вот те значения 1, 11, 21 будут foreign key из другой таблицы, то на них уже будет построен индекс и при поиске where field=1 будут отобраны только нужные записи и не будет полного перебора таблицы. Единственный случай, когда отдельная таблица замедляет работу - это выборка всех значений для конкретной записи. Считать одну строку и сразу показать - конечно быстрее. При частых выборках возможно есть смысл внести избыточность и хранить обоими способами.
Комментариев нет:
Отправить комментарий