这适用于自定义社交网络。 任何用户都有“个人资料设置”
用户可以更改约30个设置, 所以 有一些类别:
我制作了几个保存设置的表(ENUM类型)
如果我将这些设置放到小表中,就像这样(当然唯一的用户ID将被编入索引)
(用户ID是标签中的主键)
CREATE TABLE user_profile_settings ( ... ) type=MyISAM;
CREATE TABLE user_profile_notif ( ... ) type=MyISAM;
CREATE TABLE user_profile_auth ( ... ) type=MyISAM;
CREATE TABLE user_profile_security ( ... ) type=MyISAM;
CREATE TABLE user_profile_access ( ... ) type=MyISAM;
然后一个请求同时归结到几个表,这也意味着一些表态下降。 这样做的好处是:如果我只想从user_profile_settings中读取,我只需要从该表中索取index'ed id。
第二种方法是:为用户拥有的所有用户设置创建一行,如下所示:
CREATE TABLE all_user_config ( /***/ ) type=MyISAM;
它包含大约30个列,但是维护整个系统会更加困难。
问题是: 推荐哪种方法适合十亿行?
答案 0 :(得分:1)
我个人建议将ENUM
字段保存在一个大表中,这样您只需查询和更新一个巨大的索引而不是五个。如果图表是真实的,那就是有点年龄class diagram声称Facebook做了 - 或者至少过去做过的事情。
如果您认真对待估计的用户数(Facebook目前拥有9亿用户),您可能需要考虑放弃MySQL等关系数据库,转而采用无SQL解决方案,例如键值存储Cassandra或面向文档MongoDB。它们倾向于扩展到巨大的规模,并且比关系数据库更顺利地部署到分布式环境。