具有不同内容的表格的最佳实践
Best practice for tables with varying content
目前我正在处理一个问题,我必须在 Oracle10g 数据库中记录数据。我想将来自多达 40 个设备(但不一定总是 40 个)的数据存储为一个数据点,这些共享一些信息,其余的是特定于设备的。
所以我可以为每个特定于设备的列创建数组,如果设备正在使用,相应的数组字段就会被填充。
ID TIMESTAMP BOARD DEVICE_ID[40] ERROR_CNT[40] TEMP[40] MORE_DATA[40]...
但我认为这样做会浪费大量数据库 space,因为数组几乎不会被填充
我能想到的另一种方法是对多行条目使用相同的 ID,然后将与我使用的设备一样多的行放入 table。
ID TIMESTAMP BOARD DEVICE_ID ERROR_CNT TEMP MORE_DATA
1 437892 1 1 100 25 xxx
1 437892 1 2 50 28 yyy
现在共享信息在数据库中多次出现,数据分散在多行中。
另一个问题是,部分设备可能使用了一些列,而有些设备不携带该信息,因此可能会有更多未使用的字段。因此,也许最好创建多个 tables 并根据设备拥有的信息将设备分组,并将其数据记录在相应的 tables 中。
我很感激任何帮助,也许我什至对浪费的数据库 space 很偏执,不应该担心这一点,只需遵循 'easiest' 方法,我认为这就是使用数组的方法。
我觉得这篇评论太长了:
1000 小时 * 12 台/小时 * 40 台设备 = 480,000 行。
这不是很多数据,所以我不担心值重复。您可能希望使用 "other method",因为它提供了很大的灵活性。
您可以将所有数据存储在列中,但是如果列错了,您就必须开始乱用 alter table
语句,这可能会影响您已经编写的查询。
切勿将数组存储在数据库中。违反first normal form是大错特错。
比数据的存储方式更关心数据的查询方式。保留数据模型 "dumb",并且有数以百万计的人可以理解如何使用它。大概只有几百人了解Oracle对象类型。
例如,使用对象类型,这里是创建一个table、插入数据并查询它的最简单代码:
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_VALUE
或 TABLE(...)
的人或工具并不多。在内部,Oracle 无论如何都将数组存储为 tables,因此没有性能优势。
使用多个 table 以简单的方式进行。正如 Gordon 指出的那样,它无论如何都是一个小型数据库。保持简单。
目前我正在处理一个问题,我必须在 Oracle10g 数据库中记录数据。我想将来自多达 40 个设备(但不一定总是 40 个)的数据存储为一个数据点,这些共享一些信息,其余的是特定于设备的。
所以我可以为每个特定于设备的列创建数组,如果设备正在使用,相应的数组字段就会被填充。
ID TIMESTAMP BOARD DEVICE_ID[40] ERROR_CNT[40] TEMP[40] MORE_DATA[40]...
但我认为这样做会浪费大量数据库 space,因为数组几乎不会被填充
我能想到的另一种方法是对多行条目使用相同的 ID,然后将与我使用的设备一样多的行放入 table。
ID TIMESTAMP BOARD DEVICE_ID ERROR_CNT TEMP MORE_DATA
1 437892 1 1 100 25 xxx
1 437892 1 2 50 28 yyy
现在共享信息在数据库中多次出现,数据分散在多行中。
另一个问题是,部分设备可能使用了一些列,而有些设备不携带该信息,因此可能会有更多未使用的字段。因此,也许最好创建多个 tables 并根据设备拥有的信息将设备分组,并将其数据记录在相应的 tables 中。
我很感激任何帮助,也许我什至对浪费的数据库 space 很偏执,不应该担心这一点,只需遵循 'easiest' 方法,我认为这就是使用数组的方法。
我觉得这篇评论太长了:
1000 小时 * 12 台/小时 * 40 台设备 = 480,000 行。
这不是很多数据,所以我不担心值重复。您可能希望使用 "other method",因为它提供了很大的灵活性。
您可以将所有数据存储在列中,但是如果列错了,您就必须开始乱用 alter table
语句,这可能会影响您已经编写的查询。
切勿将数组存储在数据库中。违反first normal form是大错特错。
比数据的存储方式更关心数据的查询方式。保留数据模型 "dumb",并且有数以百万计的人可以理解如何使用它。大概只有几百人了解Oracle对象类型。
例如,使用对象类型,这里是创建一个table、插入数据并查询它的最简单代码:
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_VALUE
或 TABLE(...)
的人或工具并不多。在内部,Oracle 无论如何都将数组存储为 tables,因此没有性能优势。
使用多个 table 以简单的方式进行。正如 Gordon 指出的那样,它无论如何都是一个小型数据库。保持简单。