DBMS(Database Management System,数据库管理系统)中的面向行和面向列是两种不同的数据存储方式。
面向行(ROW-Oriented)
在面向行的数据存储方式中,数据被组织成一行一行的形式存储。这种方式可以更好地支持整行数据的读取和更新操作,适用于对单条记录做增删改查操作较多的情况。这种方式需要在磁盘上存储较多的冗余数据,因为每行数据都需要存储一些共同的信息,例如表头、行号等。通常会将数据按照主键进行排序,即“聚簇索引”,这样可以加速对单条记录的查询。
例如,以下是一个面向行存储的样例表格:
姓名 | 年龄 | 性别 |
---|---|---|
张三 | 20 | 男 |
李四 | 25 | 男 |
王五 | 18 | 女 |
赵六 | 30 | 男 |
如果要查询某一行的具体数据,需要读取整行的所有信息。比如,如果要查询李四的年龄,则需要先找到李四这一行,然后读取年龄列的数据。
面向列(COLUMN-Oriented)
在面向列的数据存储方式中,数据被组织成一列一列的形式存储。这种方式可以更好的支持列的聚合操作(如 COUNT、AVG 等),适用于对多条记录做复杂统计的情况。这种方式可以减少存储冗余数据的情况,因为每个列的数据被存储在一起,不需要每行都存储相同的信息。
例如,以下是一个面向列存储的样例表格:
姓名 | 张三 | 李四 | 王五 | 赵六 |
---|---|---|---|---|
年龄 | 20 | 25 | 18 | 30 |
性别 | 男 | 男 | 女 | 男 |
如果要查询某一列的具体数据,只需要读取该列的所有数据。比如,如果要统计年龄的平均值,则只需要对年龄这一列的数据做聚合计算即可。
面向列的示例
举个面向列的示例:有如下表格:
Order Date | Product | Category | Sales | Profit | |
---|---|---|---|---|---|
1 | 2014-01-06 | Apple | Fruits | 4500 | 100 |
2 | 2014-01-06 | Orange | Fruits | 3200 | 50 |
3 | 2014-01-07 | Banana | Fruits | 1200 | 20 |
4 | 2014-01-08 | Carrot | Vegetables | 6000 | 500 |
5 | 2014-01-09 | Cucumber | Vegetables | 4200 | 100 |
关于总利润是什么。我们可以分别对不同的列进行统计。即可以对利润这一列进行加总。其结果是:$100+50+20+500+100=770$。
这是在面向列的存储策略下对于聚合操作的优点。
小结
面向行和面向列两种数据存储方式各有其优缺点,需要根据具体的应用场景进行选择。面向行适用于对单条记录做增删改查操作较多的情况,而面向列适用于对多条记录做复杂统计的情况。当然在实际应用中,也可以将两种存储方式结合起来使用,根据实际情况灵活配置。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:DBMS中面向行和面向列的数据存储的区别 - Python技术站