3

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

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

  • 首先,ID 太长了,我不希望我的用户在搜索时输入这么长的值。

  • 其次,我读到这会影响查询的性能并减慢我的数据库。

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

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

如果有人知道最佳实践或有任何关于如何实现这一点的例子,请告诉我。

4

1 回答 1

7

与大多数其他事情一样,它取决于

看起来应该是一个如此简单的问题很快就会变得相当复杂。INT甚至BIGINT比 a 小得多,GUID但只有 300k 左右的记录,它不会对大小产生巨大影响,但 aGUID作为你的 PRIMARY KEY导致严重的碎片化。这肯定会影响您的索引,如果您需要最高性能,可能会导致查找问题。

如果优先考虑高安全性,那么使用顺序 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/

而且你应该时刻注意特里普女士的建议。https://www.sqlskills.com/blogs/kimberly/guids-as-primary-keys-andor-the-clustering-key/

尽管杰夫阿特伍德有不同的看法。和乔·塞尔科一样。https://blog.codinghorror.com/primary-keys-ids-versus-guids/

谷歌上有大量的链接可以为你提供这个讨论的多个方面。它真的开始接近宗教辩论。最终,我认为这里没有人能告诉你什么是“最佳实践”。您必须在系统中尝试不同的方法,看看哪种方法最适合您所拥有的。

于 2018-02-27T15:01:36.283 回答