雙向關係

以下是使用雙向關係的簡單且最小的大學資料庫的示例

{
  "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. 列出特定課程中的所有學生

如果資料庫結構是單向的,那麼掃描或查詢上述兩個要求之一會非常慢。在某些情況下,冗餘使得頻繁操作更快,更高效,從長遠來看,這使得複製的成本可以忽略不計。