我已经创建了一个函数,当用户注册时为其生成一个唯一的引用代码,我想确保它的唯一性,所以我检查它是否已经存在,如果确实存在,那么我会再次以递归的方式调用该函数:
public function generateUniqueReferralCode()
{
$referral_code = str_random(8);
if(User::where('referral_code', $referral_code)->exists()) {
$referral_code = $this->generateUniqueReferralCode();
}
return $referral_code;
}
我的问题是,这计算价格昂贵吗?它是否可以以更有效的方式完成,因为它必须扫描用户表?假设我们有100万用户,如果密钥已经存在,它将检查100万用户记录。
答案 0 :(得分:0)
我的方法会更简单一些。我不是检查所有这些记录的唯一性,而是生成一个随机密钥并植入最后一条记录的主键或要生成的记录。
例如,这是我的思路
1234abc
3
1234abc3
(将永远是unqiue)答案 1 :(得分:0)
PHP函数非常昂贵。所以我认为以下内容更快一些(没有基准测试):
public function generateUniqueReferralCode() {
$referral_code = str_random(8);
while (User::where('referral_code', $referral_code)->exists()) {
$referral_code = str_random(8);
}
return $referral_code;
}
答案 2 :(得分:0)
不,数据库使用有效的索引(搜索树或哈希码)进行有效的查找,因此记录的数量实际上并不重要。
但是你为什么不增加一个计数器来暗中保证唯一性呢? (如果需要,可以添加随机盐。)