Oracle - 创建一个包含许多列的表或在许多表中拆分

时间:2014-07-02 14:52:38

标签: database oracle

建模数据库的最佳方法是什么?我有很多已知的价值渠道。是否更好地创建一个包含许多列的表,每个通道一个或创建两个表一个用于值,一个用于通道?像那样:

表RAW_VALUES:SERIE_ID,CHANNEL_1,...,CHANNEL_1000

表RAW_VALUES:SERIE_ID,CHANNEL_ID,VALUE

表CHANNELS:CHANNEL_ID,NAME,UNIT,....

我的问题是关于搜索某些数据或保存数据库空间的性能。

感谢。

1 个答案:

答案 0 :(得分:1)

通常,人们会想知道您将针对表运行什么类型的查询以及数据分布等以在两个设计之间进行选择。但是,我认为这里有更多基本问题可以指导您。

第二种选择肯定更灵活。添加一个通道(" Channel_1001")可以通过在两个表中插入行(简单的DML操作)来完成,而如果使用第一个选项,则需要向表中添加一个列(一个DDL操作),除非你修改它们,否则任何使用该表的程序都无法使用它。

单独使用这种灵活性可能是第二种选择的理由。

使用第二个选项也可以更好地进行搜索。您可以在raw_values表上创建一个索引,并在Channel / Value列上支持索引搜索。 (顺便说一句,我会避免名称"值"对于一列。)

现在,如果您考虑在第一个选项下索引哪些列,您可能会感到难过:那里有1001列。如果您想支持对值进行索引搜索,您会将它们全部编入索引吗?即使您只处理10个频道,您仍然需要在第一个选项下索引这10个列;一般来说加载一个包含多个索引的表并不是一个好主意。

顺便说一句,如果我没有弄错,那么这些天的限制是每个表1000列,但是一个包含超过255列的表将在多个行中存储一行,每行存储255列,这将创建很多您对此表发出的每个选择的可避免I / O的数量。