【发布时间】:2022-03-16 21:03:51
【问题描述】:
我对 Firebase 数据库结构有一些疑问。我不熟悉它,因为我前几天才开始学习它。基本上1个账户可以有很多个收据,1个收据可以有很多不同类型的物品,1个商店的1个收据和1个货币的1个收据。
我想出了如下数据库设计:
receipts {
accountID1 : {
receiptID1 : {
date:
store: {
storeName: store1
storeAddr: addr1
}
currency: {
currencyName: currency1
currentcySymbol: $
}
totalAmount: 50.00
}
receiptID2 : { ... }
}
accountID2 : { ... }
},
itemlists {
receiptID1: {
items: {
itemID1 : {
type: food
name: snack
price: 10.00
quantity: 2
}
itemID2 : { ... }
}
}
receiptID2: { ... }
},
receiptIDsByStore {
storeID1: {
receiptID1: true
receiptID2: true
}
},
receiptIDsByCurrency {
currencyID1: {
receiptID1: true
receiptID2: true
}
},
stores {
storeID1: {
storeName: store1
storeAddress: addr1
}
},
currencies {
currencyID1: {
currencyName: currency1
currencySymbol: $
}
}
itemIDsByType {
food: {
itemID1: true,
itemID2: true,
}
entertainment: {
itemID3: true,
itemID4: true,
}
}
所以我的问题是:
-
我对上面的设计有什么冗余错误吗?
-
我可以从收据中获得每个用户的总消费金额,对吗?我可以像
receipts/accountID1一样查询以获取所有收据然后总结总金额。 -
我如何才能实际总结每个用户在每种类型的项目上的总支出?例如,我想找食物。所以我查询
itemIDsByType/food,然后获取itemIDs的列表,然后从那里查询itemlists并检查receiptID是否属于该特定帐户,然后得到单价?
编辑
receipts {
accountID1 : {
receiptID1 : {
date : "07/07/2017"
store : {
storeName : "store1"
storeAddr : "addr1"
}
currency : {
currencyName : "currency1"
currentcySymbol : "$"
}
totalAmount : "50.00"
items : {
itemID1 : true,
itemID2 : true,
}
}
receiptID2 : {
date : "08/07/2017"
store : {
storeName : "store1"
storeAddr : "addr1"
}
currency : {
currencyName : "currency1"
currentcySymbol : "$"
}
totalAmount : "20.00"
items : {
itemID3 : true,
itemID4 : true,
}
}
}
accountID2 : {
receiptID3 : {
date : "08/07/2017"
store : {
storeName : "store2"
storeAddr : "addr2"
}
currency : {
currencyName : "currency1"
currentcySymbol : "$"
}
totalAmount : "100.00"
items : {
itemID5 : true,
itemID6 : true,
}
}
}
},
items {
itemID1 : {
type : "food"
name : "snack"
unitprice : "10.00"
quantity : "2"
}
itemID2 : {
type : "entertainment"
name : "gaming equipment"
unitprice : "150.00"
quantity : "1"
}
itemID3 : {
type : "food"
name : "fruit juice"
unitprice : "4.00"
quantity : "1"
}
itemID4 : {
type : "entertainment"
name : "new year clothes"
unitprice : "100.00"
quantity : "1"
}
itemID5 : {
type : "healthcare"
name : "fever meds"
unitprice : "100.00"
quantity : "1"
}
itemID6 : {
type : "healthcare"
name : "flu meds"
unitprice : "100.00"
quantity : "1"
}
},
receiptIDsByStore {
storeID1 : {
receiptID1 : true,
receiptID2 : true,
}
storeID2 : {
receiptID3 : true,
}
},
receiptIDsByCurrency {
currencyID1 : {
receiptID1 : true,
receiptID2 : true,
receiptID3 : true,
}
},
stores {
storeID1 : {
storeName : "store1"
storeAddress : "addr1"
}
storeID2 : {
storeName : "store2"
storeAddress : "addr2"
}
},
currencies {
currencyID1 : {
currencyName : "currency1"
currencySymbol : "$"
}
},
itemIDsByType {
food : {
itemID1 : true,
itemID3 : true,
}
entertainment: {
itemID2 : true,
itemID4 : true,
}
healthcare : {
itemID5 : true,
itemID6 : true,
}
}
【问题讨论】:
-
您为一家公司使用不同的商店还是完全不同的公司?此外,您希望汇总每个用户的总支出,但发布的结构中没有对用户的引用。
-
@Jay 是的,这些商店来自不同的商店。至于总支出,可以直接查询receipts/accountID1,然后得到里面每个receiptID的totalAmt,对吗?
-
@Jay 关于第三个要点,我查询 itemIDsByType/food,然后获取项目列表,然后查询收据/帐户 ID,然后比较 itemID。如果匹配,我会查询 items/itemID 以获取项目详细信息,然后将结果存储到另一个单独的数组中。我怎样才能真正按月“分组”特定用户的每个类别的支出金额?
-
总和;使用当前结构,很容易迭代receipt/accountID1的所有子节点-如果它是一个大数据集,则使用.childAdded;如果它很小,则使用.value,并从每个节点检索totalAmt并将它们相加,所以是的,你是对的。对于您的第二条评论,正如我在第一条评论中提到的那样,发布的结构中没有对用户的引用,并且不清楚 每个类别 的含义。我认为这可能是一个单独的问题,应该包括您的用户结构、类别是什么以及它们与其余数据的关系。
-
@Jay 我明白了。非常感谢!
标签: firebase firebase-realtime-database