在计量应用程序中使用的最佳数据模型,例如捕获日常水表数据的应用程序。
我能想到的是,我可以拥有一个water_reading
表来捕获所有用户的数据。
例如:
2014-05-20 09:40 AM - user_1 - 0
2014-05-20 09:41 AM - user_1 - 4
2014-05-20 09:42 AM - user_1 - 9
2014-05-20 09:40 AM - user_2 - 0
2014-05-20 09:41 AM - user_2 - 2
2014-05-20 09:42 AM - user_2 - 7
这是捕获数据的最佳方式吗?
我对这些数据的主要用途是让用户能够查看图表等以获得使用模式。
例如,每月用水线图。
挑战
我能用这种模型预见的唯一问题是读数必须是常规的。 如果用户在非零点开始数据输入,它仍然有效吗? 或者如果用户错过了一些条目,我该如何填补空白等。
例如: 如果用户输入了以下数据:
day_1 12pm - 20
day_2 12pm - 50
day_5 12pm - 120
如何创建显示每日用水量的图表。 因为根据数据:
day_1 : 20 - ? (I don't know if the meter was started the same day or the 5 days ago)
day_2 : 50 - 20
day_3 : ? - 50
day_4 : ? - ?
day_5 : 120 - ?
非常感谢任何帮助。
PS:我使用Ruby on Rails,数据库是postgresql。
答案 0 :(得分:1)
您可能想要考虑将有关用户的信息与用水信息分开。
因此可能有用户模型,仪表模型和阅读模型。
用户可以有很多米,米可以有很多读数。每个阅读都有一个日期和值。
这将最大限度地减少模型中重复数据的数量。可以轻松更改用户名等内容。
答案 1 :(得分:0)
您应该查看需要执行的查询类型,并确定哪种模型最适合您,因为有许多可用选项。您可能会发现嵌套复合类型的数组(即Users表中的读数数组)可以完成这项工作,但是如果您需要从用户之外的其他内容中引用这些读数,或者您需要对数组中的某些值进行索引复合类型然后归一化是你最安全的选择。
听起来您将执行大量聚合和时间序列生成查询,因此请确保您使用的ORM符合工作要求。我发现ActiveRecord在很多方面都不能满足我的需求,并且转移到Sequel,我发现它是一个功能更强大的数据访问库,它的postgres功能支持非常好,性能也更好。 / p>
您可能需要使用窗口函数或递归公用表表达式以及可能用于时间序列类型查询的生成器函数(即每日,每月,每季度使用)。要了解处理water_readings
中的差距的SQL,请查看这些堆栈溢出问题:
使用postgresql查询时间序列的指南:
您将能够使用Sequel with Postgres指定上面详述的查询并获得一个结果(即数据集),您可以在另一个查询中进一步链/范围或组合,但在ActiveRecord中,您需要使用原始SQL字符串和得到一个你不能链或范围的结果(数组)。
真的要好好看看你的报告要求,也许你不仅需要按日/月/季报告用户的用水量,还要比较或同等的其他人的中位数/平均值/第n百分位数等等或排名。类似的人口统计。您将如何描述这些类型的查询,以便随着数据集大小的增加它们有效地工作?您的数据访问层/ ORM是否适合您,还是更适合简单的CRUD类型问题?