双向关系

以下是使用双向关系的简单且最小的大学数据库的示例

{
  "students": {
    "-SL3Cs0KFvDMQLIYZEzv": {
      "name": "Godric Gryffindor",
      "id": "900130309",
      "courses": {
         "potions": true,
         "charms": true,
         "transfiguration": true, 
      }
    },
    "-SL3ws2KvZQLTYMqzSas": {          
      "name": "Salazar Slytherin",
      "id": "900132319",
      "courses": {
         "potions": true,
         "herbs": true,
         "muggleStudies": true, 
      }
    },
    "-SL3ns2OtARSTUMywqWt": { ... },
    // More students here
  },

  "courses": {
    "potions": {
      "code": "CHEM305",
      "enrolledStudents": {
        "-SL3Cs0KFvDMQLIYZEzv": true,     // Godric Gryffindor
        "-SL3ws2KvZQLTYMqzSas": true,     // Salazar Slytherin
        // More students
      }
    },
    "muggleStuddies": {
      "code": "SOC215",
      "enrolledStudents": {
        "-SL3ws2KvZQLTYMqzSas": true,     // Salazar Slytherin
        "-SL3ns2OtARSTUMywqWt": true,     // Some other student
        // More students
      }
    },
    // More courses
  }
}

请注意,每个学生都有一个课程列表,每个课程都有一个注册学生列表。

冗余并不总是一种糟糕的方法。确实,在删除或编辑重复节点时,它会占用存储空间并且必须处理多个条目的更新; 但是,在某些不经常更新数据的情况下,具有双向关系可以显着简化获取/写入过程。

在大多数需要类似 SQL 的查询的情况下,反转数据和创建双向关系通常是解决方案。

考虑使用上述数据库的应用程序,该应用程序需要能够:

  1. 列表中的某个学生走的是课程
  2. 列出特定课程中的所有学生

如果数据库结构是单向的,那么扫描或查询上述两个要求之一会非常慢。在某些情况下,冗余使得频繁操作更快,更高效,从长远来看,这使得复制的成本可以忽略不计。