当前位置: 首页 > 知识库问答 >
问题:

为什么ASP.NET Identity 2.0使用GUID/String作为用户ID?

吴城
2023-03-14

我是否遗漏了什么,还是整数仍然是更好的选择?

共有1个答案

暨曾笑
2023-03-14

关于guid的使用,有一种观点提倡使用没有“意义”的ID,以便将标识符与其周围的数据完全分离;此id在数据存储外部不应可见。如果我们查看代理项的一些特性,我们有以下几个

  • 该值在系统范围内是唯一的,因此永远不会重用
  • 值是系统生成的
  • 用户或应用程序无法操作该值
  • 值不包含语义
  • 该值对用户或应用程序不可见
  • 该值不是由来自不同域的多个值组成。

因此,guid符合要求,因为它确实是由系统生成的,与域没有关系。我认为guid的使用主要是这种特定思维方式的趋势问题;然而,由于他们引入了“可扩展主键”的新机制,键可以被更改,因此您可以在PK中返回一个整数。

GUID似乎是主键的一个自然选择--如果您真的必须这样做,您可能会争论将它用于表的主键。我强烈建议不要使用GUID列作为群集键,SQL Server在默认情况下这样做,除非您明确告诉它不要这样做。

您确实需要将两个问题分开:

  • 主键是一个逻辑结构--唯一可靠地标识表中每一行的候选键之一。这可以是任何东西,真的--对您的场景最有意义的INT、GUID、string-pick。
  • 集群键(定义表上“聚集索引”的一列或多列)--这是一个物理存储相关的东西,在这里,一个小的、稳定的、不断增加的数据类型是最佳的pick-int或BIGINT作为默认选项。
 类似资料:
  • 问题内容: 我是第一次遇到,很惊讶,因为Java已经具有一个非常强大的类,可以追加。 为什么要上第二堂课? 在哪里可以了解更多信息? 问题答案: 不允许附加。你在上调用的每个方法都会创建一个新对象并返回它。这是因为String它是不可变的-无法更改其内部状态。 另一方面是可变的。调用时,它会更改内部char数组,而不是创建新的字符串对象。 因此,拥有: 而不是,这将创建500个新的字符串对象。 请

  • 问题内容: 我需要将GUID / UUID作为行的ID列。 这是为了能够在线和离线创建条目,并且合并时当然不会在PK上存在这些冲突。我知道我可以缓解这种情况,但是我想保持简单,并且已有一些遗留应用程序已经在使用uuid / guid定义关系。以后还需要双向同步数据。重写现有应用程序不是一种选择。 当我尝试在grails上使用GUID或UUID时,出现错误500。(在h2上使用GUID会导致另一个错

  • 问题内容: 我遇到过,我不确定它到底在做什么。 例如: 作者为什么要在块关闭连接和垃圾收集器处理时输入? 问题答案: 真正归结为成为“好公民”(并且真正了解接口契约)。什么会做的是释放被持有的所有资源,这实质上意味着释放任何基础流,并给予Connection对象返回到其池(在的情况下你的连接管理器是一个多线程的一个)或释放连接管理器,以便它可以处理下一个要求。 如果您不使用,则实际发生的情况取决于

  • 问题内容: 谁能帮助解释为什么JNDI应该是公开数据库/ jms等服务的首选方式? 我遇到的所有帖子都谈到了不必加载特定的驱动程序管理器,从连接池中受益等优点,但是可以通过在属性文件中指定驱动程序管理器并使用反射来轻松实现。 连接池也可以通过将正确的实现方式通过spring或其他方式连接到应用Bean中来实现。 那么,为什么使用JNDI会更好呢? 问题答案: 当您必须在不同环境之间移动应用程序时,

  • 我经常看到函数或方法返回Result 换句话说,这种返回不会返回任何内容或错误。为什么使用会导致这种情况,而不是一种选择?我认为这个选项更合适,因为在我们的示例中,它实际上不返回任何值或值——无或错误。

  • 问题内容: 我有一个将对象保存到数据库的EJB。在我看到的一个示例中,一旦保存了此数据(EntityManager.persist),就会调用EntityManager.flush();。为什么我需要这样做?我要保存的对象未附加,以后在该方法中也不会使用。实际上,一旦保存,该方法就会返回,并且我希望资源会被释放。(示例代码也在remove调用上执行此操作。) 问题答案: 调用将强制数据立即被持久保