在Oracle中存储波形

时间:2009-06-26 17:41:43

标签: database oracle database-design

我正在设计一个新的实验室数据库。我想将所有测试的原始结果存储在一起。但是,结果可以是单个测量,也可以是原始波形。 (转发见页脚)

以下哪种情况是理想的(为什么)? ...或提供您自己的理想选择。

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_POINTraw_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是衡量标准,signalNULL
  对于信号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的重新发布,其中包含更好的选项。

2 个答案:

答案 0 :(得分:3)

信不信由你,我认为这里确实没有足够的信息可以肯定。例如,结果通常如何处理?它们会被绘制,或者可能会对它们进行某种数值分析吗?你的波形有多大?

除非您的原始结果通常很小,否则我不喜欢此应用程序的选项1。存储一个数据点需要大量存储开销。

在较小程度上,同样的异议将适用于备选方案2.

选项3是我可能会去的方式。我曾经开发过一款用于查看雷击波形的应用程序 - 每个波形数百万个点。唯一可行的选择是针对那种数据集的BLOB。而且(再次,取决于一些未知数)我会认真考虑将数据存储为二进制浮点数或双精度数,并使用java或外部C程序处理它们。说真的,您是否需要键控访问您的个人数据点?是不是加载数组并将索引编入其中更简单,更紧凑和高效?

答案 1 :(得分:0)

您将在以后如何分析这些数据?

假设您之后正在进行FFT或类似操作,只需选择3 - 它会更容易,更快。