【发布时间】:2012-03-11 12:37:45
【问题描述】:
我目前正在开发注册系统原型。它非常简单,本质上只是一个写入 MongoDB 的 .NET 表单。
我坚持的是一种为每个用户生成唯一 ID/密钥的有效方法。这些 id 必须是人类友好的,因此类似于 7 个字符长的字母数字字符串,例如A1B2C3X。
到目前为止我看到的解决方案只是使用一个简单的函数来生成一个随机字符串,然后检查数据库以查看它是否是唯一的(如果不重复,直到找到一个唯一的)。随着数据库条目数量的增加,这当然会变得越来越昂贵。
我的想法是预先计算唯一 ID 集并将其存储在另一个数据库中。然后,当我需要在用户数据库中添加一个新条目时,我可以从我的 id 数据库中“弹出”一个 id(在恒定时间内),并且知道它在用户数据库中不存在,而无需搜索它。
我敢肯定,以前一定有人做过这样的事情。有没有更好的办法?我不知道为什么我要为此苦苦挣扎。非常感谢您的意见。
【问题讨论】:
-
MongoDB 驱动程序提供的 ObjectId 是否对您的用例不友好?
-
我打算建议@EkinKoc 建议的内容(如果您对 40 个字符没问题,那就是要走的路)。但是,如果您恰好需要 7 个字符,那么与使用单独的数据库密钥库来弹出值相比,您概述的方法应该更便宜、更简单且更不容易出错。随机 7 个字符的字母数字字符串发生冲突的可能性几乎为零。这是您不应该优化的罕见边缘情况。 (无论如何,用户创建很少见,数据库唯一性检查对于相对罕见的过程来说足够快)。
-
@BenLee:碰撞概率随规模变化:)
-
@SergioTulentsev,是的,但这里有点争议。假设只有大写字母和数字,每个插槽仍有 36 种可能性。 36**7 = 78_364_164_096。 780 亿。一个系统将获得多少用户?即使是 facebook 也很少会遇到使用这种算法的冲突。
-
@LukeEllis:如果这个自定义 id 字段被索引,那么检查非常便宜。
标签: mongodb key unique database