我读过一些关于在表格中设置deleted_at
字段的丑陋方面的信息,表示行已被删除。使用EAV表的“软删除”解决方案有问题吗?
即
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. |
+----+--------+-------------+-------------------------------+
我看到了一些东西。
- 你需要使用的应用程序逻辑 做枢轴(红宝石,PHP,Python和 等)
- 表可能增长相当大的 因为我使用
blob
处理 未知行值的大小
您是否发现这种类型的软删除有其他明显的问题?
我没有太多的意见对是否是好事还是坏事(至少在没有很多关于你的要求的更多细节),但根据你的数据库服务器上你也许可以做到这一点与触发器和保持逻辑超出数据库。 – 2011-03-23 16:58:44
汤姆,我还没有偶然发现如何做触发器,你知道任何好的例子吗? – 2011-03-23 17:07:14
对不起,我的头不在。这也很大程度上取决于你正在使用的数据库。 – 2011-03-23 17:13:40