Здесь уже задавались различные варианты этого вопроса, но я решил дать ему еще один шанс.
У меня была ужасная структура базы данных. Один объект (виджет) был разбит на две таблицы:
CREATE TABLE widgets (widget_id int(10) NOT NULL auto_increment)
CREATE TABLE widget_data (
widget_id int(10),
field ENUM('name','size','color','brand'),
data TEXT)
это было не так идеально. Если я хотел найти виджеты с определенным именем, цветом и маркой, мне нужно было выполнить трехстороннее соединение в таблице widget_data. поэтому я преобразовал в разумный тип таблицы:
CREATE TABLE widgets (widget_id int(10) NOT NULL auto_increment,
name VARCHAR(32),size INT(3),color VARCHAR(16), brand VARCHAR(32))
Это делает большинство запросов намного лучше. Но это затрудняет поиск. Раньше было так, что если бы я хотел искать виджеты, скажем, «% black%», я бы просто SELECT * FROM widget_data WHERE data LIKE '%black%'
. Это дало бы мне все экземпляры виджетов, которые имеют черный цвет, или сделаны из отраслей блэквелла, или чего-то еще. Я бы даже точно знал, какое поле соответствует, и мог бы показать это моему пользователю.
как мне выполнить подобный поиск, используя новый макет таблицы? Я, конечно, мог бы сделать WHERE name LIKE '%black%' OR size LIKE '%black%'...
, но это кажется неуклюжим, и я до сих пор не знаю, какие поля совпадают. Я мог бы выполнить отдельный запрос для каждого столбца, по которому я хочу сопоставить, что дало бы мне все совпадения и их соответствие, но это было бы ударом по производительности. есть идеи?