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

2013-08-28 11:06:07 +08:00
 tedd
譬如我写个爬虫,每次爬了都会向数据库写入数据,但很多时候都是重复数据,为了避免重复数据的提交,我能想到的实现方法:

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/80478

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX