В рамках очень медленного процесса рефакторинга унаследованной системы мне нужно устранить пару медленных соединений и подзапросов.По мере того, как я знакомлюсь с системой, я постепенно дезинфицирую структуру базы данных, чтобы избавиться от ощущения скрепления клейкой лентой, внося постепенные улучшения, надеясь, что в это время ничего не сломается.Частично это включает в себя объединение данных из двух таблиц, связанных третьей, в одну.
Структура таблицы похожа на эту:
CREATE TABLE groups
(
group_id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
-- various other fields that are appropriate to groups
...
-- these fields need to be filled
a ENUM(...) NOT NULL,
b INTEGER NOT NULL,
c VARCHAR(...) NOT NULL
);
CREATE TABLE items
(
-- key is determined by an external data source
item_id INTEGER NOT NULL PRIMARY KEY,
-- various other fields that are appropriate to items
...
-- these fields shouldn't be here, but in the groups table
a ENUM(...) NOT NULL,
b INTEGER NOT NULL,
c VARCHAR(...) NOT NULL
);
CREATE TABLE group_items
(
item_id INTEGER NOT NULL,
group_id INTEGER NOT NULL,
PRIMARY KEY (item_id,group_id)
);
Элемент может быть в нескольких группах.Каждая запись в таблице «items» имеет значения для столбцов a, b и c, которые на самом деле являются не свойствами элементов, а группами, частью которых являются элементы.(Это вызывает проблемы, так как значения могут отличаться, если элемент находится в другой группе).
Я пока не могу удалить поля из таблицы элементов, так как они заполняются безумным процессом импорта изпочти как безумный источник данных.Пока я не успел исправить процесс импорта, я застрял с наличием полей в таблице элементов, но, по крайней мере, в краткосрочной перспективе я могу устранить медленные поиски, чтобы получить их.
Сейчас яв PHP есть цикл, который проходит по каждой группе, берет значения из первого элемента, с которым он сталкивается (это нормально - все элементы в группе будут иметь одинаковые значения для a, b и c) и помещает их в группу.Этот процесс довольно медленный и трудоемкий и, к сожалению, очень часто выполняется на перегруженном и недостаточно мощном сервере.Есть ли разумный способ скопировать эти (и только эти) значения из таблицы элементов в таблицу групп и заставить MySQL выполнять тяжелую работу, а не полагаться на сценарий PHP?