一、数据库相关
1.1 代数关系计算
1.1.1 选择
1.1.2 投影(可以理解为视图)
1.1.3 笛卡尔积
1.1.4 自然连接(可以理解为笛卡尔积的去重复版)
1.1.5 外链接
1.1.6 真题
1.1.6.1 真题 1
1.1.6.2 真题 2
1.1.6.3 真题 3
1.2 关系型数据库的规范化
1.2.1 函数的依赖
多值依赖:多值依赖即属性之间的一对多关系,记为 K→→A。
非平凡的多值依赖:全集 U=K+A+B,一个 K 可以对应于多个 A,也可以对应于多个 B,A 与 B 互相独立,即 K→→A,K→→B。整个表有多组一对多关系,且有:“一”部分是相同的属性集合,“多”部分是互相独 立的属性集合。
1.2.2 定义关系
1.2.3 规范化
1.2.3.1 第一范式(1NF)
若关系模式 R 的每一个分量是不可再分的数据项,则关系模式 R 属于第一范式。
1.2.3.2 第二范式(2NF)
- 首先要满足第一范式;
- 每一个非主属性都完全依赖主键;
例子:
1.2.3.3 第三范式(3NF)
- 首先要满足第二范式
- 消除了非主属性对主键的传递函数依赖
例子:
原本函数依赖为:{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
其中主键为 仓库名 和 物品名 的组合,同时 管理员 和 物品名 的组合是候选键
显然,管理员的名字可以决定仓库名,那么这个候选键中的主属性就影响到主键中的属性了 主键中的主属性对于候选键是部分依赖关系,这可能导致插入 删除和更新数据时产生异常
应该把该表拆分成如下的两张表
1.2.3.5 第四范式(BCNF)
在满足 BCNF 的基础上,消除非平凡且非函数依赖的多值依赖(即把同一表内的多对多关系删除)
1.2.3.6 真题
1.2.3.6.1 真题 1
1.2.3.6.2 真题 2
1.2.4 反规范化
反规范化设计的方式一般有:
反规范化设计保证数据一致性的方法:
- 使用触发器
- 事务机制保障(适用于单体数据库)
- 应用保障(适用于异构数据库之间)
1.3 NoSql 数据库
1.3.1 键值数据库(Redis、Riak、SimpleDB、Chordless、Scalaris、Memcached)
Redis 数据库是可以作为缓存来使用的,缓存的作用:
- 实现数据库的服从复制、读写分离
- 实现数据库的分库分表
- 使用缓存,并实现读写分离
- 强化对热数据的访问
缺点:
- 增加系统复杂度
- 缓存比数据库成本更高
- 存在数据一致性的问题
需要了解的概念
1.3.1.1 Redis 过期策略、内存淘汰策略、持久化策略
过期策略:
内存淘汰策略:
持久化策略:
1.3.1.2 缓存异常问题
缓存击穿:
原因:
热点的 key 设置了太短的过期时间。例如秒杀业务下的“库存数量”。
解决办法:
- 设置较长的过期时间。非常重要的 key,则设置永久有效。但需要解決好与数据库中的 key 的一致性问题。
- 使用分布式锁:如果热点 key 失效了,要控制好访问后端数据库的流量。只允许一个请求去访问数据库,取出最新的 key,存放到 redis,其他请求必须等待。但分布式锁也要防止出现异常的情况。
缓存雪崩:
原因一:
redis 故障。比如 redis 宕机,网路出现抖动等。
解决办法:
- 使用主从复制提高可用性,使用 cluster 集群方案降低故障时影响的范围。
- 如果出现故障,则可以采取服务降级、熔断、限流等措施。
原因二:
采用了相同的过期时间。例如在同一时刻设置了大量的 key,但过期时间都是 5 分钟。
解决办法:
过期时间加上一个随机值,使得众多 key 均匀过期。
缓存穿透:
原因一:
恶意攻击,造成大量访问不存在的 key。例如登录时使用无效的用户名,软考网站查询成绩输入不存在的身份证号、准考证号。
解决办法:
- 针对来源是比较少的请求来源 ip,主动限制访问次数,或者拉入黑名单。
- 应用程序检查 key 的合法性,提前拒绝不合法的请求。
- 使用布隆过滤器。
原因二:
大量请求访问数据库里有但 redis 没有的 key。例如新业务刚刚上线,redis 是空的。
解决办法:
- 预热 redis,运行一个批处理脚本,将可能会大量访问的数据预先加载到 redis,业务再开张。
- 在最前端进行流量控制,逐步释放进来请求。给出一段时间,让 redis 逐步加载热数据。
- 如果数据库里也没有的 key,也要在 redis 中设置 key,使其值为 null 或空。
1.3.1.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 真题
说明:
- HDFS 是 Hadoop 分布式文件系统。 HBase 的数据通常存储在 HDFS 上。
- 索引构建在这里特指 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 盘存储。
说明:
- 内模式是数据物理结构和存储方式的描述, 是数据在数据库内部的表示方式,定义所有的内部记录类型、索引和文件的组织方式。
- 属于结构冲突。
- 年龄属于出生日期的派生属性,不应该做存储。
- 具体可见这里:1.2.4 反规范化1
1.2.4 反规范化 ↩
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于