实际项目中外键,应该用"userid"(账号)还是用user表"ID"

实际项目中外键,应该用"userid"(账号)还是用user表"ID"




表"ID"好处:

用id因为是int类型,比字符串类型的性能高得多,特别是在大数据量的情况下。在数据库的设计上,除非非常高级的系统,才会考虑int快和慢的问题。


"userid"(账号)

如果数据量比较大,有的情况下需要考虑尽量减少表连接的操作


这种情况我们一般叫“逻辑id”和“物理id”


userid------作为数据的物理id标识

用户名---------是数据的逻辑id


一般来说中小型项目通常使用物理id做为标识

而大型项目往往使用逻辑id做标识


区别,大型项目因为数据量大,结构复杂,网络硬件配置复杂,网络结构复杂,存储介质复杂。他们通常采用分布式的数据存储介质和分布式的网络环境,而在分库,分表的情况下,数据库的物理id就不可预览了,所以更多情况下使用逻辑id作为标识


比如:银行系统通常使用不与数据库id关联的,账户号做标识。而电信系统则因为硬件环境的限定使用电话号码做标识(电信系统通常的前置机只认主叫号,被叫号这种逻辑标识,而不认你自己的数据库id)


优化方案:

为了提高性能可以作数据冗余。例如:字段比较多,数据量又很大,你可以把Name字段上加入包含性列(不过这会占用一点额外的存储空间了)

可能修改的账号字段定义为loginid,用户表使用id,userid,作为标识。 UserName修改的机会要大很多,特别是企业应用,客户如果要求改一下用户名,如果用户名是外键那影响就大了.



相关话题:

外键约束会影响数据库性能,所以考虑只作业务约束。

表连接也有技巧:尽量用left join,不用inner join,这样可以提高效率

一个同事认为3次表连接以上就很可能会有性能问题

单机的情况下,4次表连接,主表20万行,在E8400+2G的机器上,做Group By统计,运行时间超过半个小时.后来将3个表连接保存为一个视图,再与主表连接,问题解决,30秒内完成.(不知道用的什么数据库,我不太信)


猜你喜欢

转载自my.oschina.net/u/2438634/blog/511512