0

在这种情况下,我有一些经理(大约 150 人)。他们的日常工作之一是生成 50 个(常量)授权码(6-8 位数字),这些授权码与他们的 ID 一起存储在 db 中。如果使用了任何授权代码,则该代码被标记为已使用,并且触发器会在它们 15 天前并已使用时将其删除。

在我的表中,我将授权码设置为唯一键。我生成一个随机数然后查询数据库是否存在我生成另一个或者我保存它。

除了我检查数据库中是否存在数字的逻辑之外,一切都很好。截至目前,有超过 1090083 个待处理的授权代码,此往返 + 检查造成了严重延迟。由于这些授权码正在流通,我们无法撤销它,并且在当前负载下,它需要一些时间才能找到新号码。

我需要以不同的逻辑来实现它,无论已使用的随机数的数量如何,执行速度都应该很低。

我的表设计如下

slno(授权增量)|| auth_code (随机码) || auth_by (创建者) || 使用过(1=使用过/0=未使用过)

4

3 回答 3

0

最简单的做法是生成随机数并在您得到重复项时生成一个新的随机 id。这是可行的,因为根据您的数字,获得重复的可能性非常小。

如果这不能说服你,你可以想出许多在数学上保证数字是唯一的并且看起来仍然是随机的方案,但它变得复杂。

于 2013-07-04T12:05:14.383 回答
0

如果您的数据库不支持创建唯一 ID:
- 设置一个表,其中包含所有按值排序的随机数,并且其大小已存储并可用。

  • 随机选择此表的一个元素。
  • 获取后继元素。如果后继元素是该元素的邻居,则取下一个后继元素。如果您到达最后一个元素,请从第 2 步中的元素重新开始,现在采用前一个元素。
  • 现在只需使用 element-next 元素选择一个随机范围并获取您的随机数。
  • 准备好 !

示例:您将所有 id 存储在排序表中。假设这是例如
{890, 1045, 2345, 2346, 4087}

第一步:随机选择其中一个。你通过 C# 得到它

Random random = new Random();  
int indexOfNumber = random.Next(0, myTableSize);

第二步:你得到了索引,假设它是 2。你现在在索引 3 处得到下一个数字,它是 2346。不幸的是它是直接邻居,所以你继续索引 4。这是 4087。

第三步:创建您的号码

int myRandomNumber = previousElement + random.Next(1,nextElement-previousElement);

在这种情况下:

int myRandomNumber = 2346 + random.Next(1, 4087-2346);

存储新的随机数。有了这个,您将主要从数据库中读取两个元素(可能更多) ,而与数据库的大小无关。创建两个随机数是微不足道的。如果您的索引位于末尾(只需反转搜索方向),您必须只关心边缘情况。

于 2013-07-04T12:16:09.983 回答
0

考虑一下。如果随机数是唯一的并且以某种(code_id, code, other_data)表的方式存储在基数中,您可以在基数中添加另一个表:(code, code_id)code字段被编入索引,从而为您提供一些不错的对数搜索。

但鉴于此,您也可以在您的第一个表中创建一个附加键。只要code是独一无二的,它就可以正常工作。

于 2013-07-04T14:18:14.207 回答