警告:我的查询会更理论化(抱歉程序员,请耐心等待我)。我试图了解如何定义在Firebase中使用的数据库结构。
我正在探索使用Firebase作为我正在尝试构建的评论应用(在Android中)的后端。
该应用程序提供产品详细信息和各种产品的审查。所以这是一个用例示例。
Root | +--Smartphone | +--Manufacturer Name +--Screen Size +--Screen Density +--Processor +--RAM,...
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,...
但是,所有产品评论都将显示在一个活动/片段中。因此,每种产品类型都不会有不同的活动/片段。有人能为我提供在我的用例中使用扁平化数据结构的清晰图片吗?
此致
答案 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
}
}
现在,您应该能够检索每个用户的所有评论,并检索每个产品的所有评论。
如果您有疑问,请在此处发表评论,希望这有助于:)