设计Firebase的数据结构

use*_*337 2 android firebase firebase-realtime-database

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

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

该应用程序提供产品详细信息和审查不同类型的产品.所以这是一个示例用例.

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

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

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

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

但是,所有产品评论都将显示在单个活动/片段中.因此,每种产品类型都不会有不同的活动/片段.有人可以让我清楚地了解在我的用例中使用扁平数据结构吗?

问候

Chi*_*ria 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
    },
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

看看这个答案,了解如何生成时间戳并将时间戳转换回可显示日期:

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

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

users: {
    abcdefghijklm: { // User UID
        name: "Conqueror",
        reviews: {
            review1: smartphone1,
            review7: car1
        }
    },
    nopqrstuvwxyz: {
        name: "Magic Blaster",
        reviews: {
            review2: smartphone1
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

要获取特定用户的评论,您可以获取用户的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);
    });
});
Run Code Online (Sandbox Code Playgroud)

如果您只想查看用户"征服者"的评论,请设置userUID为他的唯一ID.以下是Firebase for Android从数据库中检索数据的官方文档.