mysql - 具有矩形数据的数据库设计

标签 mysql database database-design

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

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

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

  1. 一个大表,每行包含一小时的数据,每米一列。由于列数过多而失败,我需要一个带有“Date_added”的单独的同样大的表。
  2. 每米一个表,列 valuetime、value 和 date_added。由于 C# 程序性能缓慢而失败。
  3. 分区表(即 table1 = meter 以 1 开头,依此类推)。这仍然会导致许多列。
  4. 分区表,其中表 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/

相关文章:

mysql - 如何使用 select 获取多行?

php - 一个非常简单的查询不工作 PHP

mysql - 数据库设计 : how to enforce integrity

mysql - 数据库 : what design to point on two possibilities?

mysql - 如何在数据库中存储与一个项目相关的一组相同类型的值

php - 请提供数据库架构建议

php - 使用 IF-ELSE php MYSQL 插入或更新

mysql - 将数字与字母数字进行比较

javascript - 选中复选框,然后输入到新行

database - 我应该为两个相似的对象制作两个单独的表吗