AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 284803
Accepted
Nick Muise
Nick Muise
Asked: 2021-02-06 11:01:58 +0800 CST2021-02-06 11:01:58 +0800 CST 2021-02-06 11:01:58 +0800 CST

是否可以存储每行数据的历史配置设置,而无需将所有配置设置塞进每行数据?

  • 772

背景:我最近被一家水处理公司聘为数据库工程师。我们在全国各地部署水处理机器,机器处理水并将有关进水状态(流量、温度、进水中 X 浓度等)的连续数据发送回给我们,以及有关处理的数据机器在那个时间点应用于那个水。随着时间的推移,场地(及其各种组件)发生了很大变化:一台机器可能会发生故障并需要更换,可能会使用不同浓度的化学物质来填充机器的水箱,它的流量计和其他传感器可能会重新校准或设置为了实现不同的规模,它的化学泵可能会被更换,并且不断地更换。这些会影响数据的解释:例如,

水处理数据点由包含站点 ID 和时间戳的复合键标识。如果唯一重要的数据是当前数据,那么存储配置会很容易,因为我可以将配置设置保留在 Site 表中,并根据需要将它们拉出用于数据点。但我们需要能够正确解释旧数据。因此,我考虑将配置存储在自己的表中,该表将跟踪每个站点在每个时间段内的所有设置,但是不可能在数据点的连续时间戳和开始/结束日期之间创建外键配置 - 最接近的是某种范围检查,例如“Datapoint.TimeStamp BETWEEN Configuration.Start AND Configuration.End”。

那么,有没有办法以完全标准化的方式存储每行数据的历史配置,或者是将所有设置塞进每个数据点的唯一可能解决方案?

database-design normalization
  • 2 2 个回答
  • 52 Views

2 个回答

  • Voted
  1. Lennart - Slava Ukraini
    2021-02-06T12:23:10+08:002021-02-06T12:23:10+08:00

    这里有一些随机的想法。我猜在该特定点不存在数据点的情况下配置可能会发生变化。首先,我会为这些网站准备一张表格:

    CREATE TABLE sites
    ( site_id ... NOT NULL PRIMARY KEY
    , <other attributes>
    );
    

    现在,您可以让您的表格与之相关

    CREATE TABLE measurements
    ( site_id ... NOT NULL REFERENCES sites (site_id)
    , measurement_ts ... NOT NULL
    , <measurements>
    , PRIMARY KEY (site_id, measurement_ts)
    )
    

    从你的描述中我不清楚你是否应该进一步标准化测量值,所以我会保持原样。

    现在您可以将配置添加为:

    CREATE TABLE configurations
    ( site_id ... NOT NULL REFERENCES sites (site_id)
    , begin_time TIMESTAMP NOT NULL
    , end_time TIMESTAMP
    , ...
    , PRIMARY KEY (site_id, begin_time)
    )
    

    我也不清楚配置值是否应该进一步规范化,所以我也将保留它

    更改配置时,通过将 end_time 设置为 now 来关闭前一个配置,并添加一行 begin_time = now, end_time = null。

    @JD 提到了其中一家商业供应商,它支持时态数据作为替代方案。您可能还想看看 IBM Db2 社区版。限制是 100Gb 存储、4 核和 16Gb 内存。如果您有兴趣,可以在ibm-db2-developer-community-edition找到更多信息

    特别是对于时态表,您可以在使用时态表的时间旅行查询中找到更多信息

    • 2
  2. Best Answer
    mustaccio
    2021-02-06T13:13:22+08:002021-02-06T13:13:22+08:00

    您所描述的内容称为渐变维度(SCD),每个配置项本质上都是测量(事实)的维度。如果您不想切换到支持时态查询的数据库,您仍然可以在 MySQL 中实现其中一种 SCD 方法(无论如何,时态表仍然在幕后工作)。不需要声明为外键,作为连接条件使用也Datapoint.TimeStamp没有错。Datapoint.TimeStamp BETWEEN Configuration.Start AND Configuration.End

    • 1

相关问题

  • 存储计算值或根据要求重新计算它们更好吗?[复制]

  • 存储与计算聚合值

  • 在数据仓库中实现多对多关系有哪些方法?

  • 高级规范化形式是否总是符合低级规范化形式的标准?

  • 标准化练习资源

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve