Database 创建用户名,即使用户名是唯一的?

Database 创建用户名,即使用户名是唯一的?,database,database-design,Database,Database Design,我的web应用程序将有各种类型的用户:根用户、系统管理员、客户、承包商等。我希望有一个表“user”,其中包含“Username”、“Password”和“Role”列,其中Role是上述角色之一。例如,我还将有一个名为“Customer”的表,用于存储特定于客户的属性 这是我的问题。因为所有用户名都是唯一的,所以我可以使用用户名作为用户表的主键。但是,创建一个“用户ID”列并使用它而不是用户名列作为PK是否更有意义?还有许多其他表将使用此用户PK作为外键,我认为,从性能角度来看,比较用户ID比

我的web应用程序将有各种类型的用户:根用户、系统管理员、客户、承包商等。我希望有一个表“user”,其中包含“Username”、“Password”和“Role”列,其中Role是上述角色之一。例如,我还将有一个名为“Customer”的表,用于存储特定于客户的属性

这是我的问题。因为所有用户名都是唯一的,所以我可以使用用户名作为用户表的主键。但是,创建一个“用户ID”列并使用它而不是用户名列作为PK是否更有意义?还有许多其他表将使用此用户PK作为外键,我认为,从性能角度来看,比较用户ID比比较用户名文本字符串更快


感谢您的回复。

我会创建用户名,因为虽然用户名可能是唯一的,但它们通常不是不可更改的,而且我不希望更改数千或数百万条记录,因为HLGEM希望成为HLGEM_1。整数上的进一步连接速度更快

有两个学派。数据库纯粹主义者认为,应该尽可能使用自然键(这是有道理的)。因此,如果您同意这一思路,并且用户名是不可更改的,那么将密钥设置为用户名


数据库实用主义者认为代理键更有用,而且更能适应需求的变化。在某些情况下,它们也可以更快,特别是对于大字符串键。还有安全问题,使用自然密钥可能会泄漏代理密钥无法提供的信息。

这是旧的自然密钥与代理密钥之争

简言之,任何事情都不是一成不变的,你需要在相互竞争的利益之间取得平衡:

  • 如果您预计需要更新密钥,请使用代理(不需要更新)以避免出现更新级联
  • 如果需要查找键,但不需要查找其他列,请使用自然键以完全避免联接。但是,如果您需要查找的不仅仅是键,那么可以使用代理使FKs和伴随的索引更细、更高效
  • 您是否预期对自然关键点进行范围扫描?如果是的话,请回答。但是,在集群表中,二级索引的开销可能会很高,这会影响代理键
  • 你的桌子很大吗?通过只有一个索引(在自然键上)而不是两个索引(在自然代理项上)来节省空间
  • 复合自然键(位于标识关系的子端点处)可能是进行此操作所必需的
  • 代理可能对ORM工具更友好
  • 在用户名的情况下

  • 您可能希望允许更新
  • 您不太可能只需要查找用户名
  • 对用户名进行范围扫描毫无意义(与equi搜索不同)
  • 你不是在储存地球上所有的人口,是吗
  • 我们在这里谈论的是“独立的”自然键,而不是一个由确定关系产生的自然键
  • 不知道

  • …因此,在这种情况下,代理密钥可能是合理的。

    尽管不言而喻,但无论您最终选择什么,都不要将密码存储在明文中。谢谢,布兰科。你提出了一些我没有考虑过的有趣的观点。我决定按照你和HLGEM的建议使用代理密钥。