数据库横表和纵表到底差在哪儿?你真的搞清楚了吗,别再糊涂了
- 问答
- 2025-12-31 01:04:38
- 3
综合自多位数据库开发者在社区论坛如CSDN、知乎的讨论精华,以及部分技术博客的通俗化解读)
你是不是经常听人说起数据库的“横表”和“纵表”,感觉好像懂了,但被问到具体区别时又有点含糊?别急,这个问题很多人一开始都会糊涂,今天咱们就抛开那些让人头疼的专业术语,用最直白的话把它讲清楚,它们俩最核心的差别,其实就一句话:躺着放还是站着放。
什么是横表?就是我们最熟悉的那个“表格”
想象一下你用Excel做的员工花名册,你的表头大概是这样的:员工ID、姓名、部门、工资、入职日期,每一行代表一个员工,每一列代表这个员工的一个属性。
就像这样:
| 员工ID | 姓名 | 部门 | 工资 | 入职日期 |
|---|---|---|---|---|
| 001 | 张三 | 销售部 | 10000 | 2020-01-01 |
| 002 | 李四 | 技术部 | 15000 | 2019-05-10 |
这种布局的表,横表”,学术上常叫“行存储表”,它的特点非常明显:
- 一行就是一条完整的记录:你想看张三的所有信息,找到“张三”这一行,从左到右扫一眼,就全知道了。
- 结构固定,列是预先定义好的:如果要增加一个新的属性,电话号码”,你就得去修改表结构,新增一列,这对于属性固定的业务(比如用户基本信息)非常方便。
横表可以理解为“面向对象”的表,一条记录把所有信息都“搂”在一起。
什么是纵表?像堆柴火一样把数据摞起来
那纵表是啥样呢?还是上面那个花名册,我们用纵表来存,样子就完全变了,它通常只需要三列(或四列):一个用来标识这是谁的记录,一个用来说明这个属性叫什么,一个用来记录这个属性的值。

上面的横表用纵表来表示就变成了:
| 员工ID | 属性名 | 属性值 |
|---|---|---|
| 001 | 姓名 | 张三 |
| 001 | 部门 | 销售部 |
| 001 | 工资 | 10000 |
| 001 | 入职日期 | 2020-01-01 |
| 002 | 姓名 | 李四 |
| 002 | 部门 | 技术部 |
| 002 | 工资 | 15000 |
| 002 | 入职日期 | 2019-05-10 |
看到了吗?原来一条记录(一个员工)的所有属性,现在被“拆散”了,变成了多条记录,就像把一根完整的木头(一条横表记录),锯成了好几段小木柴(多条纵表记录),然后整齐地码放起来,这种表就是“纵表”,学术上常叫“列存储表”或“属性表”。
纵表是“面向属性”的表,它把每个属性单独拿出来存放。
核心差别:到底差在哪儿?
-
存储方式: 横表是“躺着的”,一行接一行,纵表是“站着的”,一列(属性)的数据都堆在一起,这就导致了它们在硬盘上的排列完全不同。

-
查询的优劣场景(这是关键!):
- 横表擅长“查单个人”: 你想查询“张三的所有信息”,横表效率极高,因为数据库只需要找到ID为001的那一行,把整行数据读出来就行了。
- 横表不擅长“统计汇总”: 如果老板让你“计算全公司的平均工资”,横表就有点吃力了,它需要把每一行数据都读出来,但其实你只关心“工资”这一列的数据,其他像姓名、部门这些你根本不需要,这就造成了大量的无用功(术语叫“IO浪费”)。
- 纵表擅长“统计汇总”: 同样是“计算全公司的平均工资”,纵表就开心了,因为它把所有员工的“工资”这个属性的值都紧紧地存储在一起(就像把所有人的工资条撕下来,叠成一摞),数据库可以直接读取“属性名=工资”的这一大块数据,飞快地算出平均值,完全不用管姓名、部门那些无关的信息。这种针对某一列或某几列进行大规模计算的场景,是纵表的绝对主场。
- 纵表不擅长“还原完整记录”: 你想看“张三的所有信息”,纵表就麻烦了,它需要把数据库中所有“员工ID=001”的记录都找出来,然后再像拼拼图一样,把“姓名”、“部门”、“工资”这些属性值拼成一条完整的记录,这个操作比横表直接读一行要慢。
-
扩展性:
- 横表增加新属性麻烦: 如果突然要记录每个员工的“血型”,你得修改表结构(ALTER TABLE ... ADD COLUMN ...),对于存量数据,新列的值往往是NULL,如果业务属性经常变,表结构就会变得非常臃肿。
- 纵表增加新属性简单: 要记录“血型”?太简单了!直接插入新的记录就行了,
INSERT INTO 表 VALUES (001, ‘血型’, ‘A型’),完全不需要动表结构,这种设计对于需要频繁增加自定义字段的系统(比如电商平台的商品属性、问卷调查系统)非常有优势。
别再糊涂了
你可以这样记:
- 横表像一本通讯录,找一个人的全部联系方式很快,但想统计“有多少人是北京号码”就得一页页翻。
- 纵表像一堆整理好的卡片,把所有“北京号码”的卡片抽出来统计很快,但想还原一个人的全部信息,得去好几堆卡片里翻找。
没有绝对的好坏,只有适用场景的不同:
- 在线交易系统(OLTP),比如银行转账、订单录入,需要频繁地增删改查某一条完整记录,用横表更合适。
- 分析型系统(OLAP),比如商业智能报表、大数据分析,需要海量数据中快速统计某一类指标,用纵表优势巨大。
你应该彻底搞清楚横表和纵表的区别了吧?以后再听到这两个词,就想一想它们是“躺着”还是“站着”,就能立刻明白它们各自的特长和短板了。
本文由帖慧艳于2025-12-31发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/71585.html
