dbstorage

数据库乱谈(二)——数据形式

数据库首先能满足的需求,肯定是存数据,这一篇就讲一下数据库如何存数据,数据应该是怎样的形式。

文本形式

我们很容易想到以文本的形式保存数据,就像我们日常生活中具体的数据,以文本的形式呈现出来,记录下来。可以使用我们常见的csv或者json形式的文本将数据存储下来。但此时的数据是离散的,直观但是不产生关联。

表格形式

这里需要引入一个概念,由埃德加·科德提出的关系模型(Relational Model)。简单来说,这个经典的理论,假定所有的数据都表示为数学中的关系。数据以元组的形式存在,数据的范围是一个域或者叫数据类型,因而每个元组也就是一个数据单元都对应着一些数据类型,这些数据类型就是数据的属性。具有某些属性的元组排列在一起就形成了关系。关于关系代数等问题会在后续的关于sql语言的文章中进行详细说明。这里只要明确一个理论基础,数据的基础单位是元组,每个元组具有一定的属性,元组的集合形成关系。

这样我们也比较容易的想到,在简单一些的二元关系中,数据的存储可以以表格的方式呈现,数据基本单位元组对应行数据,属性对应列属性,元组的集合关系对应一张表。这样呈现出来的数据类似于我们平时使用的二元表格或者Excel中表格的数据表的形式。

现在数据产生了一定的对应关系,更加直观,但是所有数据依旧是以近似文本的形式存在(当然在Excel中也产生了一些数据类型,可供计算,算是初级形态)。

进一步优化

当我们确认了依照关系模型来划分数据,数据的基本单元是表,最小单位是一个元组(类似于表格中行列交错的一格数据)。

分离数据属性

在我们的数据表格中,一列的数据都具有相同的属性,那么我们就考虑可以将这个属性作为一个表头提取出来,这样数据的属性更加直观,也减少了每一个数据上都要附加属性的存储空间的浪费。这就产生了关系数据库中字段的概念。此时如果加入和删除数据,就可以只操作数据,无需关心数据的属性。而修改数据的属性时,增加属性可以将数据的该项属性设定一个默认的初始值,删除某项属性时可以让所有数据都忽略该项设定,修改属性时则会比较繁琐,需要调整大量的数据。

数据标记

我们已经将数据的属性提取出来,同样可以把这种思路应用到数据本身。就像硬盘中的数据存储一样,我们在删除文件时,并不是真正将这一部分删除掉,而是对这块空间做一个可以写入的标记。我们对于表中的数据也可以用一个标记位来表示,如果该行被删除,我们可以对其标记一个已删除的mark,提取出一个标记数据是否有效的表,对应到具体数据中去。

数据编码

下面可以考虑具体数据的存储,对于用户而言,数据直观的表示是字符串形式,结合数据的属性我们赋予数据真实的意义。而对于存储而言,按照字符串存储一个数据是不易于计算机理解数据的形式,也不好进行各种计算操作。所以对于不同类型的数据我们可以指定一定的编码格式,将数据以编码规范进行二进制存储。

行存与列存

一般来说我们读取数据库中的内容时,是按照行的格式读取的,需要某一项数据,就将该项数据的所有字段读取出来。在大数据发展迅速的今天,常见的场景是一个数据实体对应多项记录,其中一些项是描述数据实体相关的辅助信息,一般不会在查询、计算和统计分析中用到。在一般的大数据使用场景中,会针对几项数据进行大量的统计使用(这里引入了数据仓库的概念)。因此更需要用到的查询是针对大量行中个别列的查询,此时遍历所有行的消耗很大且浪费(因为多数列没有用到)。我们就提出了列存的概念。列存储在这样的应用场景下,有较多的优势。

列数据都具有相同的属性,所以在列存储时,我们可以使用相同的数据格式存储,也就更方便使用压缩算法对整列的数据进行压缩。同时,在查询时只需要取出需要用到的几列数据即可,大大减少了时间和空间的开销。


确定了数据的存储格式后,我们就可以进一步规划数据库的功能实现,下一篇将从总体架构上探讨数据库应该有什么功能,又如何架构一个数据库系统。