雙向關係
以下是使用雙向關係的簡單且最小的大學資料庫的示例
{
"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 的查詢的情況下,反轉資料和建立雙向關係通常是解決方案。
考慮使用上述資料庫的應用程式,該應用程式需要能夠:
- 列表中的某個學生走的是課程和 …
- 列出特定課程中的所有學生
如果資料庫結構是單向的,那麼掃描或查詢上述兩個要求之一會非常慢。在某些情況下,冗餘使得頻繁操作更快,更高效,從長遠來看,這使得複製的成本可以忽略不計。