双向关系
以下是使用双向关系的简单且最小的大学数据库的示例
{
"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 的查询的情况下,反转数据和创建双向关系通常是解决方案。
考虑使用上述数据库的应用程序,该应用程序需要能够:
- 列表中的某个学生走的是课程和 …
- 列出特定课程中的所有学生
如果数据库结构是单向的,那么扫描或查询上述两个要求之一会非常慢。在某些情况下,冗余使得频繁操作更快,更高效,从长远来看,这使得复制的成本可以忽略不计。