【发布时间】: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