【问题标题】:Best practice for tables with varying content具有不同内容的表格的最佳实践
【发布时间】:2015-09-28 09:12:17
【问题描述】:

目前我正在解决一个问题,我必须在 Oracle10g 数据库中记录数据。我想将来自多达 40 台设备(但不一定总是 40 台)的数据存储为一个数据点,它们共享一些信息,其余的是特定于设备的。

因此,我可以为每个特定于设备的列创建数组,如果设备正在使用,则填充相应的数组字段。

ID TIMESTAMP BOARD DEVICE_ID[40] ERROR_CNT[40] TEMP[40] MORE_DATA[40]...

但我认为这样做会浪费大量数据库空间,因为数组几乎不会被填充

我能想到的另一种方法是只对多行条目使用相同的 ID,然后我将尽可能多的行放入表中,因为我使用了设备。

ID TIMESTAMP BOARD DEVICE_ID ERROR_CNT TEMP MORE_DATA
1  437892    1     1         100       25   xxx
1  437892    1     2         50        28   yyy

现在共享信息在数据库中多次出现,数据分散在多行之间。

另一个问题是,部分设备可能使用了某些列,而有些列不携带该信息,因此可能会有更多未使用的字段。因此,也许最好创建多个表并根据设备拥有的信息将设备分组并将其数据记录在相应的表中。

感谢任何帮助,也许我什至对浪费的数据库空间感到偏执,不应该担心这一点,只需遵循“最简单”的方法,我认为这将是使用数组的方法。

【问题讨论】:

  • 您需要存储多少条记录?
  • 我想我将每 5 分钟记录一次数据,最长可达 1000 小时(6 周),因此在该时间范围内大约有 12000 条记录。
  • “数组”是指嵌套表,还是您自己的对象类型,还是其他?似乎您只需要两张表,一张带有 ID(主键)、时间戳和板;第二个带有 ID(外键)和设备特定数据。您还没有说您将如何查询和使用数据,但如果需要,可以使用视图/物化来进行非规范化。我认为您太担心空间了。未使用的列通常不会使用任何(重要)空间。
  • 谢谢亚历克斯,所以我确实太专注于避免空列,所以我想我只会创建一个包含所有偶尔使用的列的表。我会创建自己的类型并使用它们来拥有“数组”,例如CREATE TYPE DEVICE_ID 是 VARRAY(40) OF NUMBER

标签: sql oracle oracle10g database-schema


【解决方案1】:

永远不要将数组存储在数据库中。违反first normal form 是一个很大的错误。

更关心数据是如何被查询的,而不是数据是如何存储的。保持数据模型“愚蠢”,实际上有数以百万计的人可以理解如何使用它。了解 Oracle 对象类型的人大概只有几百人。

例如,使用对象类型,这里是创建表、插入数据和查询的最简单的代码:

drop table device;

create or replace type error_count_type is table of number;

create table device(id number, error_count error_count_type)
nested table error_count store as error_count_table;

insert into device values(1, error_count_type(10, 20));
commit;

select sum(column_value) error_count
from device
cross join table(error_count);

了解创建类型、store as、实例化类型、COLUMN_VALUETABLE(...) 的人或工具并不多。在内部,无论如何,Oracle 将数组存储为表,因此没有性能优势。

使用简单的方法,使用多个表。正如 Gordon 指出的那样,无论如何它都是一个小型数据库。保持简单。

【讨论】:

    【解决方案2】:

    我觉得这篇评论太长了:

    1000 小时 * 12/小时 * 40 台设备 = 480,000 行。

    这不是很多数据,所以我不会担心重复值。您可能希望使用“其他方法”,因为它提供了很大的灵活性。

    您可以将所有数据存储在列中,但如果列错误,则必须开始使用 alter table 语句,这可能会影响您已经编写的查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 2010-11-09
      相关资源
      最近更新 更多