V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
tedd
V2EX  ›  问与答

为了避免重复写入数据,应由数据库实现(UNIQUE字段)?还是放在数据库写入之前判断呢?

  •  
  •   tedd · 2013-08-28 11:06:07 +08:00 · 5989 次点击
    这是一个创建于 4109 天前的主题,其中的信息可能已经有所发展或是发生改变。
    譬如我写个爬虫,每次爬了都会向数据库写入数据,但很多时候都是重复数据,为了避免重复数据的提交,我能想到的实现方法:

    1、将某数据库字段设置为UNIQUE字段,通过insert or ignore table...来写sql语句
    2、在sql insert语句之前,通过代码逻辑来判断是否insert,但这样貌似很麻烦:
    - 先读取数据库内容
    - if 希望插入的内容 in 数据库已有内容(python伪代码)
    - 则pass
    - 否则insert
    这样实现效率肯定狂低吧...
    11 条回复    1970-01-01 08:00:00 +08:00
    lichao
        1
    lichao  
       2013-08-28 11:08:23 +08:00   ❤️ 1
    当然是 UNIQUE
    tedd
        2
    tedd  
    OP
       2013-08-28 11:26:39 +08:00
    @lichao 再请教lichao大人,如果数据量很大的情况下(并且我用的是sqlite3...),对数据的压力肯定很大吧?
    lichao
        3
    lichao  
       2013-08-28 11:28:35 +08:00   ❤️ 1
    数据量很大 sqlite3 性能必然不高啊,sqlite3 大多用在移动平台或者嵌入式平台里面。
    est
        4
    est  
       2013-08-28 11:33:21 +08:00   ❤️ 1
    @tedd 你的第二种方法对db压力更大。而且线程不安全。
    awanabe
        5
    awanabe  
       2013-08-28 11:43:52 +08:00
    第二种情况可能出现的是 多个线程同时进入逻辑, 都去数据库查询, 返回都是no record, 然后同时插入, 还是会多次记录. 所以没有数据库的unique键, 还是存在问题.
    这应该是经典的 put-if-absent 问题...
    awebird
        6
    awebird  
       2013-08-28 12:44:26 +08:00
    可以考虑用两张表读写分离,写数据插入a表的时候不做查询重复判断,id sequence自增,定时或者在数据库闲时,按id范围去重处理后归入b表做查询和其它用途,删除a表这个范围的数据
    zzNucker
        7
    zzNucker  
       2013-08-28 12:50:36 +08:00
    @awebird 如果都在b表读的话 这样数据不就不即时了么~
    awebird
        8
    awebird  
       2013-08-28 12:59:15 +08:00   ❤️ 1
    @zzNucker 不同方案适用于不同的应用场景吧。这样读写分离,适用于写频繁,读的少而且实时性要求不高的场景,比如写日志尽量要快,读日志哪怕等个几分钟半小时也可以接受。准实时的话,就缩短时间
    keakon
        9
    keakon  
       2013-08-28 13:02:53 +08:00
    用 key / value 的吧…
    tedd
        10
    tedd  
    OP
       2013-08-28 14:06:33 +08:00
    @keakon 是传说中的nosql一类的数据库吗?这种重复的问题就不会存在对数据库也没有任何压力了?好像python中的字典的确也是键都是独一的
    keakon
        11
    keakon  
       2013-08-28 20:21:58 +08:00
    @tedd 是的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1076 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:30 · PVG 03:30 · LAX 11:30 · JFK 14:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.