繁体   English   中英

矩形数据的数据库设计

[英]Database design with rectangular data

我正在尝试学习SQL和数据库设计,在这种情况下,需要一些帮助来选择数据库的良好设计。 我正在使用C#和MySQL。
我在本课中输入的数据包括电表,所有电表都有唯一的标识号,每个电表每小时输出一个值。 我拥有2013年及以后的数据,在不确定的将来还会继续使用。 最好的猜测是未来5年。 大约有25000米,因此每天将有25e3 * 24 = 600 000个数据点。 我每天通过文件获取一次此数据。 电表的数量将以缓慢的速度变化,因此每年将增加和删除电表约500次。 另外,我想知道何时将值添加到数据库中以计算收集系统的某些性能指标。 因此,这是每个仪表的输入数据:

  • 价值时间(日期时间)
  • 值(十进制数据)
  • 添加日期(日期时间)

每个仪表都提供一种数据类型,因此我可以存储具有该数据类型的表,因此数据本身将由匿名十进制值组成。 这是我的问题开始的地方。 我尝试了一些不同的设计方法:

  1. 一个大表,每行包括一个小时的数据,每米一列。 由于存在大量列而导致失败,因此我需要一个单独的具有“ Date_added”的大表。
  2. 每米一张表,列valuetime,value和date_add。 由于C#程序性能下降而失败。
  3. 分区表(即table1 = meter以1开头,依此类推)。 这仍然导致许多列。
  4. 分区表,其中表10 =米以10开头,依此类推。 这仍然导致许多列。

将数据添加到数据库时,上述所有解决方案都会导致性能下降。

如果我在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM