数据库设计:在这种情况下复制信息是否有意义?

时间:2012-10-22 09:03:09

标签: database database-design data-structures

我正在构建一种服务,一种社交网络,预计会吸引数万亿用户。这些用户将能够关注其他用户。对于这种情况,让我们想象一下,我正在构建Facebook。哈!

在每个用户的名字旁边,会有他拥有的粉丝数量。像

这样的东西
SELECT COUNT(*) FROM users_vs_users 
  WHERE user_followed_id = 'xxx' GROUP BY user_followed;

会起作用,但为每个页面重新加载和检查数万亿用户这样做会导致我的服务器无法使用。

在每个用户的num_of_followers表中都有一个名为users的字段是否合理,每次有人关注或取消关注时都会更新?

由于

3 个答案:

答案 0 :(得分:2)

是。实际上,出于性能原因,您正在进行非规范化。

答案 1 :(得分:2)

我在这里有另一个意见

某些数据库可以使用内存(加上磁盘同步),如Oracle时代十和MySQL Cluster

仅将基于内存的数据库用于经常访问的数据通常可以提供出色的性能,只需简单地处理“计算”字段历史记录的麻烦

另一个BIG提示,除非必须,否则永远不会优化,尝试预测未来几个月的预期流量,而不是几年,然后您可以监控哪些查询实际上是在破坏性能或执行过多的磁盘访问,就在那时你能够根据实际信息对表进行去规范化,而不是猜测

答案 2 :(得分:1)

在我看来,任何自尊的DBMS都应该在内部自行执行这样的优化。或许他们已经做过了? COUNT(*)实际上很慢吗?我不知道。

无论如何,为什么不呢?只需确保随时同步“users_vs_users”和“users.num_of_followers”。