MYSQL:用户 - 配置文件详细信息表设置 - 最佳实践

时间:2010-10-08 10:53:49

标签: php mysql

在普通用户表“user”(user_id / user_email / user_pwd / etc)旁边,存储个人资料信息的最佳方式是什么?

是否只需将字段添加到用户表中,例如“user”

(user_id/user_email/user_pwd/user_firstname/user_lastname/user_views/etc)

或创建另一个名为“profiles”的表

(profile_id/user_id/user_firstname/user_lastname/user_views/etc)

还是会选择带有属性定义的表和另一个用于存储这些值的表?

我知道最后一个是最灵活的,因为您可以轻松添加和删除字段。 但对于一个大型网站(5万用户),这会很快吗?

3 个答案:

答案 0 :(得分:36)

您的方法需要考虑的事项

在用户表中存储用户个人资料

  • 这通常是获取配置文件数据方面最快的方法,尽管此处可能包含大量冗余数据(可能没有任何信息的列)。
  • 快速(特别是如果您只从数据库中提取所需的列)
  • 浪费数据
  • 更难以使用/维护(可以使用PHPMyAdmin等接口)

在User_Profile中存储用户配置文件表1-1与用户的关系

  • 加入时仍然应该非常快,如果用户配置文件没有创建,除非用户填写用户配置文件,否则可能会消除一些数据冗余。
  • 更易于使用
  • 由于加入(或第二次查询)而变得如此轻微

将用户个人资料存储为表格中的属性和值

*即。用于存储可能选项的表,用于存储user_id的表,option_id和值*

  • 没有存储冗余数据,所有数据都相关
  • 最常规化的方法
  • 检索和更新数据的速度较慢

我的印象是,大多数网站使用第二种方法并将配置文件信息存储在第二个表中,这对于大多数较大的网站而言是常见的,以便对数据库(twitter,facebook)进行去规范化,从而以较慢的写入为代价实现更高的读取性能性能

我认为,当您查看50,000条记录时,将配置文件信息保存在第二个表中可能是最佳选择。为了获得最佳性能,您希望保持与读取的数据严重分离的数据,以确保缓存可以有效工作。

答案 1 :(得分:17)

带有属性定义的表不是一个好主意。我建议使用三个表来存储数据:

user(id,login,email,pwd, is_banned, expired, ...) 
-- rarely changed, keep small, extremaly fast search, easy to cache, admin data
profile(id, user_id, firstname,lastname, hobby,description, motto)
--data often changed by user,...    
user_stats(id,user_id,last_login,first_login,post_counter, visit_counter, comment_counter)
--counters are very often updated, dml invalidate cache

存储授权和身份验证数据的更好方法是LDAP。

答案 2 :(得分:7)

你需要超过3张桌子。他将如何存储多个电子邮件,多个地址,多个教育历史,多个“寻找”关系等数据。每个人都需要自己的行,假设许多值将被查找,如城市,性别偏好,学校名称等,所以要么正常化它完全或者是noSQL路线,没有任何意义悬挂在中间,你将失去两全其美。

你可以复制行,但它不会很好。社交网络不适合50,000个用户。要么你会成功并拥有数百万用户,否则你会崩溃并抓住它,因为运行这些你需要$$$,只有你有一个坚实的用户群才会来。只有50,000名终身用户投资者不会投资,广告收入不会支付成本,您将关闭它。所以设计它就像你想从第一天就成为下一个facebook。好好想想!