Я бы смешал эти два.
Для простоты кода и производительности чтения отдельных деталей класса 2-я схема действительно была бы грязной. 1-я схема была бы лучше, но с некоторыми улучшениями.
Держите пути teachers
и students
в корне, как и во 2-й схеме.
Добавьте teacher_enrollments
и student_enrollments
путь в корне, чтобы сохранить идентификаторы классов, с которыми связан каждый учитель / ученик.
Не сохраняйте учителей и учеников классов как массивы внутри классов, а используйте вместо них карты, аналогичные тем, которые высохраняете в корневом каталоге teachers
и students
.
Таким образом, когда вы редактируете учителя из корневого пути, вы также можете получить список всех связанных с ними классов (идентификаторов) изпуть зачисления и выполнить многопутевое обновление для этих классов, чтобы обновить сведения об учителе / ученике в каждом связанном классе.
Если у вас много данных, возможно, вы захотите сохранить отдельный путь для классарезюме, так что вы можете легко показать список классов, не загружая данные для всех включенных учителей и учащихся (которые будут присутствовать несколько раз во всех этих классах).
Когда вы удаляете класс, вы также захотите выполнить многопутевое обновление, чтобы удалить все связанные записи. Если общее количество учеников и учителей не слишком велико, вы можете просто удалить записи для ВСЕХ учителей / учеников. Если у вас много учителей / учеников, вы можете сохранить свой путь classes_enrollments
(но с промежуточными teachers
и students
до идентификаторов), чтобы вы могли обновлять только необходимые идентификаторы учителей / учащихся. (на самом деле это намного проще. У вас уже есть идентификаторы учителя / ученика в информации о классе)
// How to delete a class in JavaScript.
// For Java, use updateChildren() instead of update(),
// and supply it with a HashMap instead of a plain object.
const classToDelete = { id: 'class1', teachers: ..., students: ..., school: ... };
const updateObject = {
['classes/'+classToDelete.id]: null },
['schools/'+classToDelete.school.id+'/classes/'+classToDelete.id]: null },
};
Object.keys(classToDelete.teachers).forEach(teacherId => {
updateObject['teachers/'+teacherId +'/classes/'+classToDelete.id] = null;
});
Object.keys(classToDelete.students).forEach(studentId=> {
updateObject['students/'+studentId+'/classes/'+classToDelete.id] = null;
});
dbRef.update(updateObject);
Пример структуры базы данных (немного отличается от инструктажа, но с использованием тех же понятий):
"schools": {
"school1": {
"id": "school1",
"name": "The best school",
"classes": {
"class1": {
"id": "class1",
"name": "The best class"
}
}
}
},
"classes": {
"class1": {
"id": "class1",
"name": "The best class",
"teachers": {
"teacher1": {
"id": "teacher1",
"name": "The best teacher",
"phone": "123"
}
},
"students": {
"student1": {
"id": "student1",
"name": "The best student",
"phone": "456"
}
},
"school": {
"id": "school1",
"name": "The best school"
}
}
},
"teachers": {
"teacher1": {
"id": "teacher1",
"name": "The best teacher",
"phone": "123",
"classes": {
"class1": {
"name": "The best class",
"school": {
"id": "school1",
"name": "The best school"
}
}
}
}
},
"students": {
"student1": {
"id": "student1",
"name": "The best student",
"phone": "456",
"classes": {
"class1": {
"name": "The best class",
"school": {
"id": "school1",
"name": "The best school"
}
}
}
}
}
Удачи!