2009-06-26 45 views
2

我正在设计一个新的实验室数据库。我想一起存储所有测试的原始结果。但是,结果可以是单个测量或原始波形。 (转贴请参阅页脚)在Oracle中存储波形

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

TEST 
    test_id* 
    (other TEST fields) 

OPTION 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除了:
        MEASUREMENTmeasurement为信号是SAMPLE_RATE
        RAW_POINTraw_header* (FK)改变为measurement_id* (FK)
        RAW_HEADER:不需要

OPTION 3:编码信号转换成BLOB TEST( 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个字节吗?

团块可以是一个打包的Oracle类型的,所以这些值可以由Oracle本身读取(即:获得最大值,最小值等)

注:这是General Oracle Data Collection Storage与转贴更好的选择。

+0

我喜欢选项1,因为它将单个值和信号分开。我甚至可以添加raw_point_id并将数据点的数量存储在RAW_HEADER中以更快地检索数据点。 选项2结合了常用字段将所有内容放在一起。 关于选项3,并纠正我,如果我错了。 Oracle(而不是程序检索)难以解码存储在BLOB中的原始数据以用于其他计算。 – Steven 2009-06-26 17:47:11

+0

典型波形中有多少个点? – DCookie 2009-06-26 21:02:27

回答

3

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

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

在较小的程度上,同样的反对意见适用于选项2

方案3是我可能会走的路。我曾经开发过一个应用程序,用于查看来自雷击的波形 - 每个波形有数百万个点。唯一可行的选择是用于那种数据集的BLOB。 (再次,根据一些未知数)我会认真考虑将数据存储为二进制浮点数或双精度数据,并使用java或外部C程序处理它们。严重的是,你需要密钥访问你的个人数据点吗?是不是将数组加载并索引到更简单,更紧凑和更高效?

0

以后如何分析这些数据?

假设你正在做FFT或类似的事情,只要去选项3 - 它会更容易,更快。