数据库设计的重要性与原则

随着工作经验的积累,我日益感觉到,对一名程序员来说,拥有良好的数据库设计能力是很重要的,甚至是最重要的。

程序员界有一句著名的话

Talk is cheap, show me the code

把这句话演变一下,就成了

Code is boring, show me the data structure

数据库的种类很多,对于像作者这样的web后端程序员来说,可以把范围缩小到关系型数据库、非关系型数据库与NoSQL数据库。

数据结构为何如此重要

一切代码都是围绕数据结构运行的。

客户端展现的动态数据,都是存储在数据库中,这对程序员来说一定是常识了。拿你正在浏览的这个页面为例,文章的作者、标题、正文、评论、喜欢等等,只要你打开任意两篇文章,两个页面不一样的地方,几乎都是因为在数据库中存储的内容不同。

良好的数据结构可以提升性能,使代码变得简单、清晰。数据结构清晰了,围绕着数据运行的代码自然就清晰了。

数据库设计需考虑的因素

提到数据库设计原则,首先会想到第一、第二、第三范式,这些理论能了解最好,但这不是本文探讨的主题。

面对一个具体的应用场景,设计数据库时应考虑哪些因素?为了能够言之有物,我们拿简书的文章页面来现身说法。

当前可用性

数据结构的设计要能达到应用场景的要求,这是最基本的。举个例子,这篇文章的正文存储在了数据表中的某个字段,该字段的长度被设定为1000字,这显然不能满足应用场景的要求,文章写到这里已经超过了1000字(估计的,我没有数)。

适当超前

超前到什么程度需要根据对应用的预期来定。拿QQ来说,马化腾最初肯定预见不到QQ能有目前的用户量与活跃度,毕竟那是近20年前的事情了。

对于本文设定的应用场景,我们把超前设定为网站的文章数量达到了千万级。这时如果只把文章存在一张数据表里,读写性能必然是会急剧下降的,这必然会导致用户体验变差,用户流失。老板不能容忍,DBA也不能容忍。

合理的解决方案之一是分为两张数据表,一张存储热门文章,另一张存储非热门文章。毕竟热门文章占少数,热门文章的加载速度相对就更快了。还有别的解决方案吗?肯定有,留给您自己思考。

分离易变与不易变部分

对于一篇文章来说,哪些是易变的,哪些是不易变(不变)的?

不易变(不变)

作者

标题

正文(字数)

发布时间

更新时间

易变

阅读次数

评论

喜欢该文章的用户与数量

拆分的好处在于,首先数据结构更清晰了,其次可以提高读写性能,当文章有了新评论,只需更新存放评论的数据表。如果不拆分,需要更新的记录占用的磁盘空间很大,这对磁盘IO速度是个考验。

对于拆分出的部分,可以继续运用这些原则进行设计。

应对可能出现的新需求

互联网应用的迭代周期很短,设计数据结构时应考虑到可能出现的新需求。拿喜欢该文章的用户与数量举例。

为了达到应用的要求,最简单的方式是将这些用户放在一条记录里,存储的字段可以是数组类型。这样设计,喜欢文章的用户信息与用户数量都能轻易获取,读写性能也很好。

某天,产品经理找到了你:“商量个新需求呗”,在文章下方加个模块,就叫“喜欢该文章的人还喜欢了”。你就懵逼了,没法破,除非重新设计数据结构,然后就带来了迁移数据一系列事情。其实这个需求挺合理的,说得高大上一点,这叫“精准推荐”。

很明显,将用户放在数组里只能支持“查询喜欢某文章的用户”,不支持“查询某用户喜欢的文章”。

适当的冗余

或许你已经注意到了,文章的标题下面有这篇文章的字数。计算文章的字数,有两个时机:

保存文章时

读取文章时

后者的优势在于数据表中少了一个字段,而且这个字段不是必需的。哪个时机更好?个人觉得前者更好,理由如下:

计算长篇文章的字数是比较耗时的,应尽量减少计算次数

总体来看,文章的保存次数远小于读取次数

如果能够提高应用的性能,适当的冗余是必要的。

结尾

本文总结了设计数据库时需遵守的几个原则

可用性

适当超前

应对新需求

分离易变与不易变部分

适当冗余

因为自知还未达到数据库专家的水准,写出的内容肯定有不准确的地方,欢迎批评指正。

写这篇文章的想法酝酿很久了,但一直没时间动笔。适逢中秋佳节,上海下着大雨,不便出门行走,便安坐在电脑前敲下了这千八百字,前后花了两个多小时。如果喜欢就点赞,能指出不足或提出意见就更好了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容