为啥需要数据库( 二 )


在这个系统上,也可以实现查询、修改信息、筛选学生等等各种功能。但它有几个特点:
1、程序运行时,需要载入大量信息到内存中——可以接受
无论采用哪种数据格式,直接在原始文件上做查询、修改是不现实的。必须用某种库比如Json库、XML库等,将文件加载到内存中,形成一些方便使用的容器。好在学生信息并不是特别多,以现在的硬件水平来说,全部加载到内存也应该可以接受。
无论做成列表也好,字典也好,各种查询工作都是基本的容器操作。
其实这和大型实时网游,比如魔兽世界、剑网都差不多,在线玩家(强调:是在线玩家)的数据是在内存中的,支持高频次(每秒改15次~30次)修改。
2、各种常规操作需要专门写代码——有点麻烦
一些常规查询,比如名字和分数的对应,科目和老师的对应,可以实现多建几个字典(哈希表),方便随时查询。
一些特殊查询,“生物科目,75~80分有哪些人?”,“数学平时分不及格有哪些人?”,可以写代码遍历查询,做成一个特殊功能。
3、数据写回文件——灾难的开始
如果正在录入学生数据,刚录了100个,停电或BUG了,内存数据很可能就没了。
显然,写回文件才能稳妥保存数据,那何时保存呢?隔30秒一次?5分钟一次?显然,隔的时间越久,数据越不安全;隔的时间越近,磁盘就越繁忙、性能急剧下降。
而且请注意,上面的这种简易文件系统不支持增量写入,就算支持增量写入,也几乎不可能支持“插入写入”。就是不支持在中间插入内容、后面的数据自动往后挪。所以几乎所有的写入都是全量更新,把内存数据转化为Json、CSV、XML等全部写一遍文件。
系统开发者和维护人员,必须在性能与安全性之间平衡。学校的信息维护工作变得非常刺激,很有挑战性 :)。

解决方案
除上面几点以外还有很多具体问题,不再赘述。但以上问题有对应的解决方案:
1、为避免加载所有数据到内存中,可以写一个总的数据管理模块,保证内存中只有索引等必要的数据而不是全部。
2、为了方便编写各种复杂的查询逻辑,可以设计一套通用的查询语法。这套语法虽然也需要学习,但总比直接写程序要简单得多。
3、要彻底解决数据写回文件的问题,必须让文件支持“部分修改”的特性,不能插入一些数据就全写整个文件。每次修改都能妥善保存数据,提供读取、修改、写回的标准流程,尽可能让丢失数据的意外降到最低。
总之,只要做到了这些,信息库就能放心的使用了。
同时,一个麻雀虽小五脏俱全的数据库也诞生了。 :)


■网友
1.excel 不方便多人共享使用数据
excel好比一个移动硬盘,你打开使用excel,你的同事就无法再使用了。
数据库好比网盘,你和同事可以愉快的一起使用网盘或者数据库里的数据。
2.excel无法存放大量数据
excel可以存放十几万的数据,但是大数据时代,从来就不缺少数据,当数据量越来越大的时候,excel就无能为力了。而数据库却可以存放海量的数据。
所以,你看到淘宝几亿人使用,背后存放商品的不是excel,而是数据库。
3.excel无法处理相对复杂问题
数据库可以应对突发事故,比如数据丢失、数据被盗。数据库可以处理复杂的业务,比如银行存取款业务。
因为公司的数据是放到数据库里的,所以现在的数据分析、机器学习、开发工程师等职位在招聘要求中都会要求:使用过数据库,熟悉SQL。
具体的数据库和SQL关系我在《从零学会SQL:入门》课程里用“建筑施工人员”类比过,是下面图片里的关系:
为啥需要数据库


从零学会SQL:入门

■网友
数据库跟文件系统的区别太大了呀,实际上每次我给talk,上来第一个就是要比较数据库跟文件系统的区别。1.sql,易用性,文件系统你要自己写awk 写sed,可能还要写code很麻烦的,数据库一个dsl搞定2.事务他帮你做了3.内存管理他帮你做了4.性能,你自己搞一般来说搞不过数据库。


推荐阅读