第2章 列式数据库
NoSQL权威指南
简介
从打孔卡和磁带的年代开始,文件就是物理设备上连续的字节,访问的方式是从文件开始(打开文件)到文件结束(文件结束的标志为TRUE
)。是的,存储可以在磁盘上被分割成数据页,并且各种数据页可以通过指针链连接,但这种模型仍然与前面提到的打孔卡、磁带是相同的。后来,文件被拆分成记录(record,更多物理连续的字节),记录又被拆分成字段(field,仍然是更多物理连续的字节)。
文件被一条记录一条记录地处理(读/取一条,然后下一条)或按照物理存储位置顺序地处理(从头到文件结尾,或遵循一个指针链前进/后退n条记录,等等)。在这种模型中没有任何并行。这里还有一个假设:文件中记录(行)和记录中字段是物理排序的。为了使对这些数据的访问有效,花了大量的时间和资源来对记录进行排序。在磁带上无法做到随机存取,打孔卡上也无法做到。
到了RDBMS和SQL时代,这种文件系统模型仍然占主导地位。Codd博士也陷入了困境。首先,他必须在所有表中拥有一个主键(PRIMARY KEY
),主键对应于顺序文件的排列次序;后来,他意识到键就是键,没有必要在RDBMS中让其中一个键成为特殊的字段。但是,SQL已经纳入了已有的技术特性,而且早期的SQL引擎也是建立在既有文件系统上的,所以在这个环节上卡住了。
列式模式采用了一种完全不同的方法。但它是一种可以与SQL和关系模型很好地一起工作的模型。在RDBMS中,表(bable)是一个具有完全相同类型的行(row)的无序集合。一个行是相同类型的无序列(column)的集合,每列保存与既定列相关的标量值。可以通过列名称来访问对应的列,而不是通过存储中的物理位置,当然,也可以使用"SELECT*"
等简单方式来访问,以节省要输入。
对应的逻辑模型如下:表是行的集合,有且仅有一种结构;行是一组列的集合;列是取自一个且仅一个已知域的标量值。存储通常会在传统的文件系统中遵循这种模式,用文件表示表,用记录表示行,用字段表示列。但这都与物理存储无关。
在列式模型中,我们设计一个表,并且使用列式数据库特有的数据结构来存储每个列。行和表可以从这些行重新组合生成。看看平常的表的设计,可以看到为什么它们称为垂直存储模型,而不是水平存储模型。