在普通用户表“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万用户),这会很快吗?
答案 0 :(得分:36)
您的方法需要考虑的事项
在用户表中存储用户个人资料
在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。好好想想!