我可能需要进行大量的userid->用户名查找。所以我在想,而不是像下面的表那样
userid int PK
username text
userpass_salthash int
user_someopt1 int
user_sig text
让它分解如下
//table1
userid int PK
username text
//table2
userid int //fk
userpass_salthash int
user_someopt1 int
user_sig text
推理我会这样做是因为我怀疑一个不那么复杂的表(如果我愿意,我也可以使名称不再是32字节)更快的查找和更少的数据作为奖励。但我知道我可能是错的,我应该做哪个版本以及优化旁边的原因是什么?
答案 0 :(得分:5)
您应该为规范化和性能执行第一个选项(单个表)。
性能:
(UserId, Username)
上放置一个索引,那么您将拥有覆盖索引 - 因此您无需转到该表以获取用户名。 UserId
上,您将获得聚集索引搜索 - 无论如何都会以行数据结束。归一化:
我的建议是UserId的聚集索引。如果你需要聚集索引在其他地方,覆盖索引几乎一样好。
答案 1 :(得分:1)
我同意,对于一张狭窄的桌子,一张桌子几乎肯定是最好的选择。
要添加的另一件事 - 文本数据类型(如果您使用的是MS SQL Server)非常广泛。 nvarchar(200)应该足够宽。自行使用LOB数据。
答案 2 :(得分:1)
除非您确定需要,否则请不要担心优化查找。请记住Optmization Club的规则。