在数据库中检查大块值的唯一性

时间:2015-12-13 17:50:44

标签: php mysql database optimization

我需要创建长度较短(约6个字符)的促销代码。促销代码必须是唯一的,所以我需要检查它们在数据库中的唯一性。它们需要分批生成,因此每次使用优惠券时检查db是不可行的。我创建了一种方法,首先生成所需数量的优惠券,然后使用in()中的位置检查重复项。如果重复计数大于零,则会再次生成计数。

public function generateCoupons($count, $length = 6)
{
    $coupons = [];
    while(count($coupons) < $count) {
        do {
            $coupon = strtoupper(str_random($length));
        } while (in_array($coupon, $coupons));
        $coupons[] = $coupon;
    }

    $existing = Offer::whereIn('coupon', $coupons)->count();
    if ($existing > 0)
        $coupons += $this->generateCoupons($existing, $length);

    return (count($coupons) == 1) ? $coupons[0] : $coupons;
}

需要建议如何改进这个?或者,如果我可以通过其他方式实现相同的目标。

2 个答案:

答案 0 :(得分:1)

确保您的数据库中的促销代码已编入索引。这将加快搜索现有的促销代码。

否则,你的方法很好!你想一次检查尽可能多的代码(使用whereIn / count),只重新生成不唯一的代码。

答案 1 :(得分:1)

与1000名候选人一起构建一个表new_codesPRIMARY KEY(code)

DELETE new_codes
    FROM new_codes
    LEFT JOIN existing_codes ON existing_codes.code = new_codes.code
    WHERE existing_codes.code IS NOT NULL;

那(如果我做对了)将很快删除重复。现在你将不会有相当不错的&#39; good&#39;码。