批量ENUM哪种方法好得多?

时间:2012-05-05 09:31:03

标签: mysql sql

这适用于自定义社交网络。 任何用户都有“个人资料设置”

用户可以更改约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个列,但是维护整个系统会更加困难。

问题是: 推荐哪种方法适合十亿行?

1 个答案:

答案 0 :(得分:1)

我个人建议将ENUM字段保存在一个大表中,这样您只需查询和更新一个巨大的索引而不是五个。如果图表是真实的,那就是有点年龄class diagram声称Facebook做了 - 或者至少过去做过的事情。

如果您认真对待估计的用户数(Facebook目前拥有9亿用户),您可能需要考虑放弃MySQL等关系数据库,转而采用无SQL解决方案,例如键值存储Cassandra或面向文档MongoDB。它们倾向于扩展到巨大的规模,并且比关系数据库更顺利地部署到分布式环境。