为Firebase

时间:2016-08-29 12:44:44

标签: android firebase firebase-realtime-database

警告:我的查询会更理论化(抱歉程序员,请耐心等待我)。我试图了解如何定义在Firebase中使用的数据库结构。

我正在探索使用Firebase作为我正在尝试构建的评论应用(在Android中)的后端。

该应用程序提供产品详细信息和各种产品的审查。所以这是一个用例示例。

  1. 应用程序中显示的产品属于同一类型(例如智能手机)。在此用例中,定义数据库结构更容易。对于每部手机,我只需将手机规格保存到Firebase并将其检索到我的应用中。
  2. Root
     |
     +--Smartphone
         |
         +--Manufacturer Name
         +--Screen Size
         +--Screen Density
         +--Processor
         +--RAM,...
    
    1. 应用程序中显示的产品属于不同类型(例如智能手机,汽车,书籍......)。在此用例中,定义数据库结构变得复杂。我可以简单地定义数据结构,如
    2. Root
       |
       +--Product
           |
           +--Manufacturer Name
           +--Screen Size
           +--Screen Density
           +--Processor
           +--RAM
           +--Fuel type (Petrol/Diesel/Electric)
           +--Vehicle Type (Sedan/Hatchback)
           +--Vehicle Price,...
      

      然而,上述数据结构存在的问题是,当我尝试对智能手机进行产品评估时,与Car相关的数据将保持空白。对于汽车的产品评审也是如此。

      使用展平数据结构可以解决此问题。这是我感到困惑的地方。

      Root
       |
       +--Smartphone
       |   |
       |   +--Manufacturer Name
       |   +--Screen Size
       |   +--Screen Density
       |   +--Processor
       |   +--RAM
       |
       +--Car
           |
           +--Fuel type (Petrol/Diesel/Electric)
           +--Vehicle Type (Sedan/Hatchback)
           +--Vehicle Price,...
      

      但是,所有产品评论都将显示在一个活动/片段中。因此,每种产品类型都不会有不同的活动/片段。有人能为我提供在我的用例中使用扁平化数据结构的清晰图片吗?

      此致

2 个答案:

答案 0 :(得分:5)

您可以像这样构建数据库:

products: {
    smartphones: {
        smartphone1: {
            name: "Best Phone",
            ram: "6 GB",
            screen: "5.5 inch"
            reviews: {
                review1: true,
                review2: true
            }
        }
    },
    cars: {
        car1: {
            name: "Lightning"
            reviews: {
                review3: true,
                review4: true,
                review5: true
            }
        }
    }
},
product-review: {
    review1: {
        submittedBy: "Conqueror",
        message: "Best phone at this price",
        timestamp: 1472405901
    },
    review2: {
        submittedBy: "Magic Blaster",
        message: "Pros: RAM, Cons: Everything else.",
        timestamp: 1472405901
    },
    review3: {
       submittedBy: "Boss",
       message: "Excellent Car",
       timestamp: 1472405901
    },
    ...
}

每个产品(smartphone1,car1等..)都包含一个评论节点,因此您可以轻松加载特定产品的链接评论。

您可以为所需的节点生成时间戳。您可以将它添加到smartphone1,car1等..但它不是必需的。但是用户的评论需要时间戳,因为您应该在用户发布评论时显示。

查看this answer以了解如何生成时间戳并将时间戳转换回可显示的日期:

DateFormat sdf = new SimpleDateFormat("MM-dd-yyyy hh:mm:ss a");
Date someDate = (new Date(timestamp));
return sdf.format(someDate);

您可以将用户评论存储在各自的节点中。

users: {
    abcdefghijklm: { // User UID
        name: "Conqueror",
        reviews: {
            review1: smartphone1,
            review7: car1
        }
    },
    nopqrstuvwxyz: {
        name: "Magic Blaster",
        reviews: {
            review2: smartphone1
        }
    }
}

要获取特定用户的评论,您可以获取用户的uid并使用它来显示评论。不幸的是,我从来没有在Android上使用Firebase,在Javascript中,我会这样做:

firebase.database().ref('users/'+userUID+'/reviews').on('value', function(snapshot) {
    firebase.database().ref('product-review/'+snapshot.key).on('value', function(reviewSnapshot) {
        console.log(reviewSnapshot.val().message);
    });
});

如果您只想查看用户“征服者”的评论,请将userUID设置为其唯一ID。 Here是Firebase for Android从数据库中检索数据的官方文档。

答案 1 :(得分:1)

这是我能想到的最扁平的数据库结构。对于products节点,您还可以在问题中使用第三个结构,它只会影响有关如何在应用中映射项目的逻辑。

products: {
    item1: {
        type: "smartphone",
        manufacturer_name: "some value",
        screen_size: "some value",
        screen_density: "some value",
        processor: "some value",
        ram: "some value"
    },
    item2: {
        type: "car",
        fuel_type: "some value",
        vehicle_type: "some value",
        vehicle_price: "some value"
    }
},
users: {
    user1: {
        name: "some value",
        email: "some value"
    },
    user2: {
        name: "some value",
        email: "some value"
    },
},
products_reviews: {
    item1: {
        user1: ewview1,
        user2: review2
    },
    item2: {
        user2: review3
    }
},
users_reviews: {
    user1: {
        item1: review1
    },
    user2: {
        item1: review2,
        item2: review3
    }
},
reviews: {
    review1: {
        text: "this is my review",
        timestamp: 1472488486000
    },
    review2: {
        text: "this is my review",
        timestamp: 1472488486000
    },
    review3: {
        text: "this is my review",
        timestamp: 1472488486000
    }
}

现在,您应该能够检索每个用户的所有评论,并检索每个产品的所有评论。

如果您有疑问,请在此处发表评论,希望这有助于:)