关系数据库的关键之处在于关系的分解,在数据库中只定义了数据之间的两两关系,与应用相关的更复杂的数据关系需要在运行时通过动态join来构造出来,即这些关系储存在程序中而不是数据库中。实际上,关系数据库的一个隐含的假定是数据之间很少关联,而在实际应用中单表和主从表也正是最常出现的情况。当一个应用频繁需要大量表的连接操作的时候,往往意味着关系数据模型的失效,此时我们将不得不放弃数据的无冗余性,需要通过预连接来构造实例化视图(Material View),将数据之间的复杂关系固化并明确定义出来。 在数据仓库里,抽象的讨论star schema和snowflake schema哪个更优越是一个毫无意义的问题。 应该聚合到什么程度,需要根据数据应用的具体情况而定。
关系数据库本身定义的是数据之间的两两关系,缺乏一些全局数据访问手段。而数据仓库的一个基本概念是数据空间,即可以通过全局坐标来直接访问数据,而不是通过两两连接来访问数据。在数据仓库中最重要的就是时间维度,因为这是所有数据所共享的一个坐标维度。我们可以将两个发生在同一时间点上的数据直接并列在一起,而无论它们之间是否定义了关联(relation)。
关系数据库的基本数据访问模式如下:
select 属性列表
from 表A, 表B
where 表A.data_id = 表B.id
and 表B.attr = 'A'
在数据仓库中 " from 表A, 表B where 表A.data_id = 表B.id "这一部分将多个多个数据表和表之间的关联条件放在一起定义为所谓的主题。
而 表B.attr = 'A' 这一部分就从where子句中分离出来作为坐标条件。
在数据仓库中建立时间坐标有两种方式,对于发生在时间点上的事件我们直接建立点坐标,通过his_date字段来表示,而对于延续一段时间的状态数据,我们可以建立区间坐标,通过from_date和to_date两个字段来表示。
关系数据库本身定义的是数据之间的两两关系,缺乏一些全局数据访问手段。而数据仓库的一个基本概念是数据空间,即可以通过全局坐标来直接访问数据,而不是通过两两连接来访问数据。在数据仓库中最重要的就是时间维度,因为这是所有数据所共享的一个坐标维度。我们可以将两个发生在同一时间点上的数据直接并列在一起,而无论它们之间是否定义了关联(relation)。
关系数据库的基本数据访问模式如下:
select 属性列表
from 表A, 表B
where 表A.data_id = 表B.id
and 表B.attr = 'A'
在数据仓库中 " from 表A, 表B where 表A.data_id = 表B.id "这一部分将多个多个数据表和表之间的关联条件放在一起定义为所谓的主题。
而 表B.attr = 'A' 这一部分就从where子句中分离出来作为坐标条件。
在数据仓库中建立时间坐标有两种方式,对于发生在时间点上的事件我们直接建立点坐标,通过his_date字段来表示,而对于延续一段时间的状态数据,我们可以建立区间坐标,通过from_date和to_date两个字段来表示。