MST

星途 面试题库

面试题:MongoDB中文档与关系型数据库表结构的差异

请阐述MongoDB中文档的基本概念,并对比它与关系型数据库表结构在数据存储和查询方式上有哪些主要差异?
26.4万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

MongoDB文档基本概念

  1. 文档定义
    • MongoDB中的文档是一组键值对(key - value pairs),类似于JSON对象。它是MongoDB中数据的基本单元,就如同关系型数据库中的行(记录)。例如,一个表示用户的文档可能如下:
    {
        "name": "John Doe",
        "age": 30,
        "email": "johndoe@example.com",
        "address": {
            "street": "123 Main St",
            "city": "Anytown",
            "state": "CA"
        }
    }
    
  2. 文档特点
    • 灵活的数据结构:文档不需要遵循预定义的模式(schema - less),同一集合(相当于关系型数据库中的表)中的文档可以有不同的字段。比如,一个用户集合中,有些文档可能有“phone”字段,有些可能没有。
    • 嵌套结构:文档可以包含其他文档、数组,从而方便地表示复杂的数据关系。如上述例子中“address”字段本身就是一个嵌套文档。

与关系型数据库表结构在数据存储上的差异

  1. 模式定义
    • MongoDB:无模式(schema - less),文档可以随时添加或删除字段,无需预先定义整个结构。例如,在插入新文档时,如果该文档包含集合中其他文档没有的字段,MongoDB会正常存储该文档。
    • 关系型数据库:严格的模式定义,表结构需要预先定义,包括列名、数据类型等。插入数据时必须符合该模式,否则会报错。例如,创建一个“users”表时,需指定“name”为字符串类型、“age”为整数类型等,插入数据时若类型不匹配就无法成功插入。
  2. 数据存储格式
    • MongoDB:以BSON(Binary JSON)格式存储文档,这种格式是二进制编码的,更适合在网络上传输和存储,同时保留了JSON的灵活性。
    • 关系型数据库:以行和列的形式存储数据,不同列的数据类型不同,存储格式通常是数据库特定的二进制格式,用于高效的存储和检索。例如,MySQL会根据列的数据类型(如整数、字符串等)以不同方式存储数据。
  3. 数据关系表示
    • MongoDB:通过嵌套文档和数组来表示关系。例如,一个订单文档可以嵌套多个商品文档来表示订单包含的商品信息。如果要表示一对多关系,也可以在父文档中使用数组存储子文档的引用。
    • 关系型数据库:通过外键(Foreign Key)来建立表与表之间的关系。例如,“orders”表和“products”表通过外键关联,“orders”表中的某一行记录通过外键指向“products”表中的特定行,以此表示订单与商品的关系。

与关系型数据库表结构在查询方式上的差异

  1. 查询语言
    • MongoDB:使用MongoDB查询语言(基于JSON - like语法)。例如,要查询年龄大于30岁的用户:
    db.users.find({ "age": { "$gt": 30 } })
    
    • 关系型数据库:使用SQL(Structured Query Language)。例如,同样查询年龄大于30岁的用户:
    SELECT * FROM users WHERE age > 30;
    
  2. 查询灵活性
    • MongoDB:由于其无模式特点,查询可以很灵活,能够轻松查询嵌套文档和数组中的数据。例如,查询地址在“CA”州的用户:
    db.users.find({ "address.state": "CA" })
    
    • 关系型数据库:查询需要遵循预定义的表结构。对于复杂嵌套数据的查询相对复杂,通常需要使用连接(JOIN)操作,而且对未预定义的结构查询支持有限。例如,要查询类似MongoDB中嵌套文档结构的数据,可能需要使用多个表连接以及复杂的子查询。
  3. 索引使用
    • MongoDB:支持多种类型的索引,如单字段索引、复合索引、地理空间索引等。索引创建和使用方式与关系型数据库有所不同,其索引是基于文档的键。例如,为“users”集合的“email”字段创建索引:
    db.users.createIndex({ "email": 1 })
    
    • 关系型数据库:也支持多种索引类型,如普通索引、唯一索引、主键索引等。索引基于列定义,例如在MySQL中为“users”表的“email”列创建索引:
    CREATE INDEX email_index ON users (email);