防止插入重复,是用数据库的唯一性约束好还是先去数据库查询存不存在好?

2016-09-27 15:34:48 +08:00
 ZiLong
5461 次点击
所在节点    问与答
27 条回复
benatsh
2016-09-27 15:58:23 +08:00
看你对系统的性能要求
murmur
2016-09-27 15:59:46 +08:00
两个都要做,如果是注册的话肯定要 ajax 查一次用户重复不重复,然后防止捏造数据约束也得处理
xing393939
2016-09-27 16:05:11 +08:00
数据库约束一下又不会怀孕
xss
2016-09-27 16:14:42 +08:00
唯一约束.

你触发一次数据库查询.

如果是先查询在插入至少要 4 次网络 IO, 还可能会产生磁盘 IO
都是严重拖慢性能的东西.

当然,如果你的业务也就几千条数据,那么无所谓了~你用着爽就行.
ZiLong
2016-09-27 16:21:55 +08:00
@benatsh 我是追求越高越好
ZiLong
2016-09-27 16:23:44 +08:00
@murmur 针对这个场景,我可不可以加唯一性约束,直接插入数据库,通过捕获抛出的异常来判定是重复的呢
ZiLong
2016-09-27 16:25:12 +08:00
@xss 明显是用唯一性约束爽噻,查数据库不写代码么
tairan2006
2016-09-27 16:28:00 +08:00
肯定是唯一约束啊,你先查再插,要考虑并发问题啊,再来一个分布式锁?
xss
2016-09-27 16:28:20 +08:00
@ZiLong 一般如果我消重的逻辑如果是先查数据库,在判断是否重复的话,我会把查询封装成一个通用函数,然后通过参数来改变查询函数的逻辑功能.你如果用唯一约束,就直接插,外面用异常给包住就行了.
vwhenx
2016-09-27 16:29:17 +08:00
都要做
先去数据库查询是为了用户体验
据库的唯一性约束是为了保证数据一致性
Ouyangan
2016-09-27 16:35:39 +08:00
@vwhenx 说的有道理
ZiLong
2016-09-27 16:56:22 +08:00
@tairan2006 谢谢,一针见血
ZiLong
2016-09-27 17:00:34 +08:00
@xss 我只是想比较两种方式的优缺点,具体怎么做,封不封装函数不关心
ZiLong
2016-09-27 17:29:55 +08:00
@vwhenx @Ouyangan 查数据库为了用户体验的话,相当于这个场景很类似上面人提到的 ajax,比如 ajax 单独查用户名是否重复.不知道你说是否是这样的场景?我的意思是所有的字段都比如密码,生日这些都来了,然后要进行入库操作了,是先查询好,还是直接插入由数据库约束. @tairan2006 同学也提到了查询的并发问题,我觉得这提的很好.
Ouyangan
2016-09-27 19:23:56 +08:00
@ZiLong 并发的问题实际上对应的是:数据库事务隔离级别 , java 的话 spring 有相应支持 .其他语言不熟悉.
akira
2016-09-27 20:26:30 +08:00
单纯的先查再插是不能保证数据唯一的
约束是肯定要上的
个人更倾向于使用队列来处理类似的事情,除非量级过大或过小
ldbC5uTBj11yaeh5
2016-09-27 20:44:08 +08:00
vwhenx
2016-09-27 22:12:36 +08:00
@ZiLong 不一定非要用什么 ajax ,我自己用 ruby on rails, 可以在 Model 里面定义 validation ,在保存到数据库之前应该会自己去查一遍,如果重复,会给一个提示放在 session 里面返回回去。
mingyun
2016-09-27 22:47:36 +08:00
唯一键, mysql 用 INSERT ... ON DUPLICATE KEY
sherlocktheplant
2016-09-27 23:05:00 +08:00
用户名两样都要做
其他地方 只做数据库 然后处理好异常就可以

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

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

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

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

© 2021 V2EX