在系统中创建用户 ID 的最佳做法是什么?

What is the best practice for creating user ID in the system?

我创建了一个新的应用程序。对于这个项目,我构建了一个登录页面。在存储用户信息的 table 中,我正在寻找一个保留用户 ID 的列。此 ID 对于系统中的每个用户都应该是唯一的。在网上四处寻找时,我发现了一些建议,但每个建议都有不同的问题。

在我的项目中,我使用的是ColdFusion 2016和Microsoft SQL 2008。本来我打算在SQL中使用NEWID()为每个用户生成密钥,但是有这个解决方案有几点我不喜欢。

然后我在考虑使用auto-increment id。我认为这个解决方案对于系统ID来说太简单了,将来可能会引起一些冲突。

例如,如果必须重新创建 table,我不确定 ID 是否会保持不变。所以我想知道为系统创建唯一 ID 的最佳做法是什么?我应该使用 ColdFusion CreateUUID() 吗?在我看来,这又太长了。

如果有人知道最佳实践或有任何实现方法的示例,请告诉我。

与大多数其他事情一样视情况而定

看似简单的问题很快就会变得非常复杂。而且 INT 甚至 BIGINT 明显小于 GUID,但是只有 300k 左右的记录,它不会对大小产生巨大影响,但是 GUID因为您的 PRIMARY KEY WILL 会导致大量碎片。这肯定会影响您的索引,如果您需要最大性能,可能会导致查找问题。

如果优先考虑高安全性,那么使用顺序 ID 的坏处之一是,当坏人发现您的 ID 方案时(而不是如果),它会非常容易地通过您的用户进行计数。 GUIDs 解决了这个问题,即使跨多个系统,两个人拥有相同 GUID 的机会也很小。

SQL 2008 年确实有 newsequentialid(),这对 newid() 的一些问题有所帮助。它将显着减少碎片,但仍需要比 INT 中更多的存储空间。 https://docs.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/

并且您应该始终注意 Tripp 女士的建议。 https://www.sqlskills.com/blogs/kimberly/guids-as-primary-keys-andor-the-clustering-key/

虽然 Jeff Atwood 有不同的看法。和乔·塞尔科一样。 https://blog.codinghorror.com/primary-keys-ids-versus-guids/

Google 上大约有无数个链接,可以让您从多方面了解该讨论。它真的开始接近宗教辩论。最后,我认为这里没有人可以告诉您 "Best Practice" 是什么。您必须在您的系统中尝试不同的方法,看看哪种方法最适合您现有的方法。