Сохранение подклассов в базе данных firebase в реальном времени

#java #android #firebase #firebase-realtime-database

# #java #Android #firebase #firebase-realtime-database

Вопрос:

У меня следующая структура классов.

 class User{
    String name;
    Thing things[];
}

interface Thing{

}

class ThingA implements Thing{
    String something;
}

class ThingB implements Thing{
    String anotherthing;
}
 

Каков наилучший способ сохранения User объектов в firebase?

То, что я сейчас делаю, похоже;

 {
    "users": {
        "name": "My Name",
        "thingAs": [{
            "something": "value",
        }],
        "thingBs": [{
            "anotherthing": "value",
        }]
    }
}
 

Я не могу придумать другого способа сделать это. Есть ли у вас лучшие решения?

Спасибо!!

Ответ №1:

Главное, что вам нужен маркер в базе данных, который указывает тип каждой вещи. В вашей модели данных вы смоделировали этот маркер как ключ узла, под которым вы храните вещи этого типа.

Альтернативной моделью было бы сохранение маркера типа для каждого элемента отдельно. Итак:

 "userA": {
    "name": "My Name",
    "things": [{
        "type": "ThingA",
        "something": "value",
    }, {
        "type": "ThingB",
        "anotherthing": "value",
    }]
}
 

Обе модели могут работать, и обе модели имеют преимущества и недостатки. Некоторые из них, о которых я могу быстро подумать:

  • Ваша модель сохраняет маркер типа только один раз, в то время как альтернативная модель, которую я предлагаю, сохраняет его для каждого элемента.
  • Моя альтернативная модель может поддерживать порядок элементов независимо от их типа, в то время как ваша модель может поддерживать порядок только в пределах того же типа.

Здесь нет единственной правильной модели. Как обычно при моделировании данных NoSQL, все зависит от вариантов использования вашего приложения. Например: если порядок элементов не важен для вашего приложения, то модель в вашем вопросе может сэкономить вам некоторое пространство для хранения базы данных.