具有不同内容的表的最佳实践

时间:2015-09-28 09:12:18

标签: sql oracle oracle10g database-schema

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

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

{{1}}

但我认为通过这样做会浪费大量的数据库空间,因为数组很难填充

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

{{1}}

现在共享信息在数据库中多次出现,数据在多行之间被粉碎。

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

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

2 个答案:

答案 0 :(得分:1)

我认为这个评论太长了:

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

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

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

答案 1 :(得分: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无论如何都将数组存储为表,因此没有性能优势。

使用多个表格以简单的方式完成。正如戈登指出的那样,无论如何,这是一个小型数据库。保持简单。