我正在设计一个新的实验室数据库。我想将所有测试的原始结果存储在一起。然而,结果可以是单个测量或原始波形。 (转发见页脚)
下面哪种情况是理想的(以及为什么)? ...或提供您自己的理想选择。
TEST
test_id*
(other TEST fields)
选项 1:分离单个值和波形结果
TEST (1 -- many) MEASUREMENT
( \-- many) RAW_HEADER 1 -- many RAW_POINT
MEASUREMENT RAW_HEADER
measurement_id* raw_header_id*
test_id (FK) test_id (FK)
rec_time as DATE start_time as DATE
measurement sample_rate
RAW_POINT
raw_header_id* (FK)
point_index*
raw_measurement
选项 2:与选项 1 重叠公共(public)字段
TEST (1 -- many) MEASUREMENT (1 -- many) RECORDING_POINT
与选项 1
相同,但:
MEASUREMENT
:信号的测量
是sample_rate
RAW_POINT
:raw_header* (FK)
更改为 measurement_id* (FK)
RAW_HEADER
:不需要
选项 3:将信号编码为 BLOB 测试(1 - 多次)测量
MEASUREMENT
measurement_id*
test_id (FK)
rec_time as DATE
measurement
signal as BLOB
对于单个值,measurement
是测量值,signal
是 NULL
对于信号,measurement
是sample_rate,signal
存储编码数据点
选项 4:重叠公共(public)字段,但使用 BLOBS
TEST (1 -- many) MEASUREMENT (1 -- many) RAW_DATA
MEASUREMENT
measurement_id*
test_id (FK)
rec_time as DATE
measurement
RAW_DATA
measurement_id* (FK)
raw_data as BLOB
对于单个值测量
是测量
对于信号测量
是sample_rate
图例:
__*_
后面跟有星号的字段是 完整的主键。(FK)
后面跟有(FK)
的字段表示字段具有外键约束。____
除非另有说明,所有字段的类型均为NUMBER
。
其他信息: 原始波形数据将以多种方式使用: - 绘制(绘图看起来正确吗) - 过滤/平滑(为了更好的呈现) - 获取值(最大值时间、最小值、下降时间等)
此外,数据将通过多个 channel 同时获取。了解当 channel 1 首次达到 500(某个单位)时 channel 2 的值是多少会很有用。
波形通常包含大约 4,000 - 25,000 个数据点。
其他想法/问题: 可以返回 BLOB 的一部分吗?换句话说,我可以从字节 4000 开始提取 4 个字节吗?
blob 是否可以是打包的 Oracle 类型,以便 Oracle 本身可以读取这些值(即:获取最大值、最小值等)
注意:这是 General Oracle Data Collection Storage 的转发具有更好的开发选项。
最佳答案
无论你相信与否,我认为这里没有足够的信息可以肯定地说。例如,通常如何处理结果?它们会被绘制出来,或者可能会对它们进行某种数值分析吗?你的波形有多大?
除非您的原始结果通常很小,否则我不喜欢此应用程序的选项 1。存储一个数据点需要大量的存储开销。
在较小程度上,同样的反对意见也适用于选项 2。
选项 3 是我可能会选择的方式。我曾经开发过一个用于查看雷击波形的应用程序 - 每个波形有数百万个点。对于此类数据集,唯一可行的选择是 BLOB。并且(同样,取决于一些未知因素)我会认真考虑将数据存储为二进制 float 或 double ,并使用 java 或外部 C 程序处理它们。说真的,您是否需要对个人数据点进行 key 访问?加载数组并为其建立索引不是更简单、更紧凑、更高效吗?
关于database - 在 Oracle 中存储波形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1050331/