后端开发面试题5(附答案)

 前言

        在下首语言是golang,所以会用他作为示例。

原文参见 @arialdomartini的: Back-End Developer Interview Questions

数据库相关问题

1. 如果要你将一个项目从MySQL迁移至PostgreSQL中,你会如何迁移?

        迁移一个项目从MySQL到PostgreSQL涉及多个步骤,主要包括数据备份、数据库结构调整、数据迁移、应用代码适配以及验证。以下是详细的迁移步骤:

  1. 备份原MySQL数据库

    • 使用mysqldump工具导出MySQL数据库的结构和数据:
      mysqldump -h [host] -u [username] -p [password] [database_name] > mysql_backup.sql
  2. 安装并配置PostgreSQL

    • 在目标服务器上安装PostgreSQL数据库管理系统。
    • 创建一个新的数据库,用于存放迁移过来的数据。
  3. 调整数据库结构

    • 分析并调整MySQL SQL脚本以适应PostgreSQL的SQL方言和数据类型。
    • MySQL的某些特性和数据类型在PostgreSQL中可能有不同的实现,比如auto_increment、timestamp处理、enum类型等。
    • 使用pgloader、 ora2pg 或者手工编辑SQL脚本来转换MySQL特有的语法。
  4. 数据迁移

    • 使用转换工具进行数据迁移,例如pgloader可以直接从MySQL dump文件加载到PostgreSQL中:
      pgloader mysql://source_user:source_password@source_host/source_db postgresql://target_user:target_password@target_host/target_db
      或者,如果需要手动处理,可以将调整后的MySQL备份文件导入到PostgreSQL中:
      psql -U target_user -d target_db -f mysql_backup_converted_to_pg.sql
  5. 应用代码适配

    • 修改应用程序连接池配置,使其指向新的PostgreSQL数据库。
    • 如果应用代码中直接嵌入了MySQL特定的SQL查询,需审查并修改这些查询以适应PostgreSQL的SQL语法和特性。
  6. 验证数据和功能

    • 迁移完成后,务必进行全面的数据验证,确保数据完整性和正确性。
    • 运行应用程序的测试套件,确保所有功能在新的数据库环境下也能正常工作。
  7. 性能调优

    • 根据PostgreSQL的最佳实践,对数据库索引、查询性能、存储过程等进行优化。

        在整个迁移过程中,确保有详细的迁移计划和备份措施,以防万一出现问题可以回滚到迁移前的状态。同时,对于大规模的生产环境迁移,建议在非高峰期进行,并在正式迁移前在测试环境中反复演练和验证迁移过程。

2. 为什么SELECT * FROM table WHERE field = null不能匹配空的字段?

在SQL中,WHERE field = NULL这样的条件表达式并不能正确匹配数据库表中field字段为空值(NULL)的记录。这是因为NULL不是一个具体的值,它代表未知或缺失的数据。在SQL逻辑中,任何与NULL的比较都不会返回真(TRUE),包括等于和不等于的比较。

正确的检查字段是否为NULL的方法是使用IS NULLIS NOT NULL操作符:

SELECT * FROM table WHERE field IS NULL;

这条SQL语句将正确地选择出table表中field字段值为空的记录。

3. 什么是ACID(原子性,一致性,隔离性,持久性)原则?

        ACID是数据库管理系统中用于确保数据事务处理可靠性的一组基本原则,这四个字母代表了四个关键特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。下面是对每个特性的简要说明:

  1. 原子性(Atomicity): 原子性确保数据库事务是一个不可分割的工作单元。事务中的所有操作要么全部成功执行,要么全部不执行。如果事务中的任何一部分操作失败,那么整个事务都会被回滚,使数据库状态回到事务开始前的状态。这样可以防止数据库处于部分更新的不一致状态。

  2. 一致性(Consistency): 一致性指的是事务执行前后,数据库从一种有效状态转换到另一种有效状态。即事务必须遵循所有预定义的规则,包括验证、商业逻辑约束等,确保数据的完整性不受损害。

  3. 隔离性(Isolation): 隔离性要求并发执行的事务之间互不干扰。每个事务都感觉像是在单独、序列化地执行,这样可以防止脏读、不可重复读和幻读等问题。数据库系统通过多种隔离级别来实现这一特性,如读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。

  4. 持久性(Durability): 持久性意味着一旦事务被提交,其效果就会永久保存在数据库中,即使发生系统故障(如断电、崩溃)也不会丢失。通常通过将事务日志写入非易失性存储来保证这一点,确保事务的结果不会因为后续的故障而撤销。

        这四个原则共同构成了数据库事务管理的基础,确保了数据的准确性和可靠性,即便在复杂的系统操作和异常情况下也能维持数据的一致性和完整性。

4. 你是如何进行数据库模式(Database schema)迁移的?

        数据库模式迁移是一个系统化的过程,用于将数据库从一个结构迁移到另一个结构,通常涉及更改表结构、添加或删除字段、修改数据类型、创建新的表或视图、更新约束等。以下是进行数据库模式迁移的一般步骤:

  1. 备份当前数据库: 在进行任何更改之前,首先要做的就是备份现有的数据库,以防迁移过程中出现任何问题时可以恢复到初始状态。

  2. 设计新数据库模式: 设计和文档化新的数据库模式,明确哪些表需要新增、修改或删除。这可能涉及ER图(实体关系图)或DDL(数据定义语言)脚本。

  3. 创建DDL脚本: 根据新的设计,编写DDL脚本以执行所需的更改。这包括:

    • 添加新的表或视图
    • 修改现有表的结构(添加、删除或修改字段,更改索引,修改约束等)
    • 更新数据(如数据类型转换或填充新的字段)
    • 删除不再需要的表或字段
  4. 执行迁移脚本

    • 在开发环境中首先执行迁移脚本,确保脚本按预期工作,不会导致数据丢失或不一致。
    • 在生产环境中,在维护窗口期执行迁移脚本,注意尽量减少对在线服务的影响。
  5. 数据迁移和转换: 如果迁移涉及到数据的迁移或转换,可能需要编写额外的脚本来迁移数据或转换数据格式。

  6. 验证迁移结果

    • 迁移完成后,验证新的数据库模式和数据是否符合预期设计。
    • 运行适当的测试案例以确保应用程序在新数据库结构上正常工作。
  7. 回滚计划: 在整个迁移过程中准备一个回滚计划,以便在遇到问题时能够恢复到迁移前的状态。

  8. 应用更新: 如果有必要,更新应用程序以适应新的数据库模式。

  9. 监控和优化: 迁移后密切关注新数据库的性能,必要时进行优化调整。

例如,在MySQL中,迁移过程可能涉及执行一系列的ALTER TABLECREATE TABLEDROP TABLE等SQL命令。在PostgreSQL中也同样通过对应的DDL命令进行操作。对于更复杂的迁移,可能需要用到数据库迁移工具(如Flyway、Liquibase等),这些工具可以协助管理数据库版本控制和迁移过程。

5. 延迟加载(lazy loading)是如何实现的?什么场景下有用?他有什么缺陷?

        延迟加载(Lazy Loading)是一种优化技术,用于在真正需要数据时才加载数据,而不是在一开始就把所有相关数据全部加载到内存中。实现延迟加载通常有两种方式:

  1. 编程实现: 在编程中,延迟加载可以通过闭包或者其他代理对象实现。例如,在一个对象初始化时,并不立即加载所有的属性或关联数据,而是在第一次访问这些属性或关联数据时才去执行加载操作。例如,在Java中,可以通过实现java.util.concurrent.Callable或使用Future来实现延迟加载;在C#中,可以使用Lazy<T>类型;在JavaScript中,可以通过闭包实现。

  2. 框架支持: 许多ORM(对象关系映射)框架,如Hibernate、Entity Framework、MyBatis等,都支持延迟加载(也叫懒加载)。在这些框架中,当一个对象的关联属性被访问时,框架才会执行SQL查询来获取关联对象的内容。

延迟加载适用的场景:

  • 当数据集很大,一次性加载所有数据会导致内存溢出或者性能瓶颈时;
  • 当部分数据并不一定会被立即使用,或者只有在用户交互时才需要时,如web页面滚动时加载更多内容(无限滚动);
  • 提升系统的响应速

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/852418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页元素解析元素标签和style变更

前言 如何解析html标签&#xff1f; 如何给标签增加样式&#xff1f; <div class"related-tags"><span>相关主题推荐&#xff1a;</span>a<a hrefhttp://www.csdn.net/tag/标签 target"_blank">标签</a><a href"h…

【STM32】输入捕获应用-测量脉宽或者频率(方法1)

图1 脉宽/频率测量示意图 1 测量频率 当捕获通道TIx 上出现上升沿时&#xff0c;发生第一次捕获&#xff0c;计数器CNT 的值会被锁存到捕获寄存器CCR中&#xff0c;而且还会进入捕获中断&#xff0c;在中断服务程序中记录一次捕获&#xff08;可以用一个标志变量来记录&#…

CC攻击的有效应对方案

随着互联网的发展&#xff0c;网络安全问题愈发突出。CC攻击&#xff08;Challenge Collapsar Attack&#xff09;&#xff0c;一种针对Web应用程序的分布式拒绝服务&#xff08;DDoS&#xff09;攻击方式&#xff0c;已经成为许多网络管理员和网站拥有者不得不面对的重大挑战。…

跨越式发展:中小型企业如何争取水库枢纽乙级资质

1. 明确目标&#xff0c;深入了解资质要求 首先&#xff0c;全面研究水利行业乙级设计资质的具体标准&#xff0c;包括企业规模、人员构成、技术能力、财务状况、管理体系等&#xff0c;确保每项要求都能精准对应并准备充分。 2. 强化内部管理与体系建设 建立或优化组织架构…

Fantasy Icons Megapack(梦幻盔甲宝石图标魔法道具图标集)

所有图标都具备高质量&#xff0c;并以专业水平实施。任何幻想风格游戏的上佳选择。 - 可更新的超级资源包&#xff1b; - 每个图标的大小均为 256x256 像素 (PNG)&#xff1b; - 总计 2672 个独一无二的图标&#xff1b; - 所有图标均具有透明背景。 超级资源包内置&#xff1…

Redisson原理解析

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

如何通过“小猪APP分发”轻松实现应用分发

你是否也在为应用分发发愁&#xff1f; 还记得那些日子吗&#xff1f;你花费了大量的时间和精力开发了一款出色的应用&#xff0c;但却在分发和推广环节遇到了瓶颈。是的&#xff0c;无论你的应用多么优秀&#xff0c;如果不能顺利分发给用户&#xff0c;那一切都是徒劳的。别…

[c++刷题]贪心算法.N01

题目如上: 首先通过经验分析&#xff0c;要用最少的减半次数&#xff0c;使得数组总和减少至一半以上&#xff0c;那么第一反应就是每次都挑数组中最大的数据去减半&#xff0c;这样可以是每次数组总和值减少程度最大化。 代码思路:利用大根堆去找数据中的最大值&#xff0c;…

[数据集][实例分割]减速带分割数据集json+yolo格式5400张1类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件以及对应yolo格式txt) 图片数量(jpg文件个数)&#xff1a;5400 标注数量(json文件个数)&#xff1a;5400 标注数量(txt文件个数)&#xff1a;5400 标注类别数&#xff1a;1 标注…

深入理解 Spring 事务的钩子函数

目录 引言Spring 事务概述 2.1 事务的基本概念2.2 Spring 事务管理简介 事务钩子函数简介 3.1 什么是事务钩子函数3.2 事务钩子函数的作用 Spring 事务钩子函数的实现 4.1 PlatformTransactionManager 接口4.2 TransactionSynchronization 接口4.3 TransactionSynchronization…

体验版小程序访问不到后端接口请求失败问题解决方案

文章目录 解决方案一&#xff1a;配置合法域名解决方案二&#xff1a;开发调试模式第一步&#xff1a;进入开发调试模式第二步&#xff1a;启用开发调试 注意事项结语 &#x1f389;欢迎来到Java面试技巧专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&…

实战篇:用户管理模块开发

实战篇&#xff1a;用户管理模块开发 用户管理模块简介 用户管理模块是大多数Web应用的核心组件之一&#xff0c;它负责处理用户的注册、登录、信息展示、编辑和删除等操作。 项目结构 假设你已经根据之前讨论的结构组织了你的Flask项目。 第1步&#xff1a;定义用户模型 …

牛客链表刷题(一)

目录 题目一&#xff1a;反转链表 代码&#xff1a; 题目二&#xff1a;链表内指定区间反转 代码&#xff1a; 题目一&#xff1a;反转链表 代码&#xff1a; import java.util.*;/** public class ListNode {* int val;* ListNode next null;* public ListNode(int …

2024 年最新 Python 使用 gewe 框架搭建微信机器人实现语音智能回复(详细教程)

Gewe 个微框架 GeWe&#xff08;个微框架&#xff09;是一个创新性的软件开发框架&#xff0c;专注于IPAD协议&#xff0c;为个人微信号以及企业信息安全提供了强大的功能和保障。GeWe的设计旨在简化开发过程&#xff0c;使开发者能够高效、灵活地构建和定制通信协议&#xff…

unity基础(五)地形详解

目录 一 创建地形 二 调整地形大小 三 创建相邻地形 四 创建山峰 五 创建树木 七 添加风 八 添加水 简介: Unity 中的基础地形是构建虚拟场景的重要元素之一。 它提供了一种直观且灵活的方式来创建各种地形地貌&#xff0c;如山脉、平原、山谷等。 通过 Unity 的地形…

Spring源码学习-Resource

Spring的Resource接口为资源访问提供了统一的接口&#xff0c;不同的实现类实现了从不同上下文获取资源。下面是该接口的方法: public interface Resource extends InputStreamSource {/*** Determine whether this resource actually exists in physical form.* <p>Thi…

力扣384. 打乱数组

Problem: 384. 打乱数组 文章目录 题目描述思路复杂度Code 题目描述 思路 打乱数组的主要算法&#xff1a; 从1 - n每次生成[i ~ n - i]的一个随机数字&#xff0c;再将原数组下标位置为i的元素和该随机数字位置的元素交换 复杂度 打乱数组的主要算法 时间复杂度: O ( n ) O(…

【Attack】拓扑缺陷图注入攻击

TDGIA: 图神经网络的有效注入攻击 图注入攻击下 GNN 的脆弱性TDGIA框架拓扑缺陷边选择平滑的对抗优化整体攻击流程 KDD’21 &#x1f604; 图注入攻击&#xff1a;攻击者无法修改输入图的现有link结构和节点属性&#xff0c;而是通过向其中注入对抗性节点来执行攻击。 图注入…

Linux操作系统学习路线

本文来自Qwen2大模型&#xff1a; Linux操作系统的全面学习是一个渐进的过程&#xff0c;涵盖从基础知识到高级特性的多个阶段。以下是一份详细的Linux操作系统学习路线图&#xff0c;包括各个阶段的学习目标、建议的学习资源和实践步骤。 1. Linux 基础知识与安装 学习目标&a…

vite构建的ts项目配置src别名@

一、安装types/node npm install types/node 二、vite.config.ts 文件中配置以下内容 resolve: {alias: {: path.resolve(__dirname, ./src),},}, 三、 tsconfig.json 文件中compilerOptions下配置以下内容 /* 配置 */"baseUrl": ".","paths":…