为啥需要数据库
问这个问题说明你对计算机还是有一定了解的。那我就从开发人员的角度解释下为什么数据库必不可少。
以一个简单的例子入手,假设现在要求你做一个简单的电影信息检索的网站,以供查询演员信息和电影信息,这些数据都存在普通文件中等待检索请求。
假设在文件中,数据以CVS的格式组织:
Actors.txt(name, gender,country)结构如下:"Jacky Chan", “male”, "China""Tony Jaa", “male”,"Thailand""Tom Hanks", “male”, "USA"“Jennifer Lawrence”, “female”, ”USA”Movies.txt(name, protagonist, year) 结构如下:"Rush Hour", “Jacky Chan”, 1998 "Hunger Game", “Jennifer Lawrence”,2012"Saving Private Ryan", “Tom Hanks”, 1998"Sally", “Tom Hanks”, 2016
第一个请求,我要查询Saving Private Ryan上映的年份,是不是得用以下遍历函数:for line in file: record = parse(line) if "Saving Private Ryan"== record: print int(record)可想而知,当某个文件有几百G的时候,你运行这样的查找程序试试?扫描文件,多次IO会让查询异常缓慢。这样的响应时间,任何应用恐怕都不能接受。即使全部数据全部放在内存,没有索引支撑,遍历一遍也是相当耗时的。然而,有了数据库,各种索引技术、内存缓存技术轻而易举的解决这个问题。
然后,我们再来考虑数据完整的问题(DATA INTEGRITY)。
(1)Movies.txt包含两条Tom Hanks主演电影,如何确保这两条记录里的Tom Hanks是同一个人?如何确定不是重名的演员?
(2)假如有人修改Movies.txt中某条记录的year属性为201y这种无效的年份表达怎么办?
(3)一部电影有多个主演时,这种情况该怎么存储?
显然文件系统不会考虑这些问题,作为网站的开发者,光考虑解决这些问题头都要爆炸了吧。而数据库的各种完整性约束会制定一些规则,保证数据的有效、完整、正确、一致。
此外,作为一个网站,每天成千上万的用户访问必不可少吧。那么当多个用户检索、修改同一文件里的数据时怎么处理?多个线程并发写一个文件、甚至写同一条记录时如何处理?在并发写的情况下,如果像文件系统一样,没有任何保证机制,难以想象数据会被写成什么样子。数据库的并发控制机制(基于锁、基于快照等)专门解决这类问题。
最后,关于数据的持久性。当正在更新某条记录时,系统崩溃了,这条数据会怎么处理?
另外,为防止磁盘损坏数据丢失,如何将数据高效的复制到另一台机器上做备份?文件系统显然不会考虑这些,但数据库系统却有相关机制保证数据持久正确可用。
数据面临的问题实在太多了,如果这些都要应用开发者去亲自处理,那这个工程得巨大到什么程度?这个时候,数据库的重要性就不言而喻了。
■网友
本想从原理上讲讲,但这个问题很简单又很本质,直接针对性举例可能效果更好。
考虑一个很常规的问题:一个中学的全体学生信息库。
如果用文件系统制作学生信息库,完全可以这样设计:
每个文件夹表示一个年度入学的学生,比如2018级、2019级等等,每年新建一个文件夹。
每个文件夹里有几个文件,按照高中部一个文件、初中部一个文件,或是按年级分等等。总之根据实际情况分成少数几个文件,不要做成每个班一个文件,文件太多关联查询会非常困难。
然后每个文件里,可以用Json或CSV或XML格式(甚至可以设计一种高效的二进制格式),保存所有学生的信息。
另外根据需求,还可以添加科目成绩信息等等,做成新的文件,用学生ID与学生总表对应。
推荐阅读
- 居家养花不需要太多,养这3款多肉,不仅颜值高,而且可镇宅招财
- 为啥看到书柜上的藏书会有心旷神怡的感觉
- 为啥知乎上普便有一种【我在北上广深打工,所以拥有更好的视野】这样的错觉
- 为啥工商银行的用户体验如此之差
- 汽车|看了中消协4S店服务测评调查结果,终于知道法系车为啥卖不好了
- 旅行|需要准备哪些物品?全面冬季出游清单,建议收藏带宝宝出门旅行
- 你为啥从窝窝商城离职?
- 侧重业务逻辑的产品需求规格说明书,需要有哪些要点
- 暖!援鄂医生将蒙古捐赠羊肉转赠病人:他们更需要补身体
- 为啥5G和2.4G默认的BSSID是相同的
