对于像stackoverflow这样的高流量网站,数据库设计和规范化的最佳实践是什么?
应该使用规范化的数据库来保存记录,还是应该使用规范化的技术,或者两者的组合?
设计一个规范化的数据库作为记录保存的主数据库,以减少冗余,同时维护另一个非规范化形式的数据库以进行快速搜索,这是否明智?
或
主数据库是否应该被反规范化,但在应用程序级别使用规范化的视图以实现快速的数据库操作?
或者其他方法?
发布于 2009-08-02 08:11:10
加入对性能的影响经常被高估。像Oracle这样的数据库产品是为高效连接而构建的。当真正的罪魁祸首是糟糕的数据模型或糟糕的索引策略时,连接通常被认为表现不佳。人们还忘记了,当涉及到插入或更新数据时,非正规化数据库的性能非常差。
要记住的关键是您正在构建的应用程序的类型。大多数著名的网站都不像常规的企业应用程序。这就是为什么Google、Facebook等不使用关系数据库的原因。最近有很多关于这个话题的讨论,比如I have blogged about。
因此,如果你正在构建一个网站,它主要是提供大量的半结构化内容,那么你可能不想使用关系数据库,不管是非规范化的还是其他的。但是,如果你正在构建一个高事务性的网站(如网上银行),你需要一个能保证数据安全性和完整性的设计,而且做得很好。这意味着至少有第三种范式的关系数据库。
发布于 2009-08-01 19:33:43
去规格化数据库以减少密集查询所需的联接数量是许多不同的缩放方式之一。必须进行较少的连接意味着较少的db繁重工作,并且磁盘成本较低。
也就是说,对于数量惊人的流量来说,很难实现良好的关系数据库性能。这就是为什么许多较大的站点使用键值存储(例如memcached)和其他缓存机制。
发布于 2009-08-01 20:22:56
首先:自己定义高流量意味着什么:
然后将其计算为每分钟和每秒的可能峰值页面浏览量。在此之后,请考虑您希望在每个页面视图中查询的数据。数据是可缓存的吗?数据的动态性如何,数据量有多大?
分析你的个人需求,编写一些代码,做一些负载测试,优化。在大多数情况下,在需要向外扩展数据库服务器之前,需要向外扩展web服务器。
关系数据库在连接表时,如果完全优化,速度会令人惊叹!
当关系数据库作为后端填充缓存或填充一些非规范化数据表时,很少会被命中。我不会将反规范化作为默认方法。
(你提到了搜索,如果你需要全文搜索,可以看看lucene或其他类似的东西。)
最佳实践答案肯定是:视情况而定;-)
https://stackoverflow.com/questions/1217262
复制相似问题