Как заархивировать запись с записями из других связанных таблиц? - PullRequest
1 голос
/ 27 августа 2009

У меня 8 столов:

users:
  uid
users_removed:
  uid
messages:
  mid
  uid FK users (uid)
messages_removed:
  mid
  uid
comments:
  cid
  mid FK messages (mid)
comments_removed:
  cid
  mid
files:
  fid
  mid FK messages (mid)
files_removed:
  fid
  mid

Когда я удаляю запись из таблицы «пользователи», я хочу переместить ее в таблицу users_removed (перед удалением из пользователей). Я также хочу переместить все соответствующие сообщения (и файлы, и комментарии) в * _removed таблицы.

Я использовал триггеры:

CREATE TRIGGER delete_user BEFORE DELETE ON users
    FOR EACH ROW BEGIN
        INSERT IGNORE INTO users_removed
            SELECT * FROM users WHERE uid = OLD.uid;
        DELETE FROM messages WHERE OLD.uid in (owner_id, author_id);
    END
|

CREATE TRIGGER delete_message BEFORE DELETE ON messages
    FOR EACH ROW BEGIN
        INSERT IGNORE INTO messages_removed
            SELECT * FROM messages WHERE mid = OLD.mid;
        DELETE FROM comments WHERE mid = OLD.mid;
        DELETE FROM files WHERE mid = OLD.mid;
    END
|

CREATE TRIGGER delete_comment BEFORE DELETE ON comments
    FOR EACH ROW BEGIN
        INSERT IGNORE INTO comments_removed
            SELECT * FROM comments WHERE cid = OLD.cid;
    END
|

CREATE TRIGGER delete_file BEFORE DELETE ON files
    FOR EACH ROW BEGIN
        INSERT IGNORE INTO files_removed
            SELECT * FROM files WHERE fid = OLD.fid;
    END
|

Но это работает очень медленно с> 50k пользователями,> 1 миллионами сообщений, комментариев и файлов.

Есть ли быстрый способ сделать это?

1 Ответ

1 голос
/ 27 августа 2009
  1. Нет быстрого способа сделать это. Предполагая, что вы используете InnoDB, вы должны написать запись таблицы, удалить ссылку на запись таблицы, а затем InnoDB выполняет второй запуск очистки, чтобы фактически избавиться от него (удаление стоит дорого). Тогда наличие дыр в вашей базе данных почти наверняка приведет к снижению производительности, поскольку со временем вы удаляете больше пользователей.

  2. Если вы сохраняете информацию о пользователе, почему бы просто не добавить в таблицу пользователей столбец с именем "active" с помощью enum (true, false)?

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