为另一个表的每一行打开一个新表是否有任何缺点?

时间:2016-10-06 04:08:23

标签: mysql database database-design relational-database

目前我正在开发一个旧的内容管理系统。系统允许用户为其成员站点创建页面,并在成员上记录页面视图。通常我希望数据库看起来像这样:

page_table
    page_id
    (Some other field about page)

member_table
    member_id
    (Some other field about member)

page_view_log_table
    page_id
    member_id
    view_time

但是,数据库实际上是这样的:

page_table
    page_id
    (Some other field about page)

member_table
    member_id
    (Some other field about member)

page_(page_id)_view_log_table
    member_id
    view_time

page_(page_id)_view_log_table
    member_id
    view_time    

page_(page_id)_view_log_table
    member_id
    view_time

.......

即。以前的开发人员选择为每个页面的视图日志打开一个新表。他声称这是因为视图太多,这会在生成与页面相关的视图日志报告时提高性能。通常,网站不会包含太多页面(低于50),因此不会创建太多表格。

他是对的。我通过复制数据库并尝试将所有数据放入一个表来完成实验。 (复制数据库需要一个小时,因此您可以对页面视图的数量进行成像)性能会提高很多,特别是在页面视图较少的页面上。我只是觉得不舒服,因为它似乎不是一种正常的做法。这种做法有什么缺点吗?或者有更好的方法来处理这个问题吗?

P.S。我只是花时间复制来说数据库很大。我通过实际使用系统作为普通用户来生成页面视图报告来进行实验。对不起,问题不明确。

1 个答案:

答案 0 :(得分:2)

  

他是对的。我通过复制数据库做了一个实验   尝试将所有数据放入一个表中。 (复制它需要一个小时   数据库,所以你可以成像页面视图的数量)

不幸的是,你使用了一个完全不相关的尺度来做出判断。将数据从一个(或多个)表复制到另一个表是很少发生的事情,例如当您进行这样的维护工作时。它不应该被用来衡量系统在一般情况下的表现。

你的设计基本上是正确的,以前的开发人员在提出这种设计时必须抽出一些非常强大的东西。

page_table
    page_id
    (Some other field about page)

member_table
    member_id
    (Some other field about member)

page_view_log_table
    page_id
    member_id
    view_time

您只需使用正确的索引即可确保检索速度很快。不要添加太多索引,然后插入会很慢。似乎(page_id,member_id)上的综合索引会为您提供适当的平衡。