【问题标题】:Check large chunk of values for uniqueness in database检查数据库中大量值的唯一性
【发布时间】:2016-03-19 04:21:47
【问题描述】:

我需要创建长度应该很短(约 6 个字符)的促销代码。促销代码必须是唯一的,因此我还需要检查它们在数据库中的唯一性。它们需要成批生成数千个,因此每次生成优惠券时都检查数据库是不可行的。我创建了一个方法,它首先生成所需数量的优惠券,然后使用 where 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;
}

需要建议如何改进?或者如果我可以有其他方法来实现同样的目标。

【问题讨论】:

    标签: php mysql database optimization


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      建立一个包含 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;
      

      那(如果我做得对的话)将很快删除重复。现在您将拥有不到 1000 个“好”代码。

      【讨论】:

      • 谢谢@Rick - 这样我将不得不重复新的插入,因为删除后,我需要检查有多少被删除并再次递归地重新生成相同的数字?
      • 我假设这些数字来自随机数生成器,所以它们每次都不同?在执行 DELETE 之前,与他们一起构建一个 1000 行的 INSERT 语句。
      猜你喜欢
      • 2022-01-11
      • 2017-04-29
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      相关资源
      最近更新 更多