sql - 随机字符串来识别记录?
问题描述
我想做一些类似于 imgur 和大多数其他网站所做的事情:我想在 URL 中使用随机字符串来识别用户正在寻找的任何帖子。
使用这样的随机字符串作为主键可能不是一个好主意,并且确保在用户发送提交时尚未使用随机生成的字符串,会随着时间的推移减慢表的速度,因为它需要检查越来越多的记录以确保没有重复。如何实现这样的随机字符串进行识别?
我的想法,如果这是一个非常糟糕的想法,请告诉我,是有一个充满这些随机字符串的表。该表如下所示:
| submissionId | stringId
+--------------+----------
| 1 | rbMZV
+--------------+----------
| 2 | MQyPi
+--------------+----------
| NULL | hfXL7
生成这些字符串时,它们没有分配 submitId,例如我的示例表中的“hfXL7”。当用户进行提交时,我的脚本将采用第一个随机生成的尚未分配 submitId 的字符串,并将提交时生成的 submitId 添加到该记录中。我在某处有一个进程定期生成更多字符串,这些字符串可用于人们进行更多提交,因此当有人提交时,总是至少有一个随机生成的字符串没有 submitId。
解决方案
以下是三种基本方法:
- 预先生成并存储所有随机 ID - 足够多,以至于它们永远不可能用完(给定预测的总使用次数)。这里的一个缺点是可能难以预测支持系统生命周期所需的 ID 总数。
- 生成足够数量的随机 ID,以在设定的时间段内提供足够多的 ID。然后周期性地产生足够的新的来满足预测的需求。(例如,时间段可能是一天,发电机可能计划在夜间需求低的某个时间点运行。)
- 即时生成随机 ID - 仅在需要时生成。
各有利弊:
- 如果存储不是问题,(1)可能是最简单的选择,因为一旦完成,它就完成了并且永远存在 - 您不必担心失败的作业等。
- (2) 基本上是您提出的方法:这看起来不错,但这里还有更多需要考虑的事情,例如不可预测的使用高峰、失败的计划作业等。
- (3) 也可能是简单的并保持精简,因为表格会随着时间的推移而增长,并且无需预测使用情况。这里潜在的缺点是,任何此类函数都会一直生成 ID,直到找到唯一的 ID,因此它可能会随着 ID 数量的增加而变慢——尽管只要不同随机排列的数量是显着大于潜在的使用总数。
上述方法(3)的演示
如何在 MySQL 中实现 on-the-fly 生成器的在线演示:http ://rextester.com/TKGPZ41053
排列数计算
如果是区分大小写的字母数字,则共有 62 个不同的字符。所以每个长度的可能排列数如下:
Characters | Permutations
1 | 62
2 | 3844
3 | 238328
4 | 14776336
5 | 916132832
6 | 56800235584
7 | 3521614606208
8 | 218340105584896
9 | 13537086546263552
10 | 839299365868340224
推荐阅读
- javascript - PowerBI-Javascript 嵌入式仪表板不可“点击”(钻取到关联的报告等)
- laravel - 如何从 SQL 语句创建查询生成器
- sql-server - 在 DateTime 值之间选择行的 TSQL 语法是什么
- r - 使 tabsetPanel 修复闪亮
- angularjs - 未捕获的错误:[$injector:modulerr] - AngularJS(包括其他模块)
- r - R:测试用户定义的函数参数是否属于“逻辑”类
- floating-point - 为什么将整数 1 添加到另一个整数,然后转换为浮点数给我 0.99?
- python - 在python中动态创建并写入多个文件
- javascript - 如何在不同的行中获取显示字段
- php - 如何在自定义时间戳 expire_at 上应用 diffForHumans?