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