• 后端开发面试题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类型;在JavaScript中,可以通过闭包实现。

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

    延迟加载适用的场景:

    • 当数据集很大,一次性加载所有数据会导致内存溢出或者性能瓶颈时;
    • 当部分数据并不一定会被立即使用,或者只有在用户交互时才需要时,如web页面滚动时加载更多内容(无限滚动);
    • 提升系统的响应速
  • 相关阅读:
    mac安装mysql教程(docker版本)(sql 小虚竹)
    随手笔记(四十五)——idea git冲突
    CSDN积分获取攻略:快速积累积分的小技巧
    鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    缺陷的数据,不能证明测试工作做得好
    BigInteger.toString方法生成md5字符串,会删除开头0
    el-tabs(标签栏)的入门学习
    云计算——虚拟化技术Docker网络管理及数据存储
    Spring之aop
    关于丢失msvcp71.dll的5个解决办法,msvcp71.dll丢失原因分析
  • 原文地址:https://blog.csdn.net/qq_28080747/article/details/138443136