php – 从关系数据库到非关系数据库的数据规范化的最佳实践

我正在运行一个开始超越简单性能和Tunning的网站.这是一个PHP应用程序,MySQL作为后端.正确调整MySQL并优化代码.

问题是,我发现我可以使用某种非规范化来加快速度.

假设您有一个类似于ebay或亚马逊的网站.您的数据库中有产品,其中包含一些相关信息(卖家,购买产品的客户,城市,州等).这将是Relational DataBase中的多个表,并且很好地保持这种方式以获得良好的查询.但是,例如,对于主页,您可以使用一个非规范化文档(例如,在MongoDB中).可以是最新产品的集合,denormalied,类似于:

products = {
   {
      id:13,
      name:"Some product",
      city:"aCity",
      state:"aState",
      price:"10"
   },
   {
      id:123,
      name:"another product",
      city:"aCity",
      state:"aState",
      price:"10"
   }
}

这样,我可以查询该集合而不是MySQL数据库(包含所有连接),事情可以变得非常快.

现在,问题就在这里.何时以及如何对数据进行非规范化?
例如,我可以决定在插入数据时对数据进行非规范化.

所以,在我的“create-product.php”中(简单地说).我可以为mysql做所有“插入”,之后我可以保存到Mongo集合.

或者,我可以在服务器中运行一个程序.或者让一些cron来寻找最新产品.

所有这些都是可能的.你是做什么?你的经验是什么?

非常感谢.

最佳答案
从概念上讲,你正在创建某种缓存,并且你在预测填充它会花费很多时间,因此你希望让它持久化,合理的假设是从持久缓存加载比进行更快回到真正的数据库.

您的想法有一些变化,缓存HTML页面fragements或JSON字符串,并使用分布式内存缓存 – 不是持久但容错.

所有缓存解决方案的一个重要问题是:“我能承受多么陈旧?”.对于一些24小时过时的数据并不重要.例如:十大最受欢迎的书籍?最新评论,对于那些只是批量更新的人来说.对于更紧急的东西,您可能需要确保更快速的更新,但您确实希望避免在主流中添加太多额外的处理.例如,给客户一个缓慢的购买体验是一种耻辱,因为他正在等待缓存的更新.在这些情况下,您可能只是在队列中删除“这是一个更新”消息,或者实际上是“您的入口nunber 23现在已经过时”消息,让缓存选择它作为其休闲,如果需要刷新本身.

转载注明原文:php – 从关系数据库到非关系数据库的数据规范化的最佳实践 - 代码日志