Reddit的联合创始人就他们在扩展到数百万用户时遇到的问题做了介绍。摘要可用here。
令我惊讶的是第3点:
相反,他们保留了事物表和数据表。 Reddit中的所有内容都是事物:用户,链接,评论,subreddit,奖项等。事物具有共同的属性,例如上下投票,类型和创建日期。数据表具有三列:事物ID,键,值。每个属性都有一行。标题,URL,作者,垃圾邮件票等都有一行。当他们添加新功能时,他们不必再担心数据库了。他们不必为新事物添加新表,也不必担心升级。
对我来说,这似乎是一个可怕的主意,但对于Reddit来说似乎已经解决了。总的来说,这是个好主意吗?还是Reddit的特殊之处恰好为他们解决了?
这是实体属性值的EAV数据模型。它有其用途。一个典型的例子是患者测试数据,由于可以运行成千上万的测试,因此自然稀疏,但通常只有少数几个患者可以使用。具有成千上万列的表是很愚蠢的,但是具有EAV的表很有意义。
大多数真正的大型网站最终都在数据库方面使用了某种难以置信的简单方式。这具有快速且可扩展的优点。它的缺点是,您要使数据库自动(通过触发器等)强制执行的所有关系都改为[[需要强制在客户端代码中强制执行。保持一致性是一件令人头疼的事,并且至少在短期内,几乎总是有一定几率使您的数据不一致。
对于社交网站,这是一个值得折衷的选择。大多数时候大部分正确的数据就足够了(例如,谁真的在乎您收到的商品的上投票数是否真的比发送商品时早了20毫秒),并保持合理的成本,同时进行扩展以支持庞大的数量用户很重要。最后,这种方法有很多独特的挑战,您应该找到一种解决方法,这些都是您在日常工作中从未遇到过的问题,但是毕竟,您将获得更多的灵活性,可以花很多钱。