我正在尝试学习 SQL 和数据库设计,在这种情况下需要一些帮助来选择我的数据库的良好设计。我正在使用 C# 和 MySQL。
我在本课中输入的数据包括电表,所有电表都有唯一的标识号,每个电表每小时提供一个值。我有 2013 年及以后的数据,这将持续到一个不确定的 future 。最好的猜测是提前 5 年。大约有 25000 米,所以每天会有 25e3 * 24 = 600000 个数据点。我每天通过文件获取一次这些数据。仪表的数量将以缓慢的速度变化,因此每年大约有 500 次更改,添加和删除仪表。作为奖励,我想知道何时将值添加到数据库以计算收集系统的某些性能指标。所以这是每个仪表的输入数据:
- 值时间(日期时间)
- 数值(十进制数据)
- 添加日期(日期时间)
每个仪表都提供一种类型的数据,因此我可以存储一个包含该数据类型的表格,因此数据本身将由匿名十进制值组成。这就是我的问题开始的地方。我尝试了一些不同的设计方法:
- 一个大表,每行包含一小时的数据,每米一列。由于列数过多而失败,我需要一个带有“Date_added”的单独的同样大的表。
- 每米一个表,列 valuetime、value 和 date_added。由于 C# 程序性能缓慢而失败。
- 分区表(即 table1 = meter 以 1 开头,依此类推)。这仍然会导致许多列。
- 分区表,其中表 10 = 米以 10 开头,依此类推。这仍然导致许多专栏。
在向数据库添加数据时,上述所有解决方案都会导致性能非常低下。
如果我在 Stack Overflow 和其他地方搜索具有大量列的数据库设计,我总会找到答案“规范化!”,但我不知道我的情况如何,因为我是新手。我有一个唯一的值 (valuetime) 和唯一的仪表 ID,这就是为什么我称我的数据为矩形。
谁能引导我走上正确的道路?
最佳答案
对于您输入的数据:
仪表表:
ID int PK IDENTITY(1, 1)
MeterName varchar
读数表:
ID int PK IDENTITY(1, 1)
MeterID int FK
Value decimal
TimeStamp datetime
DateAdded date
您应该使用 ETL 填充它 - 制作一个 SSIS 包或其他东西。在我看来,绝对比 C# 应用程序更好。
接下来可以制作聚合表:
每日汇总表:
ID int PK IDENTITY(1, 1)
MeterID int FK
SumOfValue decimal
Date date
您可以在 ETL 之后填充它。您可以制作每周、每月、每季度、每年等聚合表并相应地安排它们的人口。这将提高报告性能。
关于mysql - 具有矩形数据的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35370599/