为什么要使用数据库?

2020-04-20 14:41发布

1条回答
Lousiy
2楼 · 2020-04-20 15:00

以一个简单的例子入手,假设现在要求你做一个简单的电影信息检索的网站,以供查询演员信息和电影信息,这些数据都存在普通文件中等待检索请求。


假设在文件中,数据以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[0]: 
          print int(record[1])

可想而知,当某个文件有几百G的时候,你运行这样的查找程序试试?扫描文件,多次IO会让查询异常缓慢。这样的响应时间,任何应用恐怕都不能接受。即使全部数据全部放在内存,没有索引支撑,遍历一遍也是相当耗时的。然而,有了数据库,各种索引技术、内存缓存技术轻而易举的解决这个问题。


然后,我们再来考虑数据完整的问题(DATA INTEGRITY)。

(1)Movies.txt包含两条Tom Hanks主演电影,如何确保这两条记录里的Tom Hanks是同一个人?如何确定不是重名的演员?

(2)假如有人修改Movies.txt中某条记录的year属性为201y这种无效的年份表达怎么办?

(3)一部电影有多个主演时,这种情况该怎么存储?

显然文件系统不会考虑这些问题,作为网站的开发者,光考虑解决这些问题头都要爆炸了吧。而数据库的各种完整性约束会制定一些规则,保证数据的有效、完整、正确、一致。


此外,作为一个网站,每天成千上万的用户访问必不可少吧。那么当多个用户检索、修改同一文件里的数据时怎么处理?多个线程并发写一个文件、甚至写同一条记录时如何处理?在并发写的情况下,如果像文件系统一样,没有任何保证机制,难以想象数据会被写成什么样子。数据库的并发控制机制(基于锁、基于快照等)专门解决这类问题。


最后,关于数据的持久性。当正在更新某条记录时,系统崩溃了,这条数据会怎么处理?

另外,为防止磁盘损坏数据丢失,如何将数据高效的复制到另一台机器上做备份?文件系统显然不会考虑这些,但数据库系统却有相关机制保证数据持久正确可用。


数据面临的问题实在太多了,如果这些都要应用开发者去亲自处理,那这个工程得巨大到什么程度?这个时候,数据库的重要性就不言而喻了。


相关问题推荐

  • 回答 27

    DDL      create table 创建表    alter table  修改表   drop table 删除表   truncate table 删除表中所有行    create index 创建索引   drop index  删除索引 当执行DDL语句时,在每一条语句前后,oracle都将提交当前的事...

  • 回答 23

    java开发应用数据库比较主流的有下面这三种:    1.MySQL   MySQL是最受欢迎的开源SQL数据库管理系统,它由MySQL AB开发、发布和支持。MySQL AB是一家基于MySQL开发人员的商业公司,它是一家使用了一种成功的商业模式来结合开源价值和方法论的第二代开...

  • 回答 23

    1,DML(DataManipulationLanguage):数据操作语言,用来定义数据库记录(数据)2,DCL(DataControlLanguage):数据控制语言,用来定义访问权限和安全级别;3,DQL(DataQueryLanguage):数据查询语言,用来查询记录(数据);4,DDL(DataDefinitionLang...

  • 回答 11

    数据库三级模式:1、外模式,外模式又称子模式或用户模式,对应于用户级,外模式是从模式导出的一个子集,包含模式中允许特定用户使用的那部分数据。用户可以通过外模式描述语言来描述、定义对应于用户的数据记录(外模式),也可以利用数据操纵语言(Data Manip...

  • 回答 11

    模式、外模式、内莫斯,亦称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。模式描述的是数据的全局逻辑结构。 外模式涉及的是数据的局部逻辑结构,通常是模式的子集 内模式,亦称存储模式,是数据库在数据系统内部的表示...

  • 回答 16

    为了避免上面出现的几种情况,在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事...

  • 回答 5

    from是个关键词,表示要从哪个表查询。。

  • 回答 12

    数据库池连接数量一直保持一个不少于最小连接数的数量,当数量不够时,数据库会创建一些连接,直到一个最大连接数,之后连接数据库就会等待。

  • 回答 7

    仅用慢日志文件,如何快速获取分时报告?如果有监控系统,获取分时报告(每小时慢查询的条数报告)不难,如果只有慢日志文件,就会有点费劲。实验:通过 pt-query-digest --timeline 功能,可以输出带时间戳的慢查询条目用 sed 将 timeline 报告滤出安装 term...

  • 回答 9
    已采纳

    MySql优化的一般步骤:1.通过show status 命令了解各种sql的执行效率  SHOW STATUS提供msyql服务器的状态信息  一般情况下,我们只需要了解以Com开头的指令  show session status like ‘Com%’:显示当前的连接的统计结果  show global status like ...

  • 回答 4

    有可能是你输入的密码有问题,如果你的密码字母在前数字在后,那么你输入前面的字母后敲回车再输入数字就可以了,可以试一下

  • 回答 5

    工程目录sql语句CREATE TABLE `user` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `username` varchar(32) NOT NULL COMMENT '用户名称',  `birthday` date DEFAULT NULL COMMENT '生日',  `sex` char(1) DEFAUL...

  • 回答 6

    事实上MySQL 能承受的数据量的多少主要和数据表的结构有关,并不是一个固定的数值。表的结构简单,则能承受的数据量相对比结构复杂时大些。据D.V.B 团队以及Cmshelp 团队做CMS 系统评测时的结果来看,MySQL单表大约在2千万条记录(4G)下能够良好运行,经过数...

  • 回答 5

    事实上MySQL 能承受的数据量的多少主要和数据表的结构有关,并不是一个固定的数值。表的结构简单,则能承受的数据量相对比结构复杂时大些。据D.V.B 团队以及Cmshelp 团队做CMS 系统评测时的结果来看,MySQL单表大约在2千万条记录(4G)下能够良好运行,经过数...

  • 回答 6

    mysql哪个版本比较稳定MySQL的选择要取决于用途的,mysql5.5或者5.7 的版本,网上资源较多mysql的版本如下:1. MySQL Community Server 社区版本,开源免费,但不提供官方技术支持。2. MySQL Enterprise Edition 企业版本,需付费,可以试用30天。3. MySQL C...

  • 回答 4

    事实上MySQL 能承受的数据量的多少主要和数据表的结构有关,并不是一个固定的数值。表的结构简单,则能承受的数据量相对比结构复杂时大些。据D.V.B 团队以及Cmshelp 团队做CMS 系统评测时的结果来看,MySQL单表大约在2千万条记录(4G)下能够良好运行,经过数...

没有解决我的问题,去提问