我创建了一个新应用程序。对于这个项目,我构建了一个登录页面。在存储用户信息的表中,我正在寻找一列来保存用户 ID。该 ID 对于系统中的每个用户来说应该是唯一的。在网上查找时,我发现了一些建议,但每个建议都有不同的问题。
在我的项目中,我使用 ColdFusion 2016 和 Microsoft SQL 2008。最初我打算使用 NEWID()
使用 SQL 为每个用户生成 key ,但这个解决方案有一些我不喜欢的地方。
首先,ID 太长,我不希望我的用户在搜索时必须输入这么长的值。
其次,我了解到这会影响查询的性能并降低数据库速度。
然后我正在考虑使用auto-increment id
。我认为这个解决方案对于系统ID来说太简单了,可能会在将来引起一些冲突。
例如,如果必须重新创建表,我不确定 ID 是否会保持不变。所以我想知道为系统创建唯一 id 的最佳实践是什么?我应该使用 ColdFusion CreateUUID()
?在我看来,这又太长了。
如果有人知道最佳实践或有任何如何实现这一目标的示例,请告诉我。
最佳答案
与大多数其他事情一样这取决于。
一些看似简单的问题很快就会变得非常复杂。而且INT
甚至BIGINT
比GUID
小得多,但只有300k左右的记录,它不会对大小,但将 GUID
作为主键将会导致严重的碎片。这肯定会影响您的索引,并且如果您需要最大性能,可能会导致查找问题。
如果高安全性是首要任务,那么使用顺序 id 的坏处之一是,当(而不是如果)坏人发现您的 id 方案时,它会非常容易地通过您的用户进行计算。 GUID
解决了这个问题,即使跨多个系统,两个人拥有相同 GUID
的机会也非常小。
SQL 2008 确实有 newsequentialid()
,它可以帮助解决 newid()
的一些问题。它将显着减少碎片,但仍然需要比 INT
更多的存储空间。 https://learn.microsoft.com/en-us/sql/t-sql/functions/newsequentialid-transact-sql
同样,这是一个需要您认真思考的问题,尤其是它将如何影响您的系统。这最终是您必须在预期系统中权衡的问题。
https://news.ycombinator.com/item?id=14523523
https://blogs.msdn.microsoft.com/sqlserverfaq/2010/05/27/guid-vs-int-debate/
你应该时刻关注特里普女士的建议。 https://www.sqlskills.com/blogs/kimberly/guids-as-primary-keys-andor-the-clustering-key/
尽管杰夫·阿特伍德有不同的看法。乔·塞尔科也是如此。 https://blog.codinghorror.com/primary-keys-ids-versus-guids/
Google 上有大量链接,可以让您从多个方面了解此讨论。它真正开始接近宗教辩论。最终,我认为这里没有人可以告诉您“最佳实践”是什么。您必须在系统中尝试不同的方法,看看哪种方法最适合您所拥有的系统。
关于sql - 在系统中创建用户 ID 的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49009909/