2016-12-15 109 views
1

我目前正在爲iOS創建一個電子商務應用程序,而且我很難決定如何構建用戶通過「關鍵字」搜索項目的場景的數據庫。我不確定是否最好存儲一個關鍵字數組或者只是爲該項目設置一串關鍵字。Firebase數據庫結構

如果你們有任何建議,請讓我知道!

謝謝。

這裏的結構我有一個單一的項目現在:

"items": { 
     "item1_id":{ 
      "brand_id": brandName_id, 
      "itemName":....., 
      "price":....., 
      "keywords": ? 
    } 
    } 
+1

你打算有基於關鍵字的查詢? – cartant

+0

是的,我願意!如果一個人想要搜索一個基於類似......的東西......「黑色,T恤,設計......「@cartant –

回答

2

在火力地堡,您可以查詢使用單個值或值範圍,所以構建一個查詢以獲得項目配套的幾個關鍵詞是不會成爲可能。但是,您可以安排數據庫,以便輕鬆查詢或使用單個關鍵字。然後你需要幾個查詢組合等

你可以安排你這樣的數據:

{ 
    "items": { 
    "item1_id": { 
     "brand_id": ..., 
     "itemName": ..., 
     "price": ..., 
     "keywords": { 
     "black": true, 
     "t-shirt": true 
     } 
    } 
    } 
} 

然而,如this answer解釋,你需要定義爲每個關鍵字的索引。爲了能夠有效的基於關鍵字的查詢,您可以創建自己的關鍵字映射到項目:

{ 
    "items": { 
    "item1_id": { 
     "brand_id": ..., 
     "itemName": ..., 
     "price": ..., 
     "keywords": { 
     "black": true, 
     "t-shirt": true 
     } 
    } 
    }, 
    "keywords": { 
    "black": { 
     "item1_id": true 
    }, 
    "t-shirt": { 
     "item1_id": true 
    } 
    } 
} 

爲關鍵字的查詢將是這樣的:

let keyword = "black"; 
database.ref(`keywords/${keyword}`).once("value", (snapshot) => { 
    snapshot.forEach((idSnapshot) => { 
    database.ref(`items/${idSnapshot.key}`).once("value", (itemSnapshot) => { 
     console.log(JSON.stringify(itemSnapshot.val())); 
    }); 
    }); 
}); 

有維護自己的關鍵字到項目的映射有點痛苦,但查詢速度會很快。此外,Firebase的多位置更新可以使維護關鍵字映射更容易一些。要創建一個項目:

database.ref().update({ 
    "items/item1_id": { 
    "brand_id": ..., 
    "itemName": ..., 
    "price": ..., 
    "keywords": { 
     "black": true, 
     "t-shirt": true 
    } 
    }, 
    "keywords/black/item1_id": true, 
    "keywords/t-shirt/item1_id": true 
}); 

要更改項目的關鍵字(刪除black,加blue離開t-shirt不變):

database.ref().update({ 
    "items/item1_id/keywords": { 
    "black": null, 
    "blue": true 
    }, 
    "keywords/black/item1_id": null, 
    "keywords/blue/item1_id": true 
}); 

並刪除一個項目:

database.ref().update({ 
    "items/item1_id": null, 
    "keywords/blue/item1_id": null, 
    "keywords/t-shirt/item1_id": null 
}); 
+0

你需要在這個場景中爲每個類別定義一個索引,替代方法是爲'/ categories/$ category/item1:true'建模。參見http://stackoverflow.com/questions/40656589/ firebase-query-if-child-of-child-contain-a-value –

+0

謝謝,@FrankvanPuffelen。我已經重寫了答案。 – cartant

+0

感謝cartant和@Frank van Puffelen我會試着將它融入我的iOS應用程序,我會給你一個更新! –

2

如何約:

items 
     item0 
     color: black 
     type: t-shirt 
     option: design 
     keywords: black_t-shirt_design 
     item1 
     color: black 
     type: hat 
     option: design 
     keywords: black_hat_design 

然後使用startingAt和endingAt進行簡單的查詢。

因此,例如,說用戶使用過濾器來縮小結果,並希望有關知道所有的黑帽子和不關心的選項參數是什麼:

itemsRef.queryOrdered(byChild: "keywords") 
     .queryStarting(atValue: "black_hat") 
     .queryEnding(atValue: "black_hat") 

同樣,如果用戶想知道所有隻是黑色的衣服,你可以在「顏色」的孩子身上查詢黑色。

但如果他們想所有的黑帽子與設計選項

itemsRef.queryOrdered(byChild: "keywords") 
     .queryStarting(atValue: "black_hat_design") 
     .queryEnding(atValue: "black_hat_design")