2012-01-23 53 views
2

在我建立的在线订票系统中,我需要为客户添加订单的实时分析报告。使用非规格化数据库表进行分析数据

重要的订单数据分为多个表格(客户,订单,line_items,package_types,票据)。每个表格都包含对我的客户可能需要的任何报告都不重要的附加数据。

我正在考虑在非规格化报表中将每个订单记录为单独的订单项。我试图弄清楚这是否合理。

通常,我为报表运行的查询只需要一次连接两个或三个表。每个表格都添加了适当的索引。

将所有订单数据编译成只包含必要的报表列的表是否有意义?

该应用程序建立在Ruby on Rails 3上,DB是Postgresql。

编辑:这样做的目标是尽可能快地为用户呈现浏览器中的数据。

+0

从规范化数据获取报告的速度有多慢? – Mark

+0

我还没有做过任何确切的基准测试,但只需计算从开始请求到完成时的秒数,大约需要20秒或更长时间才能从规范化数据呈现页面。这比我想要的要长一点。 –

回答

2

取决于你的目标是什么。如果你想让报表输出更快显示,那肯定会奏效。权衡是通过批量更新来维护数据。您可以编写一个触发器,在任何时候新的记录进入基表时更新表,但这可能会增加很多开销。

也许一个视图而不是一个新表是一个更好的解决方案在这种情况下?

+0

是的,我的目标是尽可能快地为用户呈现数据。要更新非规范化表,我很可能会在我的Order模型中使用:after_create回调。它会开始一个后台作业来更新order_data表。我不确定如何让Postgres视图与Rails应用程序一起工作,但我会研究。感谢您的建议。 –

+1

不熟悉Postgress,但对于任何其他数据库,您可以像访问表一样访问视图。性能明智的是,除非数据库缓存被优化,否则速度不会更快。汇总表会更快我认为 – Brian

+1

视图可能不会比表格更快,但物化视图将会是... – courtsimas