Копирование определенных данных из столбцов одной таблицы в другую через таблицу ссылок - PullRequest
1 голос
/ 07 сентября 2011

В рамках очень медленного процесса рефакторинга унаследованной системы мне нужно устранить пару медленных соединений и подзапросов.По мере того, как я знакомлюсь с системой, я постепенно дезинфицирую структуру базы данных, чтобы избавиться от ощущения скрепления клейкой лентой, внося постепенные улучшения, надеясь, что в это время ничего не сломается.Частично это включает в себя объединение данных из двух таблиц, связанных третьей, в одну.

Структура таблицы похожа на эту:

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?

1 Ответ

0 голосов
/ 07 сентября 2011

Похоже, я нашел свой ответ.Поскольку количество элементов в каждой группе относительно небольшое, возможно, выполняется некоторая дублирующая работа, но она не является узким местом и намного быстрее, чем цикл PHP:

UPDATE
    groups g
    INNER JOIN group_items USING(group_id)
    INNER JOIN items i USING(item_id)
SET
    g.a = i.a,
    g.b = i.b,
    g.c = i.c;

Кажется, делает то, что мне нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...