【问题标题】:What is the best practice for creating user ID in the system? [closed]在系统中创建用户 ID 的最佳实践是什么? [关闭]
【发布时间】:2018-02-27 13:32:19
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 您可以将自动增量 ID 与 34567 之类的种子或您需要的任何套件一起使用,这意味着初始 ID 不会从 1 开始,而是从种子号 34567 开始,即维护您的 ID在操作表时,SQL 提供了 ALLOW_IDENTITY_INSERT 等工具来保持数据完整性
  • @TSion.D.P 你能提供一个如何播种 id 的例子吗? Allow_identity_insert 我猜应该只在操作表格时使用?
  • 您可以在给定种子编号和增量编号时使用种子 ID EX:Create table Tablea (id int identity 2000,1)。如果你想在插入时关闭身份插入,试试这个set Identity_insert tablea off
  • 搜索不需要使用NEWID()生成的ID。您可以使用另一个键进行搜索。该密钥可以是身份密钥。
  • 我使用 CreateUUID (ColdFusion) 或 UUID (MySQL)。然后我知道我的 ID 是独一无二的。意外从错误表中删除记录的可能性为零,更容易在 mysql 备份文件中查找等。唯一性很重要。

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


【解决方案1】:

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

看似简单的事情很快就会变得相当复杂。而INT 甚至BIGINT 明显小于GUID,但只有300k 左右的记录,它不会对大小产生巨大影响,但GUID 作为您的主键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/

而且你应该时刻注意特里普女士的建议。 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 上有数以千计的链接可以为您提供本次讨论的多个方面。它真的开始接近宗教辩论。最终,我认为这里没有人能告诉你什么是“最佳实践”。你必须在你的系统中尝试不同的方法,看看哪种方法最适合你所拥有的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多