目前我正在开发一个旧的内容管理系统。系统允许用户为其成员站点创建页面,并在成员上记录页面视图。通常我希望数据库看起来像这样:
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。我只是花时间复制来说数据库很大。我通过实际使用系统作为普通用户来生成页面视图报告来进行实验。对不起,问题不明确。
答案 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)
上的综合索引会为您提供适当的平衡。