在Firebase实时数据库中保存子类

时间:2019-04-18 13:39:04

标签: 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;
}

在Firebase中保存User对象的最佳方法是什么?

我目前正在做的事情是这样的

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

我想不出另一种方法。您有更好的解决方案吗?

谢谢!!

1 个答案:

答案 0 :(得分:1)

最主要的是,您需要在数据库中使用一个标记来指示每个事物的类型。在数据模型中,已将该标记建模为存储该类型的对象的节点的键。

另一种模型是分别为每个项目存储类型标记。所以:

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

两个模型都可以工作,并且两个模型都有优点和缺点。我很快就能想到的其中一些:

  • 您的模型只保存一次类型标记,而我建议的替代模型为每个项目保存一次。
  • 我的替代模型可以维持项目的顺序,而不管它们的类型如何,而您的模型只能维持相同类型内的顺序。

这里没有奇异的正确模型。与NoSQL数据建模一样,这一切都取决于应用程序的用例。例如:如果项目的顺序对您的应用不重要,那么问题中的模型可以为您节省一些数据库存储空间。