【发布时间】:2016-06-16 18:39:18
【问题描述】:
这更像是一个最佳实践问题。我正在使用以下参数生成一个随机字符串标识符:
- 长度:7 个字符
- 种子:A-Za-z0-9(小写 + 大写字母和数字)
我需要在插入之前检查该字符串是否存在于数据库中。我可以通过两种方式做到这一点:
- 运行
do...while循环。在其中,生成一个随机字符串,每次使用COUNT(*)查询数据库,直到count === 0。 - 首先使用单个查询从数据库中获取所有现有的唯一字符串,然后运行
do...while循环以生成不在提取数组中的随机字符串。
对我来说很明显,第二种方法在技术上对数据库服务器的资源密集度较低,因为只有一个查询,而不是一遍又一遍地查询。所以我倾向于这种方法,但我看到两个潜在的警告:
大型数据库,以及在获取和插入之间经过的时间。
大型数据库结果:在我需要考虑切换到第一种方法之前,查询结果中可以包含多少行?换句话说,数据库服务器上的大型结果集的压力何时低于运行多个后续查询? 1,000 个结果? 5000? 20,000?
获取和插入之间的时间:如果我使用第二种方法,当两个或多个用户尝试同时运行相同的功能时,我会发现风险。第一个用户的结果集(从数据库中获取的唯一字符串)可能不包括在查询后 2 毫秒刚刚添加的其他用户的唯一字符串。这可能会在数据库中产生重复。
第二种方法在生产中真的可行吗,还是只是一个梦想?
【问题讨论】:
-
您需要分析两次生成相同随机字符串的可能性。如果它足够小,那么您最好尝试插入它并检查您的查询中是否存在任何违反唯一性约束的错误。