【问题标题】:Single table for all values, or separate tables for each value?所有值的单个表,还是每个值的单独表?
【发布时间】:2011-04-21 14:54:29
【问题描述】:

我们正在设计一个数据库 (SQLServer 2005) 来存储来自我们仪器的测量数据。每秒,每个仪器将返回 5 个不同的值(所有浮点数) - 例如 max、min、avg 等。在设计数据库时,最好将所有这些值存储在单个表中(每行包含时间戳、类型和值),还是将它们存储在单独的表中(即:avgtable、maxtable、mintable),每行都包含时间戳和值?我们将存储多达 100 台仪器的数据,它们一次运行数月,因此数据会变得非常大。

一种设计是否提供比另一种更好的性能?

谢谢

【问题讨论】:

    标签: database-design


    【解决方案1】:

    存储每个测量值可能不是一个好主意。大多数(不是全部)时间序列数据具有高度重复性,通常只记录测量的开始时间和结束时间的变化,或采用其他压缩和编码方法就足够了。

    查看 Process Historian 和复杂事件处理 (CEP) 系统,了解正在使用的不同系统以及可供您使用的技术。有许多工具和技术可用于支持您的场景类型。 OSISoft、StreamBase 和 Oracle CEP 是一些可用的软件包。由于您是 Microsoft 客户,因此您可能还对 Microsoft 为 SQL Server 提供的 CEP 产品感兴趣:StreamInsight。

    【讨论】:

      【解决方案2】:

      最好将所有内容放在一张表中,否则您必须将这些表连接在一起以查看单个测量值并重复日期时间和可能的其他字段,这也会导致更大的数据库。加入表是昂贵的一点。还建议使用诸如 bigint IDENTITY(1,1) 之类的主键字段,这样您也可以按 ID 引用记录以加快搜索速度。

      【讨论】:

      • 如果我将所有内容存储在一个表中,每次测量需要 5 行,并且每行仍需要时间戳和类型标识符。由于所收集数据的性质,并非所有仪器都会返回所有 5 种数据类型,因此我们不希望条目包含 5 个字段,而是希望为数据点提供一个条目。将所有内容存储在一起仍然有意义吗?
      • 看你怎么读。如果您一次只访问一条信息,那么一定要为每种测量类型使用一个表格,那么表格名称也会告诉您测量的类型。如果您想一次读取所有 5 个相关测量值以进行显示或搜索,那么 1 个带有时间戳的表和 5 个为 5 个测量类型适当命名的列并且所有允许为空的都可以解决问题。
      猜你喜欢
      • 2022-06-25
      • 2012-02-03
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多