摘要:此文已由作者溫正湖授權網易云社區(qū)發(fā)布。這是一篇官網上的一篇文章,分析了使用存儲商品分類信息相比其他數(shù)據(jù)庫的優(yōu)勢,并講述了如何將其保存到中。
此文已由作者溫正湖授權網易云社區(qū)發(fā)布。
歡迎訪問網易云社區(qū),了解更多網易技術產品運營經驗。
這是一篇MongoDB官網上的一篇文章,分析了使用MongoDB存儲商品分類信息相比其他數(shù)據(jù)庫的優(yōu)勢,并講述了如何將其保存到MongoDB中。原址點擊:User case – Product Catalog。MongoDB中文社區(qū)有大神已將其翻譯成中文。在此不重復造車,直接轉載。歡迎一起探討。
關系型數(shù)據(jù)庫解決方案
上述問題使用傳統(tǒng)的關系型數(shù)據(jù)庫也可以解決,比如以下幾種方案
針對不同商品,創(chuàng)建不同的表
比如音樂專輯、電影這2種商品,有一部分共同的屬性,但也有很多自身特有的屬性,可以創(chuàng)建2個不同的表,擁有不同的schema。
CREATE TABLE product_audio_album (
`sku` char(8) NOT NULL, ... `artist` varchar(255) DEFAULT NULL, `genre_0` varchar(255) DEFAULT NULL, `genre_1` varchar(255) DEFAULT NULL, ..., PRIMARY KEY(`sku`))
...
CREATE TABLE product_film (
`sku` char(8) NOT NULL, ... `title` varchar(255) DEFAULT NULL, `rating` char(8) DEFAULT NULL, ..., PRIMARY KEY(`sku`))
...
這種做法的主要問題在于
針對每個新的商品分類,都需要創(chuàng)建新的表
應用程序開發(fā)者必須顯式的將請求分發(fā)到對應的表上來查詢,一次查詢多種商品實現(xiàn)起來比較麻煩
所有商品存儲到單張表
CREATE TABLE product (
`sku` char(8) NOT NULL, ... `artist` varchar(255) DEFAULT NULL, `genre_0` varchar(255) DEFAULT NULL, `genre_1` varchar(255) DEFAULT NULL, ... `title` varchar(255) DEFAULT NULL, `rating` char(8) DEFAULT NULL, ..., PRIMARY KEY(`sku`))
將所有的商品存儲到一張表,這張表包含所有商品需要的屬性,不同的商品根據(jù)需要設置不同的屬性,這種方法使得商品查詢比較簡單,并且允許一個查詢跨多種商品,但缺點是浪費的空間比較多。
提取公共屬性,多表繼承
CREATE TABLE product (
`sku` char(8) NOT NULL, `title` varchar(255) DEFAULT NULL, `description` varchar(255) DEFAULT NULL, `price`, ... PRIMARY KEY(`sku`))
CREATE TABLE product_audio_album (
`sku` char(8) NOT NULL, ... `artist` varchar(255) DEFAULT NULL, `genre_0` varchar(255) DEFAULT NULL, `genre_1` varchar(255) DEFAULT NULL, ..., PRIMARY KEY(`sku`), FOREIGN KEY(`sku`) REFERENCES `product`(`sku`))
...
CREATE TABLE product_film (
`sku` char(8) NOT NULL, ... `title` varchar(255) DEFAULT NULL, `rating` char(8) DEFAULT NULL, ..., PRIMARY KEY(`sku`), FOREIGN KEY(`sku`) REFERENCES `product`(`sku`))
...
上述方案將所有商品公共的屬性提取出來,將公共屬性存儲到一張表里,每種商品根據(jù)自身的需要創(chuàng)建新的表,新表里只存儲該商品特有的信息。
Entity Attribute Values 形式存儲
所有的數(shù)據(jù)按照 的3元組的形式存儲,這個方案實際上是把關系型數(shù)據(jù)庫當KV存儲使用,模型簡單,但應對復雜的查詢不是很方便。
ENTITY ATTRIBUTE VALUES
sku_00e8da9b type Audio Album
sku_00e8da9b title A Love Supreme
sku_00e8da9b … …
sku_00e8da9b artist John Coltrane
sku_00e8da9b genre Jazz
sku_00e8da9b genre General
… … …
MongoDB 解決方案
MognoDB 與關系型數(shù)據(jù)庫不同,其無schema,文檔內容可以非常靈活的定制,能很好的使用上述商品分類存儲的需求; 將商品信息存儲在一個集合里,集合里不同的商品可以自定義文檔內容。
比如一個音樂專輯可以類似如下的文檔結構
{
sku: "00e8da9b",
type: "Audio Album",
title: "A Love Supreme",
description: "by John Coltrane",
asin: "B0000A118M",
shipping: {
weight: 6, dimensions: { width: 10, height: 10, depth: 1 },
},
pricing: {
list: 1200, retail: 1100, savings: 100, pct_savings: 8
},
details: {
title: "A Love Supreme [Original Recording Reissued]", artist: "John Coltrane", genre: [ "Jazz", "General" ], ... tracks: [ "A Love Supreme Part I: Acknowledgement", "A Love Supreme Part II - Resolution", "A Love Supreme, Part III: Pursuance", "A Love Supreme, Part IV-Psalm" ],
},
}
而一部電影則可以存儲為
{
sku: "00e8da9d",
type: "Film",
...,
asin: "B000P0J0AQ",
shipping: { ... },
pricing: { ... },
details: {
title: "The Matrix", director: [ "Andy Wachowski", "Larry Wachowski" ], writer: [ "Andy Wachowski", "Larry Wachowski" ], ..., aspect_ratio: "1.66:1"
},
}
所有商品都擁有一些共同的基本信息,特定的商品可以根據(jù)需要擴展獨有的內容,非常方便; 基于上述模型,MongoDB 也能很好的服務各類查詢。
查詢某個演員參演的所有電影,并按發(fā)型日志排序
db.products.find({"type": "Film", "details.actor": "Keanu Reeves"}).sort({"details.issue_date", -1})
上述查詢也可以通過建立索引來加速
db.products.createIndex({ type: 1, "details.actor": 1, "details.issue_date": -1 })
查詢標題里包含特定信息的所有電影
db.products.find({
"type": "Film", "title": {"$regex": ".*hacker.*", "$options":"i"}}).sort({"details.issue_date", -1})
可建立如下索引來加速查詢
db.products.createIndex({ type: 1, details.issue_date: -1, title: 1 })
擴展
當單個節(jié)點無法滿足海量商品信息存儲的需求時,就需要使用MongoDB sharding來擴展,假定大量的查詢都是都會基于商品類型,那么就可以使用商品類型字段來進行分片。
db.shardCollection("products", { key: {type: 1} })
分片時,盡量使用復合的索引字段,這樣能滿足更多的查詢需求,比如基于商品類型之后,還會經常根據(jù)商品的風格標簽來查詢,則可以把商品的標簽字段作為第二分片key。
db.shardCollection("products", { key: {type: 1, "details.genre": 1} })
如果某種類型的商品,擁有相同標簽的特別多,則會出現(xiàn)jumbo chunk的問題,導致無法遷移,可以進一步的優(yōu)化分片key,以避免這種情況。
db.shardCollection("products", { key: {type: 1, "details.genre": 1, sku: 1} })
加入第3分片key之后,即使類型、風格標簽都相同,但其sku信息肯定不同,就肯定不會出現(xiàn)超大的chunk。
網易云MongoDB 服務為開發(fā)者提供了一站式的 MongoDB 云端解決方案,包括提供三節(jié)點復制集的高可用架構,故障切換,并提供專業(yè)的備份、監(jiān)控以及性能優(yōu)化方案,徹底免除開發(fā)者的運維煩惱。點擊可免費試用。
網易云免費體驗館,0成本體驗20+款云產品!
更多網易技術、產品、運營經驗分享請點擊。
文章來源: 網易云社區(qū)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25275.html
摘要:利用中間件實現(xiàn)異步請求,實現(xiàn)兩個用戶角色實時通信。目前還未深入了解的一些概念。往后會寫更多的前后臺聯(lián)通的項目。刪除分組會連同組內的所有圖片一起刪除。算是對自己上次用寫后臺的一個強化,項目文章在這里。后來一直沒動,前些日子才把后續(xù)的完善。 歡迎訪問我的個人網站:http://www.neroht.com/? 剛學vue和react時,利用業(yè)余時間寫的關于這兩個框架的訓練,都相對簡單,有的...
摘要:地址前端地址服務端地址運行環(huán)境主要功能購物車綁定手機用戶登錄添加商品推薦商品商品列表優(yōu)惠券地址管理上傳圖片接口列表管理刪除用戶刪除商品添加商品添加分類刪除分類添加分類添加優(yōu)惠券所有優(yōu)惠券上傳首頁獲取獲取推薦列表獲取列表獲取詳情訂單創(chuàng)建訂單獲 GitHub地址 前端地址:https://github.com/FZliweilia... 服務端地址:https://github.com/F...
摘要:地址前端地址服務端地址運行環(huán)境主要功能購物車綁定手機用戶登錄添加商品推薦商品商品列表優(yōu)惠券地址管理上傳圖片接口列表管理刪除用戶刪除商品添加商品添加分類刪除分類添加分類添加優(yōu)惠券所有優(yōu)惠券上傳首頁獲取獲取推薦列表獲取列表獲取詳情訂單創(chuàng)建訂單獲 GitHub地址 前端地址:https://github.com/FZliweilia... 服務端地址:https://github.com/F...
摘要:地址前端地址服務端地址運行環(huán)境主要功能購物車綁定手機用戶登錄添加商品推薦商品商品列表優(yōu)惠券地址管理上傳圖片接口列表管理刪除用戶刪除商品添加商品添加分類刪除分類添加分類添加優(yōu)惠券所有優(yōu)惠券上傳首頁獲取獲取推薦列表獲取列表獲取詳情訂單創(chuàng)建訂單獲 GitHub地址 前端地址:https://github.com/FZliweilia... 服務端地址:https://github.com/F...
摘要:項目預覽線上訪問或者二維碼掃描項目描述全家桶模仿網易嚴選瀏覽,購物流程,好的生活,沒那么貴。對狀態(tài)管理有了進一步的了解在項目過程中每一個組件都應用了這個組件,切換的時候每次當前選中的選項都是第一項成選中狀態(tài),究其原因的他們的狀態(tài)沒有共享。 項目預覽 showImg(https://segmentfault.com/img/remote/1460000009660678?w=1481&h...
閱讀 1413·2021-09-23 11:21
閱讀 3111·2019-08-30 14:14
閱讀 3196·2019-08-30 13:56
閱讀 4144·2019-08-30 11:20
閱讀 1956·2019-08-29 17:23
閱讀 2768·2019-08-29 16:14
閱讀 1700·2019-08-28 18:18
閱讀 1495·2019-08-26 12:14