sql - 在系统中创建用户 ID 的最佳实践是什么?

标签 sql sql-server-2008 coldfusion uniqueidentifier coldfusion-2016

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

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

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

  • 其次,我了解到这会影响查询的性能并降低数据库速度。

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

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

如果有人知道最佳实践或有任何如何实现这一目标的示例,请告诉我。

最佳答案

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

一些看似简单的问题很快就会变得非常复杂。而且INT甚至BIGINTGUID小得多,但只有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/

相关文章:

php - 选择数据库,获取某列的所有最大值

SQL Server 审核注销会产生大量读取

coldfusion - 当我们在 ColdFusion 中使用 API 调用(POST 请求)将参数数量传递到服务器时,如何修复 'POST request Exceeded' 错误?

coldfusion - 使用 onMissingMethod 无法访问对象变量

variables - 变量 cfform 值 - 嵌套井号

sql - 在 Azure Databricks 的 Spark-SQL 中创建用户定义(非临时)函数

sql - 重新创建可能需要IN的SELECT

SQL 麻烦的考试查询

c# - 在 sys.servers 中找不到服务器 'DB name'(不是 dbo 问题)

sql - 在 SQL Server 2008 中创建新数据库时的自动关闭选项是什么?