2021级nosql(大三软工限选)期末复习整理

依然是notion格式,推荐点击文末评论区链接查看更完整(可私信获取pdf版)

--------

这里是软工限选的整理,以下只记录软工的或软工范围可做的往年题(因此非常不完全覆盖知识点,一定要配合PPT复习),根据20-21年回忆版,大数据和软工试卷可能会有2-3题的差异(难度是加大的,或者是非软工范围)

特别感谢每年回忆版记录,各类知识点整理,笔记整理的学长学姐,以及闫中敏老师!

今年考试主要又出了Hlog,基本都没仔细背,打了个措手不及;其他简答题中规中矩,设计题为电商平台的存储设计、ER转hbase和redis、书籍评分neo4j转mongoDB+对应的书籍平均分计算+获得Topk排名算法

数据库间的转化

非关系型数据库---Redis,MongoDB,Neo4j_hbase,redis,mongodb和neo4j各自的数据类型-CSDN博客

小的整理

以闫中敏老师的PPT为主,参考了部分大数据的李晖老师的PPT

应用实例

MongoDB应用案例:网站数据、缓存、大尺寸低价值的数据、高伸缩性的场景、用于对象及JSON数据的存储 用电信息采集,商品信息存储,文章评论及管理,日志数据,人社大数据平台技术;

Hbase应用实例:抓取增量数据、内容服务、信息交换 手机数据(查询一段时间内固定号码的所有数据;查询一段时间内所有数据);滴滴(订单查询);关于处理热点的设计技巧(reverse反转;时间戳反转;加盐;散列);银行Hbase读写设计;HBase在新能源汽车监控系统中的应用;HBase 在人工智能场景的使用

Redis使用实例:构件一个简单的文章投票网站的后端(文章评分的计算,票数乘以常数+发布时间;文章基本信息hash存储;文章排序集合,评分和发布时间分别作为两个有序集合;投票历史记录,使用集合存储已投票用户ID;文章分组;ZINTERSTORE)

Neo4j应用案例:知识图谱;保险欺诈;社交推荐;歌曲信息管理;社交网络;状态图实例;活动流;用户角色;论文

Untitled

Untitled

各种数据库的特点与不同

  1. nosql的分类与各自特点

    Untitled

  2. 关系数据库

    • 优势:通用性和高性能;保持数据的一致性(事务处理);最小冗余;复杂查询如JOIN;成熟的技术
    • 存在的问题:
      • 不适合在分布式环境中的向外扩展
      • 所有的应用服务器都共享一个中心的数据库服务器
      • 难以支持高并发读写
      • 不擅长进行大量数据的写入处理
      • 对于字段不固定的应用无法进行表结构的变更及建立索引
      • 对简单查询需要快速返回结果的处理效率较低
  3. Nosql数据库

    • 优点:
      • 易于数据的分散
      • 提升性能和增大规模
      • 模式自由
      • 扩展性好
  4. NewSQL数据库

    • NewSQL是对各种新的可扩展/高性能数据库的简称
      • 具有NoSQL对海量数据的存储管理能力
      • 保持了传统数据库支持ACID和SQL等特性
    • NewSQL共同特点
      • 支持关系数据模型
      • 使用SQL作为其主要的接口
  • 云数据库
    • 云数据库是指被优化或部署到一个虚拟计算环境中的数据库
      • 可以使用户按照存储容量和带宽的需求付费
      • 可以将数据库从一个地方移到另一个地方(云的可移植性)
      • 可实现按需扩展
      • 高可用性(HA)

Untitled

  • 文档数据库

    • 文档型数据库特性 一致性:开发者可以根据应用程序需要和业务需求,为每次操作指定数据库的“一致性”强度 事务:支持单文档级别的事务,也可以使用NWR协议来实现事务功能 可用性:文档数据库视图用主从数据复制技术来增强可用性 查询:可以使用视图查询,可用物化视图 可扩展性:可用“分片”技术
    • 适用案例 事件记录 内容管理系统及博客平台,用来管理用户评论、用户注册、用户配置和面向Web文档 网站分析与实时分析,用来存储页面浏览量或独立访客数会非常方便,而且可以无需改变模式即可新增度量标准 电子商务应用程序,以存储产品和订单
    • 不适用案例 包含多项操作的复杂事务,文档数据库不适合执行跨文档的原子操作 查询持续变化的聚合结构,虽然文档数据库对模式不施加任何限制,但是如果要即时查询这些持续可变的实体,那么所用的查询命令也要不断变化,所以就需要以最低级别的粒度来保存聚合,这实际上就等于要统一数据格式
    • 优势:模式灵活、易扩展、丰富的功能(索引、聚合、固定集合、文件存储)、性能卓越、管理简便
    • 不足:不支持JOIN查询;不支持事务处理;更新数据时,数据不是实时写入磁盘中,有可能出现数据丢失;MongoDB在保存数据时,需要预留很大的空间,对磁盘的空间需求呈现逐渐增大的趋势
    • 数据复制、分片
  • 列存储数据库

    • 列式数据库,以列相关存储架构进行数据存储的数据库,主要适合于批量数据处理和即时查询
    • HBase(Hadoop Database)是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群
    • HBase中表的特点:大,面向列,稀疏
  • 键值对数据库

    键值数据库将数据存储为键值对集合,其中键作为唯一标识符

    Redis支持主从同步 数据可以从主服务器向任意数量的从服务器上同步 从服务器可以是关联其他从服务器的主服务器,这使得Redis可执行单层树复制 由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录 同步对读取操作的可扩展性和数据冗余很有帮助

  • 图数据库

    1. 关系数据库的不足:

      随着离散数据的增加,数据集的宏观结构会越发复杂和不规整,关系模型将造成大量表连接、稀疏行和非空检查逻辑, 关系世界中连通性的增强将转换为连接操作的增加,会阻碍性能,使得数据库难以响应变化的业务需求

      二度三度好友的查询需求对SQL递归代价高

    2. 其他NoSQL也缺乏联系的表达:

      Key-value、文档和列存储数据库存储的都是无关联的值/文档/列,很难用于关联数据 对于上述数据库而言,一种添加联系的策略是在某个聚合数据(Aggregate)中嵌入另一个聚合数据标识符,即添加外键,这将导致代价剧增

    3. 图数据库拥抱联系

    4. Neo4j特点:

      1. 完整的ACID支持
      2. 高可用性
      3. 轻易扩展到上亿级别的节点和关系
      4. 通过遍历工具高速检索数据
  1. HBase VS 传统关系数据库

    Untitled

Untitled

Untitled

简答题整理

2020-2021

  1. BASE和ACID的区别

Untitled

  1. 举例说明两阶段提交协议

    该算法分为两个阶段 投票阶段 在请求阶段,协调者将通知事务参与者准备提交或取消事务,然后进入表决过程 在表决过程中,参与者将告知协调者自己的决策:同意(事务参与者本地作业执行成功)或取消(本地作业执行故障) 提交阶段 协调者将基于第一个阶段的投票结果进行决策:提交或取消。当且仅当所有的参与者同意提交事务协调者才通知所有的参与者提交事务,否则协调者将通知所有的参与者取消事务

Untitled

  1. 描述RDB数据库、NoSQL数据库和NewSQL数据库的区别和特点

相关示例 关系数据库的不足:大量数据的写入处理;表结构变更及建立索引;字段不固定的应用;对简单查询需要快速返回结果的处理 NoSQL数据库的优势:易于数据的分散;提升性能和增大规模;模式自由;扩展性好 NewSQL 是对各种新的可扩展/高性能数据库的简称 ,具有 NoSQL 对海量数据的存储管理能力 ,保持了传统数据库支持 ACID 和 SQL 等特性 特点 :支持关系数据模型 ; 使用 SQL 作为其主要接口

(以下来自GPT)

  • RDB(关系数据库)、NoSQL 数据库和 NewSQL 数据库是三种不同类型的数据库,它们在数据存储和处理方面有许多区别。以下是它们的主要特点和区别:
    1. 关系数据库(RDB):

      1. 数据模型: 使用表格的行和列的关系模型,支持 ACID(原子性、一致性、隔离性、持久性)事务。
      2. 数据一致性: 保持严格的一致性,确保事务的完整性,适用于需要高度结构化和强一致性的应用场景。
      3. 查询语言: 使用 SQL(Structured Query Language)进行查询和操作。
      4. 适用场景: 适用于需要强一致性、事务支持和严格模式的应用,如金融系统、企业资源计划(ERP)等。
      5. 优势:通用性和高性能(保持数据的一致性(事务处理);最小冗余;复杂查询如JOIN;成熟的技术)
      6. 不足:大量数据的写入处理 表结构变更及建立索引 字段不固定的应用 对简单查询需要快速返回结果的处理
    2. NoSQL 数据库:

      1. 数据模型: 不使用关系模型,采用多种数据模型,如文档存储、键值对、列族、图等,适用于不同数据结构的需求。
      2. 数据一致性: 提供灵活的一致性选项,包括强一致性、最终一致性和事件ual consistency。
      3. 查询语言: 没有标准的查询语言,每种类型的数据库通常有自己的查询方式。
      4. 适用场景: 适用于大规模分布式系统、需要横向扩展、对灵活性和性能要求较高的应用,如社交媒体、大数据分析等。
      5. 优势:Nosql优势:易于数据的分散;提升性能和增大规模;模式自由;扩展性好
    3. NewSQL 数据库:

      1. 数据模型: 类似于关系数据库,采用关系模型,支持 ACID 事务,但是在分布式环境中提供更好的扩展性。
      2. 数据一致性: 通常提供强一致性,并在水平扩展时保持较好的性能。
      3. 查询语言: 支持 SQL 查询。
      4. 适用场景: 适用于需要关系数据库的数据一致性和查询语言,同时需要更好的横向扩展性能,如大规模的在线事务处理(OLTP)系统。
    4. 主要区别:

      数据模型:

      • RDB:采用关系模型,数据以表格形式组织。
      • NoSQL:多种数据模型,非关系型,可以是文档、键值对、列族等。
      • NewSQL:类似于 RDB,采用关系模型。

      数据一致性:

      • RDB:强一致性,保证事务的 ACID 特性。
      • NoSQL:提供不同一致性级别,包括最终一致性。
      • NewSQL:通常提供强一致性。

      查询语言:

      • RDB:使用 SQL 查询语言。
      • NoSQL:没有统一的查询语言,每种数据库有自己的查询方式。
      • NewSQL:支持 SQL 查询。

      适用场景:

      • RDB:适用于需要强一致性和结构化数据的应用。
      • NoSQL:适用于大规模分布式系统、非结构化或半结构化数据的应用。
      • NewSQL:适用于需要关系数据库的数据一致性和 SQL 查询,同时需要更好的横向扩展性。

2018-2019

1.举例说明强一致性,不一致窗口界限怎么确定

(以下来自GPT) 强一致性是指在分布式系统中,当多个节点同时对数据进行操作时,系统确保每个节点都能看到同一时刻的一致数据状态。简而言之,强一致性要求在任何时刻,所有节点都能看到相同的数据视图。

举例说明:假设有一个分布式系统,包含多个节点 A、B、C。假如A先写入了一个值到存储系统,存储系统保证后续A,B,C的读取操作都将返回最新值

不一致窗口界限(不在软工限选范围内)(交互延迟,系统的负载,以及复制技术中replica的个数)

2.NWR模型中N W R的含义,如何设置可以实现高可用性

N: 数据所具有的副本数量 R: 完成读取操作所需要读取的最小副本数量,即一次读操作所需要参与的最小节点数量 W: 完成写操作所需要写入的最小副本数量,即一次写操作所需要参与的最小节点数量 只需W + R > N,就可以保证强一致性,因为读取数据的节点和被同步写入的节点是有重叠的

(PPT)如果想要高的可用性,就需要放松一致性的要求,此时可以配置W=1,这样使得写操作延迟最低,同时通过异步的机制更新剩余的N - W个节点

可用性: 一直可以正常的做读写操作。简单而言就是客户端一直可以正常访问并得到系统的正常响应。用户角度来看就是不会出现系统操作失败或者访问超时等问题

W = 1, R = N ,对写操作要求高性能高可用 R = 1 , W = N ,对读操作要求高性能高可用,比如类似cache之类业务

3.简述NOSQL和关系数据库的不同

关系数据库的优缺点

优点:

  • 通用性和高性能
  • 能保持数据的一致性(事务处理)
  • 能够保证最小冗余
  • 能实现复杂查询如 JOIN
  • 拥有成熟的技术

缺点:

  • 不适合在分布式环境中的向外扩展
  • 所有的应用服务器都共享一个中心的数据库服务器
  • 难以支持高并发读写
  • 不擅长进行大量数据的写入处理
  • 对于字段不固定的应用无法进行表结构的变更及建立索引
  • 对简单查询需要快速返回结果的处理效率较低

总结: 关系型数据库在大量数据的写入处理、表结构变更及建立索引、字段不固定的应用、对简单查询需要快速返回结果的处理方面存在不足

NoSQL 的优点

  • 易于数据的分散
  • 提升性能和增大规模
  • 模式自由
  • 扩展性好

2017-2018

1.nosql的分类和特点

Untitled

2.什么是弱一致性?请解释BASE理论。

弱一致性:假如A先写入了一个值到存储系统,存储系统不能保证后续A,B,C的读取操作能读取到最新值

Basically Availble --基本可用(基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性——但请注意,这绝不等价于系统不可用) Soft-state --软状态/柔性事务 (软状态,和硬状态相对,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时) Eventual Consistency --最终一致性(最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。特殊的弱一致性)

3.什么是NWR模型,如果想要保证高可用性,应该如何配置?

与上文重复

2021-2022

  1. 什么是弱一致性,最终一致性举例

    弱一致性:假如A先写入了一个值到存储系统,存储系统不能保证后续A,B,C的读取操作能读取到最新值

    最终一致性:最终一致性是弱一致性的一种特例 假如A首先write了一个值到存储系统,存储系统保证如果在A,B,C后续读取之前没有其它写操作更新同样的值的话,最终所有的读取操作都会读取到A写入的最新值

  2. 在分布式系统中使用NWR模型怎样实现强一致性?

    只需W + R > N,就可以保证强一致性,因为读取数据的节点和被同步写入的节点是有重叠的

  3. 分布式系统中怎样保持高可用性?

    (合理怀疑不是软工的回忆版)

    • 答案来自GPT:

      对于已有知识点,重点可能在于:冗余设计(CAP,考虑数据的一致性问题,根据 CAP 理论,一个分布式系统最多只能同时满足一致性、可用性和分区容错性,这三项中的两项。因此,我们需要根据业务需求,选择合适的一致性模型,如强一致性、最终一致性、弱一致性等。); 负载均衡(类似NWR模型,通过在多个节点之间分配请求,实现负载的平衡,提高系统的性能和可靠性。负载均衡需要考虑负载均衡算法的选择,如轮询、随机、最少连接、哈希等,以及负载均衡器的部署位置,如客户端、服务端、网络层等。)

      在分布式系统中,保持高可用性是一个重要的挑战。高可用性意味着系统在面临故障或异常情况时仍然能够提供稳定和可靠的服务。以下是一些保持分布式系统高可用性的方法:

      1. 分布式架构:
        • 采用分布式架构,将系统拆分为多个组件或服务,这样即使某个组件出现故障,其他组件仍然可以继续提供服务。
      2. 冗余和备份:
        • 使用冗余和备份策略,确保系统的关键组件存在备用副本。当主要组件发生故障时,备用组件可以快速接管服务。
      3. 负载均衡:
        • 使用负载均衡技术,将请求均匀分布到多个服务器或节点上,防止某一节点过载,提高系统整体的性能和可用性。
      4. 自动故障恢复:
        • 实施自动故障检测和恢复机制,系统能够在检测到故障时自动转移流量或修复问题,减少对用户的影响。
      5. 分布式数据库和存储系统:
        • 使用分布式数据库和存储系统,确保数据的复制和分布在不同的节点上,提高数据的可用性。采用副本机制确保数据的冗余和恢复能力。
      6. 多数据中心部署:
        • 将系统部署在多个地理位置的数据中心,以提高整体系统的可用性。这样即使一个数据中心发生故障,其他数据中心仍然可以提供服务。
      7. 健康检查和监控:
        • 实施健康检查和实时监控,通过监测系统的状态来及时发现并响应潜在的问题。这有助于预防故障并减少服务中断的时间。
      8. 故障隔离和容错设计:
        • 采用故障隔离和容错设计,即使某个部分发生故障,系统的其他部分仍然可以正常运行。这涉及到系统的设计和架构方面的考虑。
      9. 快速恢复策略:
        • 设计快速恢复策略,包括冷启动、热启动和暖启动等方式,以在系统发生故障时快速地恢复服务。
      10. 可伸缩性:
        • 构建可伸缩的系统,能够处理不断增加的负载。这有助于应对系统在高负载情况下的性能和可用性挑战。
  4. Hbase中预写日志的原理和作用

    (预写日志是Hbase的RegionServer在处理数据插入和删除的过程中用来记录操作内容的一种日志。在每次Put、Delete等一条记录时,首先将其数据写入到RegionServer对应的HLog文件中去。)

    HLog又称WAL。WAL意为Write Ahead Log,用来做灾难恢复,HLog记录数据的所有变更,一旦数据修改,就可以从HLog中进行恢复 当数据被写入memstore之前,Regionserver会先将数据写入预写日志,预写日志一般被写入HDFS; 出现节点宕机、线程重启等问题时,memstore中未持久化的数据会丢失,当Regionserver恢复后,会查看当前日志当中的数据,并将记录进行redo,将数据恢复到制定的store中

    • 来自AI的答案:

      原理:

      1. 记录写操作: 在数据写入 HBase 表之前,先将写操作记录到预写日志中。这包括对表的插入、更新、删除等写操作。
      2. 顺序写入: 预写日志以追加(Append)的方式进行写入,而不是随机写入。这意味着写入预写日志是一个高效的顺序写入操作,可以提高写入性能。
      3. 持久化: 预写日志的写入是持久化的,即写入磁盘。这确保了即使系统发生故障,通过恢复预写日志,可以还原出未应用到数据文件的写操作。
      4. 刷写内存缓冲区: 在将写操作记录到预写日志的同时,也将写入到内存缓冲区。这使得读操作可以更快地从内存中获取数据。

      作用:

      1. 数据持久性: 预写日志提供了数据持久性的保证。即使在数据写入 HBase 表之后,如果系统发生故障,预写日志中的写操作可以用来还原数据。
      2. 事务一致性: 预写日志确保写入操作是原子的。即,一旦写操作被记录到预写日志中,要么整个操作成功,要么整个操作失败。这有助于保持数据的一致性。
      3. 快速恢复: 在系统发生故障时,可以通过重放预写日志中的写操作来快速恢复系统。这减少了数据恢复的时间,提高了系统的可用性。
      4. 支持回滚: 如果某个写操作失败或需要回滚,可以通过删除相关的预写日志条目来撤销相应的写操作。这增加了系统的灵活性。
      5. 读写性能优化: 预写日志的顺序写入提高了写入性能,同时在内存中刷写数据,提高了读操作的性能。
  5. RDS NOSQL NEWSQL分别适用场景(见上文)

Untitled

设计题

2020-2021

  1. ER图转Redis存储,数据库结构并对每个表给出至少五个示例数据

在Redis中,我们可以使用Hash类型来表示实体类,使用Set类型来表示一对多关系。以下是描述的实体类和关系在Redis中的存储结构及示例数据:

数据库结构:

##学院信息(Department):
HSET department:Engineering building "Engineering Building" budget 1000000
HSET department:Science building "Science Building" budget 800000
HSET department:Mathematics building "Mathematics Building" budget 600000
HSET department:Physics building "Physics Building" budget 700000
HSET department:Chemistry building "Chemistry Building" budget 750000
##教师信息(Instructor):
HSET instructor:1 name "John" salary 60000
HSET instructor:2 name "Alice" salary 70000
HSET instructor:3 name "David" salary 80000
HSET instructor:4 name "Eva" salary 75000
HSET instructor:5 name "Frank" salary 72000
##学生信息(Student):
HSET student:101 name "Bob" tot_cred 50
HSET student:102 name "Charlie" tot_cred 60
HSET student:103 name "Grace" tot_cred 55
HSET student:104 name "Olivia" tot_cred 58
HSET student:105 name "Sophie" tot_cred 48
##一对多关系 - 学院和教师(dept_inst):
SADD dept_inst:Engineering 1 2
SADD dept_inst:Science 3 4
SADD dept_inst:Mathematics 2 3
SADD dept_inst:Physics 4 5
SADD dept_inst:Chemistry 5 1
##一对多关系 - 学院和学生(dept_stu):
SADD dept_stu:Engineering 101 102
SADD dept_stu:Science 103 104
SADD dept_stu:Mathematics 102 103
SADD dept_stu:Physics 104 105
SADD dept_stu:Chemistry 105 101
#一对多关系 - 教师和学生(advisor):
SADD advisor:1 101
SADD advisor:2 102
SADD advisor:3 103
SADD advisor:4 104
SADD advisor:5 105
  1. NoSQL实现二度好友、三度好友

    选择一种NoSQL数据库较好实现QQ的二度好友、三度好友的检索,写出数据库结构并描述检索二度好友、三度好友的算法思想

    个人偏好neo4j(社交关系图),MongoDB(聚合管道的操作)也有,但是没有图数据库合适,效率低,算法描述有待查证

    假设有A→B(一度好友)→C(二度好友)→D(三度好友)

    1. neo4j设置用户信息集合和好友关系集合,图数据库中标识着用户节点和各用户之间的好友关系

      每个用户文档包含一个数组字段 "friends",其中存储了该用户的好友列表。好友关系集合记录了两个用户之间的好友关系。算法思想:

      1. 二度好友检索算法:

      • 对于用户 A,找到其一度好友列表。
      • 对于每个一度好友 B,找到 B 的一度好友列表。
      • 去重,得到 A 的二度好友列表。

      2. 三度好友检索算法:

      • 对于每个二度好友 C,找到 C 的一度好友列表。
      • 去重,得到 A 的三度好友列表。
    2. MongoDB:

      • **用户信息存储:**每个用户信息以一个文档表示,包含字段如用户名、用户ID等,并在该文档中维护一个数组字段 "friends",用于存储该用户的好友ID列表。
      • **好友关系存储:**好友关系以一个文档表示,包含字段如关系ID、用户1的ID(user1)、用户2的ID(user2)等,表示两个用户之间的好友关系。
      • 二度好友检索:
        • 对于目标用户 A,查询其用户信息文档,获取其好友列表(一度好友)。
        • 遍历每个一度好友 B,查询 B 的用户信息文档,获取 B 的好友列表。
        • 去重,得到用户 A 的二度好友列表。
      • 三度好友检索:
        • 对于每个二度好友 C,查询 C 的用户信息文档,获取 C 的好友列表。
        • 去重,得到用户 A 的三度好友列表。
  2. Neo4j转成Hbase和Mongo

    将下图Neo4j的数据库转换成Hbase和Mongo,写出数据库结构并列出所有图示的示例数据

    下面链接的第三个问题

    下面链接的第三个问题

    山东大学软件学院Nosql(非关系型数据库)往年题目整理与个人解答_山东大学非关系型数据库-CSDN博客

2018-2019

  1. 给出了一个ER图,包含实体,属性以及实体间一对多和多对多的关系,给出mongo的模式。(参考运动员和比赛项目那个题)

Untitled

  1. 采用一个nosql数据库实现QQ空间,包括相册、说说、日志、好友互访记录。给出更新qq空间的算法。

Untitled

Untitled

Untitled

(来自GPT)

  1. 建立索引: 为了支持按时间查询,需要在数据库中建立一个基于发布时间的索引。这可以加速对数据的时间范围查询。
  2. 查询好友列表: 在你的系统中,首先需要获取用户的好友列表。好友列表中包含了用户的好友的用户 ID。
  3. 查询说说: 使用好友列表中的用户 ID,在数据库中执行查询,按时间降序(最新的说说排在前面)获取好友发布的说说。查询条件可以是在一定时间范围内或获取最新的若干条说说。

ppt里给出的这个活动流,应该是取出了每个好友的动态,不是全部放在一个线性队列里,而是每个好友都有一个队列和迭代器,类似归并算法

ppt里给出的这个活动流,应该是取出了每个好友的动态,不是全部放在一个线性队列里,而是每个好友都有一个队列和迭代器,类似归并算法

  1. 给出了一个neo4j的下的图,主要是描述不同的人之间的关系(朋友、同事、爱人、上司等等),给出hbase的关系模式,并把数据转换成hbase的格式。

    Untitled

2017-2018

  1. 将关系型数据库的某几张表分别转换为Redis和HBase数据库存储,写出表结构
  2. 自选数据库,设计一个微信朋友圈,用户可以给自己的朋友点赞和评论。写出当用户刷新时,朋友圈展示内容的算法。

Untitled

Untitled

(来自GPT)刷新朋友圈内容的算法:

  1. 获取用户好友列表: 根据当前用户的用户 ID 查询用户信息表,获取用户的好友列表。
  2. 查询好友的朋友圈动态: 使用好友列表,在朋友圈动态表中执行查询,获取好友们最新发布的朋友圈动态。
db.Posts.find({ "user_id": { "$in": ["friend1_id", "friend2_id", ...] } })
  .sort({ "timestamp": -1 })
  .limit(10);

这个查询会获取好友们最新的 10 条朋友圈动态,按时间降序排序。

  1. 组合动态内容: 将每条动态的内容、点赞信息和评论信息组合在一起,形成朋友圈刷新时展示的内容。
  2. 返回结果给前端: 将组合后的朋友圈内容返回给前端,前端使用这些数据更新朋友圈页面。

注意:

  • 点赞信息存储在 likes 数组中,表示哪些好友给该动态点赞。
  • 评论信息存储在 comments 数组中,每个评论有评论者的用户 ID 和评论的文本。

这个算法是一个基本的示例,实际应用中可能需要考虑到分页加载、缓存策略、用户隐私设置等因素。

  1. 将图存数据库Neo4j(下图)转换为MongoDB存储,要求写出schema和具体的数据内容

Untitled

2021-2022

6.将一个ER图转成MongoDB

7.选用一种非关系型数据库完成朋友圈设计,写出刷新算法

8.Hbase转Redis和Neo4j

posted @ 2024-01-16 01:49  Meowki  阅读(291)  评论(1)    收藏  举报