请问唯一性验证具体的执行方式,以及消耗。 [ 新手入门 ]
大家好,提这个问题还是因为避免重复提交。
比如,yiichina 说说部分,假设 表中有字段,user_id,created_at,content 那么我们建立唯一规则时 一般情况下会进行 user_id,created_at联合唯一。 但是当某些情况下, 我们在点击发布的时候 如果按钮没有通过js进行限定或客户端禁用js,那么我在一个比较短的时间内(点击按钮到收到服务器响应进行跳转这段时间内)有多次进行点击了。或者在提交的时候 每个1秒点一次提交,一共点了10次。 经过个人测试,是会产生10条 逻辑上重复的数据的。 但是表内存储的内容确实是唯一的。
比如
user_id | created_at | content |
---|---|---|
1 | 100 | 内容 |
1 | 101 | 内容 |
1 | 102 | 内容 |
1 | 103 | 内容 |
1 | 104 | 内容 |
1 | 105 | 内容 |
1 | 106 | 内容 |
1 | 107 | 内容 |
1 | 108 | 内容 |
1 | 109 | 内容 |
这就出现了 逻辑上的重复数据了。
想到不行就联合验证3个字段的内容
[['user_id', 'created_at'], 'unique', 'targetAttribute' => ['user_id','created_at', 'content']],
于是问题是:
1.因为content
是varchar并且内容可能会比较多,那么yii在进行 unique 的时候会不会消耗比较大?
2.对于我说的这种情况,各位有什么好的办法吗?
3.在一个应用中 需要防止重复提交的地方应该是比较多的。如果通过php后台方式进行避免重复,难道每个action中都要进行相应代码的编写吗?那不一堆一堆的重复了?
欢迎大家指导,讨论,谢谢。
共 1 条回复
-
这个问题要分多种情况:
1.宽松点的可以设置每个用户的连续发布时间间隔,比如2秒内同一用户只能发一次。
2.严格一点,可以使用:用户id+content的前10个字符(也可以是固定几个位置的字符,比如10-20)+字符串长度进行md5.然后比对md5。这些都是有实效的,可以直接放在缓存里,设置一个10秒的缓存时间。
3.最严格的话,就是用户ID+content全文md5之类,精确,但是消耗有点大。共 1 条回复xjdata 觉得很赞
xjdata
最后登录:2024-05-05
在线时长:112小时38分
- 粉丝23
- 金钱14169
- 威望75
- 积分16039