Android - 数据库结构(Firebase)

时间:2017-10-31 12:13:30

标签: android firebase firebase-realtime-database

我有一个应用程序,我有三种使用类型:"学校","年龄较大的学生"和"年幼的孩子"。学校在地图上制作不同的路线,并指定年龄较大的学生负责该路线。学校还在路线上放置了多个站点。这些站点是年龄较大的学生接收年幼孩子的地方。

在我的应用程序中,school usertype能够在地图上设置两个标记,并在两个标记之间绘制路径(路径)。我想保存两个标记的LatLng,因为它们表示路径的开始和结束。我还想保存两个标记的地址。我使用地理编码器来获取路线的地址。

学校一次只能添加一个标记(停止)。放置标记时,提示用户输入标记的地址以及较大的学生应该接收较小的孩子的时间。我想保存LatLng,标记的地址和输入的时间。

学校应该能够看到在列表视图中创建的路线,其中显示了起始地址,结束地址,停止地址和时间。点击列表视图中的路线时,应显示所有年龄较大的学生的列表,学校可以指定年龄较大的学生负责路线。

年龄较大的学生可以看到他们被分配到的路线和站点。

年幼的孩子应该只能看到停止。通过点击地图上的标记,他们表示他们想要在那个站点接听。

截至目前,我的firebase数据库的结构是:

School Name
   users
     userID
       username 
       usertype
   markers
     uniqueID
       latitude
       longitude
       address
       time
   routes
     uniqueID
        startAddress
        endAddress
        locations
           0
             latitude
             longitude
           1
             latitude
             longitude

位置节点是路线的航点点阵列。这种结构使我很难满足我的要求。有没有更好的数据库结构的想法?

public class Route {

private ArrayList<MapFragment.Location> locations;

private String startDestination;
private String endDestination;
HashMap<String, Boolean> markerId;


public Route() {
}

public Route(ArrayList<MapFragment.Location> locations, String startDestination, String endDestination, HashMap<String, Boolean> markerId) {
    this.locations = locations;
    this.startDestination = startDestination;
    this.endDestination = endDestination;
    this.markerId = markerId;
}

public String getStartDestination() {
    return startDestination;
}

public void setStartDestination(String startDestination) {
    this.startDestination = startDestination;
}

public String getEndDestination() {
    return endDestination;
}

public void setEndDestination(String endDestination) {
    this.endDestination = endDestination;
}


public ArrayList<MapFragment.Location> getLocations() {
    return locations;
}

public void setLocations(ArrayList<MapFragment.Location> locations) {
    this.locations = locations;
}


}

enter image description here

1 个答案:

答案 0 :(得分:1)

听起来这些对象之间的关系可以概括为:

众所周知,Firebase实时数据库是一个NoSQL数据库,因此不会明确支持关系,但可以在结构中推断出它们,所以以此结构为例(其中...是您现有的值):

schoolId
  users
    userId
      ...
  markers
    markerId
      ...
      route      // the route ID that this marker belongs to
  routes
    routeId
      ...
      markers    // list of marker IDs that belong to this route
  

注意:为了简化此示例,我暂时忽略users关系,只使用markersroutes之间的关系。

通过这种结构:我们目前是使用标记还是路线,我们可以很容易地找出它们之间的关系。

然后很容易通过performing a query将所有与特定路线相关的标记与标记节点中子项的route值相关联:

schoolReference.child("markers").orderByChild("route").equalTo(routeId);

其中routeId是我们当前正在使用的路线的唯一ID。

在创建对象时,您需要了解一些更改,例如,当您使用此结构创建标记时,您需要:

  • 将标记的route值设置为其所属路径的ID,
  • 将标记ID添加到其所属路径下的markers列表中。

您可以使用transactionmulti-location update在一次写入操作中实现此目的。

  

注意:您实际上不必使用routeId/markers列表,但如果您使用的是FirebaseUI to display indexed data,则此功能非常有用。

这种使用ID作为索引键的技术称为数据扇出,你可以在structure your database documentation中阅读更多相关信息。