V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
node
V2EX  ›  MySQL

用户删除掉但系统需要留档的数据应该怎么处理?

  •  
  •   node · 2014-09-10 13:13:06 +08:00 · 4018 次点击
    这是一个创建于 3514 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如用户发的一篇文章,被用户删掉之后该怎么做?在文章的表里面标记这个条目已经被删除?还是搞一个已删除的文章的表,把删除的条目挪过去?
    另外文章的评论也是级联删除的,假如评论和文章没有外键关联,只是orm级别的级联删除,怎样确保在数据库中删除的一致性?
    23 条回复    2014-09-11 16:23:48 +08:00
    dong3580
        1
    dong3580  
       2014-09-10 13:16:27 +08:00
    删除了文章评论不就不会出来了,不要在数据库中设外键什么的,用程序判断。
    只删除文章就行,级联删除可能太麻烦。
    窃以为,用户删除了就是删除,你还留着人家的某些信息是违法吧?
    再说留着也会造成一堆垃圾信息。
    cxe2v
        2
    cxe2v  
       2014-09-10 13:39:01 +08:00
    @dong3580 留待有关部门检查
    tushiner
        3
    tushiner  
       2014-09-10 13:51:12 +08:00
    给一个标记字段不就行了,对用户显示“已删除”。
    node
        4
    node  
    OP
       2014-09-10 15:12:39 +08:00
    @tushiner 标记了已删除之后每次查询的时候条件里面都得带上,真是很费神啊~
    hellov22ex
        5
    hellov22ex  
       2014-09-10 15:20:51 +08:00
    楼主,你这不是2么,不判断难道每次删完备份下啊,3楼的方法应该最简单
    node
        6
    node  
    OP
       2014-09-10 15:58:06 +08:00
    @hellov22ex 原先我也是这么做的,真是很累,开发的时候每一句select,包括其它关联表的查询,都得加上这个判断条件,就像颗定时炸弹一样,一不留神就忘了啊。删除同时备份的话虽然那一下子有点烦,可好歹在开发流程里就这一步。其实我也是拿捏不准怎么样合适,假如你也做过的话,请谈谈看着方面的体会吧
    hellov22ex
        7
    hellov22ex  
       2014-09-10 16:12:17 +08:00
    @node 如果你做的大,肯定加判断很麻烦,但是这时候备份应该更麻烦,你完全可以加个标签,在select那边判断个这个标签,这个应该是最简单的,我做的就是这样子的,没办法,没想到别的办法啊
    dongbeta
        8
    dongbeta  
       2014-09-10 16:14:02 +08:00
    soft delete
    mahone3297
        9
    mahone3297  
       2014-09-10 16:40:20 +08:00
    这个问题确实麻烦。。。
    php symfony的话,doctrine是有相关插件
    其他可能也有,或者需要你造轮子
    原理,应该也是有个字段表示isDeleted,然后系统自动每次都帮你加上。
    mengzhuo
        10
    mengzhuo  
       2014-09-10 18:06:04 +08:00
    这年头还有人手写SQL语句??
    jucelin
        11
    jucelin  
       2014-09-10 18:37:30 +08:00 via Android
    如果用字段标记,key键怎么设 @tushiner
    alexapollo
        12
    alexapollo  
       2014-09-10 19:05:04 +08:00
    直接放到另外一张专用“回收站”型的数据库里~
    node
        13
    node  
    OP
       2014-09-10 20:32:57 +08:00
    查了一下,貌似可以建一个isDeleted=false的view来解决之前提到的那个麻烦,不过直接物理删除并挪到另一个表里去,就像 @alexapollo 说的这种,这种过程有没有缺陷呢?
    alexapollo
        14
    alexapollo  
       2014-09-10 20:56:15 +08:00
    @node 我记得以前有蛮多的老外讨论过这个问题,可以搜搜,SO上应该有
    node
        15
    node  
    OP
       2014-09-10 21:23:07 +08:00
    @alexapollo 嗯,搜到了这个 http://stackoverflow.com/questions/2549839/are-soft-deletes-a-good-idea ,不过好像没有提到删除到“回收站”表的pros和cons
    frankzeng
        16
    frankzeng  
       2014-09-10 22:26:18 +08:00
    建个触发器,每次删除就把文章挪到另一个表里,这个能满足你的要求,但是如果数据量大的话,性能会有问题。
    belin520
        17
    belin520  
       2014-09-10 22:29:37 +08:00
    用户被屏蔽而不是删掉就可以了。
    JmmBite
        18
    JmmBite  
       2014-09-10 22:35:00 +08:00
    status:{true,false} # 公开,删除
    status:{1,0,-1} # 公开,草稿,删除
    lygmqkl
        19
    lygmqkl  
       2014-09-10 22:44:17 +08:00
    deleted = 0
    minuux
        20
    minuux  
       2014-09-11 08:54:35 +08:00
    创建一张视图,直接筛掉已经删除的也可以吧?
    node
        21
    node  
    OP
       2014-09-11 13:34:01 +08:00
    @frankzeng 不建触发器,直接程序挪移,会有问题吗?
    frankzeng
        22
    frankzeng  
       2014-09-11 14:28:54 +08:00
    @node 当然没问题,但这样你不觉得很麻烦吗,其实也可以建个视图,只出那些未删除的,如果你建两个表,以后表结构的一致性是要维护成本的。
    node
        23
    node  
    OP
       2014-09-11 16:23:48 +08:00
    @frankzeng 有道理,看来还是软删除优点更多些啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2667 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 00:03 · PVG 08:03 · LAX 17:03 · JFK 20:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.