sql - SQL数据库中的维度和单元分析

标签 sql postgresql dimensions time-series

问题:

关系数据库 (Postgres) 存储各种测量值的时间序列数据。每个测量值都可以有特定的“测量类型”(例如温度、溶解氧等)并且可以有特定的“测量单位”(例如华氏度/摄氏度/开尔文、百分比/毫克/升等)。

问题:

有没有人构建过类似的数据库以保持维度完整性?有什么建议吗?

我正在考虑构建一个 measurement_type 和一个 measurement_unit 表,这两个表都有文本两列,ID 和文本。然后我会在 measured_value 表中为这些表创建外键。文本让我有些担心,因为可能存在非唯一重复项(例如,“ug/l”与“µg/l”表示微克每升)。

这样做的目的是让我可以根据查询或通过外部编程转换和验证单位。理想情况下,我以后将能够进行严格的量纲分析(例如,将 µg/l 与值“M/V”(质量除以体积)相关联)。

有没有更优雅的方法来完成这个?

最佳答案

我在很久以前为处理单元制作了一个数据库子模式(好吧,我稍微夸大了一点;不过那是大约 20 年前的事了)。幸运的是,它只需要处理简单的质量、长度、时间维度——而不是温度、电流或光度等。游戏的货币方面就不那么简单了——一种货币之间有无数种不同的转换方式另一个取决于转换率有效的日期、货币和期间。这是与物理单元分开处理的。

从根本上说,我创建了一个表“measures”,其中包含一个“id”列、一个单位名称、一个缩写和一组量纲指数——质量、长度、时间各一个。这将填充诸如“体积”(长度 = 3、质量 = 0、时间 = 0)、“密度”(长度 = 3、质量 = -1、时间 = 0)等名称。

还有第二个单位表,它标识了一个度量,然后是特定度量使用的实际单位。例如,有桶、立方米和各种其他相关单位。

还有第三个表定义了特定单位之间的换算系数。它由两个单元和将单元 1 转换为单元 2 的乘法转换因子组成。这里最大的问题是转换因子的动态范围。如果从 U1 到 U2 的转换是 1.234E+10,那么倒数是一个相当小的数 (8.103727714749e-11)。

S.Lott 关于温度的评论很有趣 - 我们不必处理这些。存储过程本来可以解决这个问题 - 尽管将一个存储过程集成到系统中可能很棘手。

我描述的方案允许大多数转换被描述一次(包括假设的单位,例如每两周弗隆,或不那么假设但同样模糊的单位 - 在美国以外 - 如英亩英尺),并且可以验证转换(对于例如,转换系数表中的两个单位必须具有相同的度量)。它可以扩展以处理大多数其他单位——尽管诸如角度(或立体角)之类的无量纲单位存在一些有趣的问题。有支持代码可以处理任意转换——或者在不支持转换时生成错误。使用该系统的原因之一是,各个国际附属公司会以本地方便的单位报告其数据,但总部系统必须接受原始数据,然后以适合经理的单位呈现最终的汇总数据——不同的经理各自对于报告的最佳单位有自己的想法(基于他们的国家背景和在总部的任职时间)。

关于sql - SQL数据库中的维度和单元分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1224770/

相关文章:

python - 如何在 Python 中查找字典数组(或字典的字典)的形状或维度

javascript - 获取移动设备上的视口(viewport)大小

delphi - 如何仅通过知道其句柄来确定 Canvas 尺寸?

php - MySQL关于更新表的错误

mysql - 仅 JOIN 每行一次 — 将第 1 行排列(分布)到第 1 行

sql - 重复键值违反唯一约束且冲突不起作用

sql - 我的案例有什么问题?

postgresql - 如何使用 sequelize/postgres 添加嵌套的 JSONB 字段

sql - 检测到更新在 PostgreSQL SQL 函数(不是 PL/pgSQL)中失败

sql - "Pivoting"SQL 中的表(即交叉制表/crosstabulation)