[英]Database design with rectangular data
我正在尝试学习SQL和数据库设计,在这种情况下,需要一些帮助来选择数据库的良好设计。 我正在使用C#和MySQL。
我在本课中输入的数据包括电表,所有电表都有唯一的标识号,每个电表每小时输出一个值。 我拥有2013年及以后的数据,在不确定的将来还会继续使用。 最好的猜测是未来5年。 大约有25000米,因此每天将有25e3 * 24 = 600 000个数据点。 我每天通过文件获取一次此数据。 电表的数量将以缓慢的速度变化,因此每年将增加和删除电表约500次。 另外,我想知道何时将值添加到数据库中以计算收集系统的某些性能指标。 因此,这是每个仪表的输入数据:
每个仪表都提供一种数据类型,因此我可以存储具有该数据类型的表,因此数据本身将由匿名十进制值组成。 这是我的问题开始的地方。 我尝试了一些不同的设计方法:
将数据添加到数据库时,上述所有解决方案都会导致性能下降。
如果我在Stack Overflow以及其他地方搜索具有大量列的数据库设计,我总是会找到答案“ Normalize!”,但由于我是新手,所以我不知道这种情况。 我具有唯一的值(valuetime),并且具有唯一的仪表ID,这就是为什么我将数据称为矩形的原因。
有人可以引导我走正确的道路吗?
对于您输入的数据:
仪表表:
ID int PK IDENTITY(1, 1)
MeterName varchar
ReadingsTable:
ID int PK IDENTITY(1, 1)
MeterID int FK
Value decimal
TimeStamp datetime
DateAdded date
您应该用ETL填充-制作SSIS包或其他东西。 我认为绝对比C#应用更好。
接下来,您可以创建聚合表:
DailyAggTable:
ID int PK IDENTITY(1, 1)
MeterID int FK
SumOfValue decimal
Date date
您可以在ETL之后填充它。 您可以制作每周,每月,每季度,每年等汇总表,并相应地安排其人口。 这将提高报告性能。
基于Stan Shaw的答案...
如果数据是CSV文件,则只需每晚使用LOAD DATA
。 您可能应该加载到临时表中,对数据进行按摩,然后复制到实际表中。 可能不需要任何C#代码。
DateAdded
似乎没有用,并且使表DateAdded
。 完全删除,或构建另一个表来记录上载。
不要打扰主表上的ID; (MeterID,时间戳记)是“自然” PRIMARY KEY
。 同样,这节省了空间。
我只会在一个汇总表中建立每日汇总行。 该表可能足够快以处理每周/每月查询。 仅当它不够快时,才应考虑摘要的摘要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.