【发布时间】:2011-03-23 16:53:57
【问题描述】:
我已经阅读了一些关于在表中设置 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来处理 行值的未知大小
您是否发现此类软删除还有其他明显问题?
【问题讨论】:
-
我对这是否是一件好事没有太多意见(至少在没有关于您的要求的更多细节的情况下),但根据您的数据库服务器,您可能可以这样做使用触发器并将逻辑排除在数据库之外。
-
Tom,我还没有偶然发现如何使用触发器进行数据透视,你知道网上有什么好的例子吗?
-
对不起,不是我的头顶。这也很大程度上取决于您使用的数据库。
标签: sql database-design delete-row