代码之家  ›  专栏  ›  技术社区  ›  nico

我应该在数据库中复制数据吗?

  •  2
  • nico  · 技术社区  · 14 年前

    我有一个mysql数据库,其中包含一个网站页面的条目。 假设它有如下字段:

    Table pages:
    
    id  |  title  | content | date | author
    

    每个页面都可以由用户投票,所以我还有两个表

    Table users:
    id  |  name  | etc etc etc
    
    Table votes:
    id  |  id_user | id_page | vote
    

    现在,我有一个页面,我在其中显示页面列表(每次10-50页),其中包含各种信息以及页面的平均投票数。

    所以,我想知道是否最好:

    a)运行查询以显示页面(请注意,当查询三个表时,这已经相当重了),然后对每个条目执行另一个查询以计算平均投票数(或向主查询添加第四个联接?).

    b)在页面表中添加一个“平均投票”列,当用户投票时,我将更新该列(与投票表一起)。

    尼科

    3 回复  |  直到 14 年前
        1
  •  6
  •   Paul Sonier    14 年前

    使用数据库来实现它的目的;到目前为止,选项A是您的最佳选择。值得注意的是,您的查询实际上并不是特别重,它连接了三个表;SQL在这方面非常擅长。

    对于这种过早优化SQL的尝试要谨慎;SQL在它所做的事情上比大多数人认为的要高效得多。

    请注意,使用选项A的另一个好处是,要维护的代码更少,随着代码的更新,数据分散的机会也更少;这是一个生命周期好处,而且它们经常被忽略,从而获得微小的优化好处。

        2
  •  1
  •   John    14 年前

    为了表现,你可能会“重复自己”(违反dry)。权衡是(a)额外的存储空间,(b)额外的工作,以保持数据库中的所有内容都是自洽的。

    两种方法都有优点/缺点。然而,过早优化有其自身的一系列陷阱。

        3
  •  1
  •   Alexis Dufrenoy    14 年前

    老实说,对于这个问题,我建议减少信息量。在我看来,对多个页面进行多次投票确实会给服务器带来沉重的负担。当然,如果你放弃了网站上的真实流量…-)