database - 在 Oracle 中存储波形

标签 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 重叠公共(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 是测量值,signalNULL
对于信号,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/

相关文章:

Oracle - 如何从 sql Developer 生成脚本

sql - 比较具有大于和小于符号的 SQL 日期?

具有默认值的 SQL ALTER TABLE

sql-server - 如何设置新的 SQL Server 数据库以允许将来可能的复制?

mysql - 数据库表获取太多数据 - 需要另一种解决方案

javascript - 强制重新加载客户端网页 Django

php - 使用 PHP 根据 MySQL 表中的特定文本显示特定图像

database - 对 ORM 进行逆向工程

sql - MSSQL - 具有多个关系的两个表

database-design - 内容的 CMS 版本控制策略