Этот вопрос виден на Google и имеет много точек зрения, поэтому я хочу поделиться мой подход к этой проблеме. Мне приходилось иметь дело с таким плохим дизайном, как значения, разделенные запятыми, также сохраненные в виде строк. Я столкнулся с этой проблемой при настройке плагина CMS, ответственного за теги.
Да, теги, относящиеся к статье сайта, были сохранены следующим образом: «tag1, tag2, ..., TagN «Таким образом, получить точное совпадение не столь тривиально, как это могло бы иметь первоначально появился: с помощью простых LIKE
с тегами статьи„мяча“Я также получил те помечен„ножной мяч “и» мяча номер». не критично, но скорее раздражает.
FIND_IN_SET функция казалось удивительным на первый, но потом оказалось, что он не использует индекс и не работает должным образом, если первый аргумент содержит запятых.
У меня не было желания изменять сам плагин или более глубокое ядро CMS функциональность, на которой был построен этот плагин.
Также стоит отметить, что необходимый тег (подстрока) может быть первым, последним элементом в строке или может быть где-то посередине, поэтому этот фрагмент кода WHERE (',' + Categories + ',') LIKE '%,science,%'
не охватывает все три случая.
Наконец-то я получил очень простое решение. Он работал для меня, как это:
... WHERE tags LIKE 'ball,%' OR tags LIKE '%,ball,%' OR tags LIKE '%,ball'
Все Theree случаев, охватываемых; запятые, используемые в качестве разделителей. Надеюсь, что это поможет другим, которые столкнулись с подобной ловушкой.
PS. Я вообще не эксперт по MySQL/DB, и мне бы хотелось прочитать о потенциальных недостатках этого подхода, особенно на действительно огромных таблицах (что не было моим делом, кстати). Я просто поделился результатами моих небольших исследований и тем, что я сделал, чтобы решить эту проблему с минимальными усилиями.
Вот почему многозначные атрибуты являются ** злыми **. – Yuck
@Yuck Я думал, что увеличение проблем с параллелизмом было то, почему они ** злые **. –
Я не могу позволить этому дизайну стоять. Для данных вам нужна таблица для детей, чтобы вы могли эффективно ее выполнять. Никогда не храните список разделенных запятыми. – HLGEM