我正在设计一个新的实验室数据库。我想将所有测试的原始结果存储在一起。但是,结果可以是单个测量,也可以是原始波形。 (转发见页脚)
以下哪种情况是理想的(为什么)? ...或提供您自己的理想选择。
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中的公共字段
TEST (1 -- many) MEASUREMENT (1 -- many) RECORDING_POINT
与OPTION 1
相同,但:
MEASUREMENT
:信号的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:重叠公共字段,但使用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
单个值measurement
是测量值
信号measurement
是sample_rate
图例:
__*_
字段后跟星号
完整的主键。(FK)
后跟(FK)
的字段表示字段具有外键约束。____
除非另有说明,否则所有字段均为NUMBER
类型。其他信息: 原始波形数据将以多种方式使用: - 绘制(情节看起来正确) - 过滤/平滑(更好的演示) - 获得值(最大值,最小值,下降时间等)
此外,将通过多个渠道同时获取数据。当通道1首次达到500(某个单位)时,了解通道2的值是有用的。
波形通常有大约4,000 - 25,000个数据点。
其他想法/问题: 可以返回部分BLOB吗?换句话说,我可以从字节4000开始拔出4个字节吗?
blob是否可以是打包的Oracle类型,因此Oracle本身可以读取这些值(即:获取max,min等)
注意:这是General Oracle Data Collection Storage的重新发布,其中包含更好的选项。
答案 0 :(得分:3)
信不信由你,我认为这里确实没有足够的信息可以肯定。例如,结果通常如何处理?它们会被绘制,或者可能会对它们进行某种数值分析吗?你的波形有多大?
除非您的原始结果通常很小,否则我不喜欢此应用程序的选项1。存储一个数据点需要大量存储开销。
在较小程度上,同样的异议将适用于备选方案2.
选项3是我可能会去的方式。我曾经开发过一款用于查看雷击波形的应用程序 - 每个波形数百万个点。唯一可行的选择是针对那种数据集的BLOB。而且(再次,取决于一些未知数)我会认真考虑将数据存储为二进制浮点数或双精度数,并使用java或外部C程序处理它们。说真的,您是否需要键控访问您的个人数据点?是不是加载数组并将索引编入其中更简单,更紧凑和高效?
答案 1 :(得分:0)
您将在以后如何分析这些数据?
假设您之后正在进行FFT或类似操作,只需选择3 - 它会更容易,更快。