在这个场景中,我有一些经理(大约150人)。他们的日常工作之一是生成50个(恒定的)授权代码(6-8位数字),这些代码用他们的Id存储在db中。如果使用任何授权代码,则将该代码标记为已使用,并在使用15天后将其删除。
在我的表中,我将授权代码设置为唯一密钥。我生成一个随机数,然后查询数据库,如果它存在,我生成另一个,或者我保存它。
每件事情都很好,除了我在db.This往返+检查中检查数字的存在的逻辑之外,都造成了很大的延迟,到目前为止,有1090083多个待定授权代码。由于这些授权代码正在流通,我们不能撤销它,在当前负载下,需要一些时间才能找到新的数字。
我需要在一个不同的逻辑中实现它,执行速度应该是,低,考虑已经使用的随机数数。
我的桌子设计如下
slno(auth增量)\x{e76f}\x{e76f} auth_code (随机码)\{e76f}\\{e76f}\{e76f}\
发布于 2013-07-04 12:05:14
最简单的方法是生成随机数,并在得到一个重复的情况下生成一个新的随机id。这是因为用你的数字,得到一个复制的可能性是相当小的。
如果这并不能让你信服,你可以想出许多方案,在数学上保证数字是唯一的,看起来仍然是随机的,但它变得复杂了。
发布于 2013-07-04 12:16:09
如果数据库不支持创建唯一If:
示例:您将所有in存储在一个排序表中。让我们假设这是。
{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-04 14:18:14
考虑一下这个。如果randoms是唯一的,并且以某种(code_id, code, other_data)表的方式存储在一个基中,那么您可以在基中添加anoter表:带有code字段的(code, code_id),允许您进行一些很好的逻辑搜索。
但是,考虑到这一点,您还可以在第一个表中创建一个额外的键。一旦code是唯一的,它就会工作得很好。
https://stackoverflow.com/questions/17469492
复制相似问题