我读过一些关于设置一个丑陋的一面的信息deleted_at
表中的字段表示行已被删除。
Namely
http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/ http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/
从要删除的表中获取行并将其转换到某些 EAV 表中是否存在任何潜在问题?
例如。
假设我有两张桌子deleted
and 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、
ETC)
- 桌子可以变得很大
因为我正在使用
blob
处理
行值的未知大小
您是否发现这种类型的软删除还有其他明显的问题?
为什么不使用存档表来镜像您的表呢?
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-triggers 即可在删除之前将当前行插入镜像表中?这将为您提供非常简单且非常高性能的解决方案。
您实际上可以使用数据字典生成表和触发器代码。
请注意,我可能不想在存档表中的原始主键 (col_1) 上有唯一索引,因为如果您使用自然键,您实际上可能最终会随着时间的推移删除同一行两次。除非您计划在应用程序中连接存档表(用于撤消目的),否则您可以完全删除索引。另外,我添加了删除时间(deleted_dtm)和一个可用于删除已删除(呵呵)行的代理键。
您还可以考虑对deleted_dtm 上的存档表进行范围分区。这使得从表中清除数据变得非常容易。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)