0

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

用户可以更改大约 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 中读取,我只要求从该表中获取索引 id。

第二种方法是:为用户拥有的所有用户设置创建一行,如下所示:

CREATE TABLE all_user_config ( /***/ ) type=MyISAM;

它包含大约 30 个列,但是维护整个系统有点困难。

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

4

1 回答 1

1

我个人建议将ENUM字段保存在一张大表中,这样您只需查询和更新一个巨大的索引而不是五个。如果图表是真实的,这就是 Facebook 所做的或至少曾经做过的有点陈旧的类图。

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

于 2012-05-05T10:44:47.500 回答