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