考前例题分享

一、数据库相关

1.1 代数关系计算

1.1.1 选择

image

1.1.2 投影(可以理解为视图)

image

1.1.3 笛卡尔积

image

image

1.1.4 自然连接(可以理解为笛卡尔积的去重复版)

image

image

1.1.5 外链接

image

image

image

1.1.6 真题

1.1.6.1 真题 1

image

1.1.6.2 真题 2

image

1.1.6.3 真题 3

image

1.2 关系型数据库的规范化

1.2.1 函数的依赖

image

多值依赖:多值依赖即属性之间的一对多关系,记为 K→→A。

非平凡的多值依赖:全集 U=K+A+B,一个 K 可以对应于多个 A,也可以对应于多个 B,A 与 B 互相独立,即 K→→A,K→→B。整个表有多组一对多关系,且有:“一”部分是相同的属性集合,“多”部分是互相独 立的属性集合。

1.2.2 定义关系

image

1.2.3 规范化

1.2.3.1 第一范式(1NF)

若关系模式 R 的每一个分量是不可再分的数据项,则关系模式 R 属于第一范式。

1.2.3.2 第二范式(2NF)

  1. 首先要满足第一范式;
  2. 每一个非主属性都完全依赖主键;

例子:

image

1.2.3.3 第三范式(3NF)

  1. 首先要满足第二范式
  2. 消除了非主属性对主键的传递函数依赖

例子:

image

原本函数依赖为:{SNp→Dno,SNo→Sname,Dno→Dname} 存在主键函数依赖传递 SNp→Dno;

修改后为 P1{SNo→Sname,SNp→Dno},P2{Dno→Dname} ,其中 P1 的 Dno 变成了外键

1.2.3.4 BCNF

如果在关系 R 中,U 为主键,A 属性是主键的一个属性,若存在 A->Y,Y 为主属性,则该关系不属于 BCNF

image

其中主键为 仓库名 和 物品名 的组合,同时 管理员 和 物品名 的组合是候选键

显然,管理员的名字可以决定仓库名,那么这个候选键中的主属性就影响到主键中的属性了 主键中的主属性对于候选键是部分依赖关系,这可能导致插入 删除和更新数据时产生异常

应该把该表拆分成如下的两张表

image

image

1.2.3.5 第四范式(BCNF)

在满足 BCNF 的基础上,消除非平凡且非函数依赖的多值依赖(即把同一表内的多对多关系删除)

1.2.3.6 真题

1.2.3.6.1 真题 1

image

1.2.3.6.2 真题 2

image

1.2.4 反规范化

反规范化设计的方式一般有:

image

反规范化设计保证数据一致性的方法:

  1. 使用触发器
  2. 事务机制保障(适用于单体数据库)
  3. 应用保障(适用于异构数据库之间)

1.3 NoSql 数据库

1.3.1 键值数据库(Redis、Riak、SimpleDB、Chordless、Scalaris、Memcached)

Redis 数据库是可以作为缓存来使用的,缓存的作用:

  • 实现数据库的服从复制、读写分离
  • 实现数据库的分库分表
  • 使用缓存,并实现读写分离
  • 强化对热数据的访问

缺点:

  • 增加系统复杂度
  • 缓存比数据库成本更高
  • 存在数据一致性的问题

需要了解的概念

1.3.1.1 Redis 过期策略、内存淘汰策略、持久化策略

过期策略:

image

内存淘汰策略:

image

持久化策略:

image

1.3.1.2 缓存异常问题

缓存击穿:

image

原因:
热点的 key 设置了太短的过期时间。例如秒杀业务下的“库存数量”。

解决办法:

  1. 设置较长的过期时间。非常重要的 key,则设置永久有效。但需要解決好与数据库中的 key 的一致性问题。
  2. 使用分布式锁:如果热点 key 失效了,要控制好访问后端数据库的流量。只允许一个请求去访问数据库,取出最新的 key,存放到 redis,其他请求必须等待。但分布式锁也要防止出现异常的情况。
缓存雪崩:

image

原因一:
redis 故障。比如 redis 宕机,网路出现抖动等。

解决办法:

  1. 使用主从复制提高可用性,使用 cluster 集群方案降低故障时影响的范围。
  2. 如果出现故障,则可以采取服务降级、熔断、限流等措施。

原因二:
采用了相同的过期时间。例如在同一时刻设置了大量的 key,但过期时间都是 5 分钟。

解决办法:
过期时间加上一个随机值,使得众多 key 均匀过期。

缓存穿透:

image

原因一:
恶意攻击,造成大量访问不存在的 key。例如登录时使用无效的用户名,软考网站查询成绩输入不存在的身份证号、准考证号。

解决办法:

  1. 针对来源是比较少的请求来源 ip,主动限制访问次数,或者拉入黑名单。
  2. 应用程序检查 key 的合法性,提前拒绝不合法的请求。
  3. 使用布隆过滤器。

原因二:
大量请求访问数据库里有但 redis 没有的 key。例如新业务刚刚上线,redis 是空的。

解决办法:

  1. 预热 redis,运行一个批处理脚本,将可能会大量访问的数据预先加载到 redis,业务再开张。
  2. 在最前端进行流量控制,逐步释放进来请求。给出一段时间,让 redis 逐步加载热数据。
  3. 如果数据库里也没有的 key,也要在 redis 中设置 key,使其值为 null 或空。

1.3.1.3 集群部署

  1. 哨兵模式
  2. 主从复制集群
  3. Cluster 集群(槽值的概念)

1.3.2 列式数据库(BigTable、Hbase、Cassandra、HadoopDB、GreenPlum、PNUTS)

1.3.3 文档数据库(MongoDB、CouchDB、Terrastore、ThruDB、RavenDB、SisODB、CloudKit、Perservere、Jackrabbit)

  • MongoDB 是由 C++ 语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。
  • MongoDB 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
  • MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

1.3.4 图形数据库(Neo4J、OrientDB、InfoGrid、Infinite Granph、GraphDB)

1.3.5 真题

image

说明:

  1. HDFS 是 Hadoop 分布式文件系统。 HBase 的数据通常存储在 HDFS 上。
  2. 索引构建在这里特指 ES 的倒排索引构建。

2.1 说明 MongoDB 如何实现空间矢量化存储的。

MongoDB 作为一个文档型数据库,非结构性数据以文档的形式进行存储。MongoDB 可以通过 GeoJSON 格式来存储空间矢量数据,这是一种基于 JSON 的地理空间数据交换格式。在 MongoDB 中,可以使用 geometry 字段来存储几何形状,使用 coordinates 字段来存储几何形状的坐标。

2.2 说明 MongoDB 对于存储非关系型数据的优势。

① 采用分布式文件系统和空间索引,提高了矢量空间数据的存储和处理效率 ② 支持多种空间分析和查询操作,可对数据进行深度分析和挖掘 ③ 扩展性好,可以根据业务需要增加字段,可以表达丰富的地理信息

3、冷热数据(4 分) 请说明 HDFS 使用热数据、温数据和冷数据存储的原因。 HDFS 允许将不活跃的数据分配到比较便宜的存储上,用于归档或冷存储。可以设置存储策略,将较 旧的数据从昂贵的高性能存储上转移到性价比较低(较便宜)的存储设备上。对冷数据采取容量大, 读写性能不高的存储介质如机械硬盘,对于热数据,可使用 SSD 硬盘存储。在读写效率上性能差距大。 异构特性允许我们对不同文件选择不同的存储介质进行保存,以实现机器性能的最大化。 硬盘有 SSD、SAS、SATA 三种,可以分别对应 热、温、冷 数据。

1)"热"数据:一般新产生的数据被应用程序大量使用,应该采用 SSD 存储;

2)"温"数据:随着时间的推移,数据访问频率逐渐降低,则可以采用 SAS 盘存储;

3)"冷"数据:当数据使用率下降得更多,应采用容量大而便宜的 SATA 盘存储。


image

说明:

  1. 内模式是数据物理结构和存储方式的描述, 是数据在数据库内部的表示方式,定义所有的内部记录类型、索引和文件的组织方式。
  2. image属于结构冲突。
  3. 年龄属于出生日期的派生属性,不应该做存储。
  4. 具体可见这里:1.2.4 反规范化1


  1. 1.2.4 反规范化

  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    334 引用 • 622 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...