Есть ли проблемы с этим решением "Soft Delete" с использованием таблиц EAV?

Я прочитал некоторую информацию об уродливой стороне просто установки deleted_at поле в ваших таблицах для обозначения строки было удалено.

а именно
http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/

Есть ли потенциальные проблемы с извлечением строки из таблицы, которую вы хотите удалить, и ее переносом в некоторые таблицы EAV?

Например.

Скажем, у меня есть две таблицы deleted а также deleted_row соответственно описывается следующим образом.

    mysql> describe deleted;
    +------------+--------------+------+-----+---------+----------------+
    | Field      | Type         | Null | Key | Default | Extra          |
    +------------+--------------+------+-----+---------+----------------+
    | id         | int(11)      | NO   | PRI | NULL    | auto_increment | 
    | tablename  | varchar(255) | YES  |     | NULL    |                | 
    | deleted_at | timestamp    | YES  |     | NULL    |                | 
    +------------+--------------+------+-----+---------+----------------+

    mysql> describe deleted_rows;
    +--------+--------------+------+-----+---------+----------------+
    | Field  | Type         | Null | Key | Default | Extra          |
    +--------+--------------+------+-----+---------+----------------+
    | id     | int(11)      | NO   | PRI | NULL    | auto_increment | 
    | entity | int(11)      | YES  | MUL | NULL    |                | 
    | name   | varchar(255) | YES  |     | NULL    |                | 
    | value  | blob         | YES  |     | NULL    |                | 
    +--------+--------------+------+-----+---------+----------------+

Теперь, когда вы хотите удалить строку из любой таблицы, вы должны удалить ее из таблицы, а затем вставить ее в эти таблицы как таковые.

    deleted
    +----+-----------+---------------------+
    | id | tablename | deleted_at          |
    +----+-----------+---------------------+
    |  1 | products  | 2011-03-23 00:00:00 | 
    +----+-----------+---------------------+

    deleted_row
    +----+--------+-------------+-------------------------------+
    | id | entity | name        | value                         |
    +----+--------+-------------+-------------------------------+
    |  1 |      1 | Title       | A Great Product               | 
    |  2 |      1 | Price       | 55.00                         | 
    |  3 |      1 | Description | You guessed it... it's great. | 
    +----+--------+-------------+-------------------------------+

Несколько вещей, которые я провожаю.

  1. Вам нужно будет использовать логику приложения, чтобы сделать сводку (Ruby, PHP, Python и т. Д.)
  2. Стол может стать довольно большим, потому что я использую blob обрабатывать неизвестный размер значения строки

Вы видите какие-либо другие явные проблемы с этим типом мягкого удаления?

1 ответ

Решение

Почему бы не отразить ваши таблицы в архиве

create table mytable(
   col_1 int
  ,col_2 varchar(100)
  ,col_3 date 
  ,primary key(col_1)
)

create table mytable_deleted(
   delete_id  int      not null auto_increment
  ,delete_dtm datetime not null
-- All of the original columns
  ,col_1 int
  ,col_2 varchar(100)
  ,col_3 date 
  ,index(col_1)
  ,primary key(delete_id)
)

А затем просто добавьте триггеры on-delete-в свои таблицы, которые вставляют текущую строку в зеркальную таблицу перед удалением? Это даст вам простое и очень эффективное решение.

Вы могли бы на самом деле генерировать таблицы и запускать код, используя словарь данных.

Обратите внимание, что я, возможно, не захочу иметь уникальный индекс исходного первичного ключа (col_1) в таблице архива, потому что вы можете в конечном итоге удалить одну и ту же строку дважды с течением времени, если вы используете естественные ключи. Если вы не планируете подключать архивные таблицы в своем приложении (для отмены), вы можете полностью удалить индекс. Кроме того, я добавил время удаления (delete_dtm) и суррогатный ключ, который можно использовать для удаления удаленных (хе-хе) строк.

Вы также можете рассмотреть возможность разделения диапазона архивной таблицы на удаленных_дтм. Это значительно облегчает очистку данных из таблиц.

Другие вопросы по тегам