Есть ли проблемы с этим решением "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. |
+----+--------+-------------+-------------------------------+
Несколько вещей, которые я провожаю.
- Вам нужно будет использовать логику приложения, чтобы сделать сводку (Ruby, PHP, Python и т. Д.)
- Стол может стать довольно большим, потому что я использую
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) и суррогатный ключ, который можно использовать для удаления удаленных (хе-хе) строк.
Вы также можете рассмотреть возможность разделения диапазона архивной таблицы на удаленных_дтм. Это значительно облегчает очистку данных из таблиц.