专业书籍精读 · DDIA · 第 2 章

数据模型与查询语言

Designing Data-Intensive Applications · Ch 2 · Martin Kleppmann · 2017

EN →

这一章讲什么?

你填的一份简历、你手机里的一整张朋友圈关系网、你昨天下的那笔订单——这些数据存进数据库时,到底长什么样?DDIA(《数据密集型应用设计》)第 2 章说:这不是个技术细节,而是软件设计里最要命的一层选择。你把数据想成什么形状,就决定了你的代码好不好写、哪些问题问起来轻松、哪些问起来要命。

先说个怪事

你以为「用哪种数据库」是攒到最后才操心的琐事。其实反过来——它一开始就悄悄决定了你写代码有多顺。同一份「用户资料」,有人存得像一个装满东西的档案袋,有人存得像一摞用编号互相勾连的表格,有人存得像一张谁认识谁的关系网。选错了,你后面每天都在跟数据库较劲。

三种存法,三种脾气

表格派(关系型):像一叠 Excel。一行一条记录,靠「编号」互相引用——就像图书馆用书号把「书」和「谁借了它」挂上钩。规整、不重复,但要拼出完整信息得来回翻好几张表。

档案袋派(文档型):把一个用户的所有信息——姓名、每段工作经历、学历、联系方式——整袋装在一起,要用时一把全掏出来。读一份资料只需一个动作,快;坏处是袋子之间想互相牵线就笨。

关系网派(图):重点根本不在「点」,而在「点跟点怎么连」。谁关注谁、谁跟谁是同事、从这站到那站怎么换乘——专为关系密如蛛网的数据而生,社交网络是它的主场。

为什么以前这么别扭?

你代码里的数据是「一团套着一团」的(一个人套着他的好几段经历),可老式表格数据库是「摊平的一格一格」。两边对不上,只好雇个「翻译」在中间来回倒腾、拆了装、装了拆——这份别扭有个正经名字叫「阻抗不匹配」。档案袋派的出现,很大程度就是想省掉这个翻译:数据本来什么形状,就照样装进去。

还有一件事:怎么「问」数据

拿到数据还得会问。有两种问法。命令式是你亲自站进厨房,一步步指挥:先拿这个、再翻那个、循环比对……你得操心「怎么做」。声明式(比如 SQL)是你只管点菜报菜名——「我要住在北京、姓张的人」——至于怎么找,厨房(数据库)自己看着办。好处大了去:数据库能自作主张挑最快的路子、还能多开几个灶台一起炒(并行)。所以这几十年,声明式几乎完胜。

那到底该选哪种?

看你的数据是什么形状、你最常问什么问题:数据像一份份自成一体的档案(很少互相牵扯)→ 档案袋派;数据什么都能跟什么扯上关系(社交、推荐、路网)→ 关系网派;不偏不倚、关系规整 → 表格派。没有最好,只有最配。(一句实话:档案袋省了拼表的麻烦,可一旦数据之间开始大量互相引用,它立马露怯,你还得自己在代码里手动补上那些「拼接」。)

一句话记住

数据存成什么形状(表格 / 档案袋 / 关系网),是软件设计最深的一层选择——它决定你的代码顺不顺、问题好不好问。而且问数据要学会「只报菜名,别进厨房」(声明式),把「怎么找」交给数据库自己去优化。

想进到具体模型、查询语言和示意图? → 切到精读版