Как получить полные данные от многих к многим отношениям в Firebase DB Android? - PullRequest
1 голос
/ 17 октября 2019

У меня есть класс, который является частью школы, и в этом классе есть учителя и ученики, у каждого из них есть имя и, возможно, номер телефона, я хочу получить полные данные для уроков, но, во-первых, не могли бы вы посоветовать мне,что лучше для производительности и обслуживания из следующих БД:

1-й

 "schools":{
   "school1":{
     "class1":{
       "name":"SC1",
       "teachers":[{
         "name":"T1"
       }, {
         "name":"T2"
       }],
       "students":[
         {"name":"S1"},
         {"name":"S2"}
         ]
     }
   }
.
.
.
.
.
.
.

 }

и 2-й

  "school":{
    "school1":{
      "name":"SC1"
    },
    "school2":{
      "name":"SC2"
    }
  },
  "classes": {
    "class1": {
      "name": "C1"
    },
    "class2": {
      "name": "C2"
    }
  },
  "students": {
    "student1": {
      "name": "S1",
      "phone":"123456789"
    },
    "student2": {
      "name": "S2",
      "phone":"123456789"
    },
    "student3": {
      "name": "S3",
      "phone":"123456789"
    },
    "student4": {
      "name": "S4",
      "phone":"123456789"
    }
  },
  "teachers": {
    "student1": {
      "name": "T1",
      "phone":"123456789"
    },
    "student2": {
      "name": "T2",
      "phone":"123456789"
    },
    "student3": {
      "name": "T3",
      "phone":"123456789"
    },
    "student4": {
      "name": "T4",
      "phone":"123456789"
    }
  },
  "classes_enrollments": {
    "class1": {
      "teacher1": true,
      "teacher3": true,
      "student1": true,
      "student2": true
    },
    "class2": {
      "teacher2": true,
      "teacher4": true,
      "student3": true,
      "student4": true
    },
    "class3": {
      "teacher1": true,
      "teacher2": true,
      "student3": true,
      "student4": true,
      "student1": true,
      "student2": true
    }
  },
  "student_friends": {
    "student1": {
      "student2": true
    },
    "students2": {
      "student1": true,
      "student3": true
    },
    "students3": {
      "student2": true
    }
  },
  "teacher_friends": {
    "teacher1": {
      "teacher2": true
    },
    "teacher2": {
      "teacher1": true,
      "teacher3": true
    },
    "teacher3": {
      "teacher2": true
    }
  }

и для 2-го способа, как получитьполные данные для класса1: в какой школе и ее имени и количестве учителей и учеников и их имен и телефонов

Спасибо

1 Ответ

1 голос
/ 18 октября 2019

Я бы смешал эти два.

Для простоты кода и производительности чтения отдельных деталей класса 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"
                }
            }
        }
    }
}

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...