我已经看到很多讨论是否更好地使用用户 ID 或用户名作为表的主键。如果需要,用户 ID 将允许以后更改用户名的灵活性。也是一种实现安全的方法。但是,用户名也是唯一标识符。
如果我选择 userid 作为主键,强制用户名具有唯一值的最佳方法是什么?
如果我选择用户名,我应该注意哪些问题?
我已经看到很多讨论是否更好地使用用户 ID 或用户名作为表的主键。如果需要,用户 ID 将允许以后更改用户名的灵活性。也是一种实现安全的方法。但是,用户名也是唯一标识符。
如果我选择 userid 作为主键,强制用户名具有唯一值的最佳方法是什么?
如果我选择用户名,我应该注意哪些问题?
我将声明UserId
为,PRIMARY KEY
因为将有其他表引用此用户记录UserId
,因此将有助于强制执行任何FOREIGN KEY
约束。
如果用户名需要唯一,那么我会将其声明为NON NULL
列并定义UNIQUE KEY
约束。该属性将阻止列中的约束NON NULL
允许的单个空值。UNIQUE KEY
因此,对 UserName 的设置将类似于PRIMARY KEY
.
这是我个人的观点。
我宁愿选择UserID
数据类型 int (或者可以是 string)作为表的主键,因为这在任何时候都不能改变。由于它是不可更改的,因此引用它的一些外键没有问题。
我没有选择的原因Username
是因为在某些时候,虽然这是独一无二的,但有时可以改变。如果已经有引用它的外键,则在首先删除或删除这些键或记录之前,根本无法更改该用户名。
在语义上,至少在我的耳朵里,userid听起来像是一个人为创建的值,可能是一个人工主键,而username听起来像是一个自然的、用户友好的(组成)自然主键。在相反的意义上使用这两个术语可能偶尔会混淆程序员和用户,并且可能会在未来产生微妙的错误。
强制用户名具有唯一值的最佳方法是什么?
创建唯一索引。
如果我选择用户名,我应该注意哪些问题?
你会允许用户随时更改他们的用户名(只要它保持唯一)吗?如果是,则使用您生成的用户 ID;否则使用他们选择的用户名。
对于您的第一个问题,UNIQUE
大多数现代 RDBMS 都提供约束。您也可以在应用程序级别实现它。
对于你的第二个问题,我没有看到任何明显的问题。用户名通常为最终用户所知。但是,如果您有大量用户并且用户名字段的最大长度很大,则索引可能不如 int 类型的 userID 字段高效。