国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

使用 MongoDB 存儲商品分類信息

tigerZH / 2593人閱讀

摘要:此文已由作者溫正湖授權網易云社區發布。這是一篇官網上的一篇文章,分析了使用存儲商品分類信息相比其他數據庫的優勢,并講述了如何將其保存到中。

此文已由作者溫正湖授權網易云社區發布。

歡迎訪問網易云社區,了解更多網易技術產品運營經驗。

這是一篇MongoDB官網上的一篇文章,分析了使用MongoDB存儲商品分類信息相比其他數據庫的優勢,并講述了如何將其保存到MongoDB中。原址點擊:User case – Product Catalog。MongoDB中文社區有大神已將其翻譯成中文。在此不重復造車,直接轉載。歡迎一起探討。

關系型數據庫解決方案
上述問題使用傳統的關系型數據庫也可以解決,比如以下幾種方案

針對不同商品,創建不同的表
比如音樂專輯、電影這2種商品,有一部分共同的屬性,但也有很多自身特有的屬性,可以創建2個不同的表,擁有不同的schema。

CREATE TABLE product_audio_album (

</>復制代碼

  1. `sku` char(8) NOT NULL,
  2. ...
  3. `artist` varchar(255) DEFAULT NULL,
  4. `genre_0` varchar(255) DEFAULT NULL,
  5. `genre_1` varchar(255) DEFAULT NULL,
  6. ...,
  7. PRIMARY KEY(`sku`))

...
CREATE TABLE product_film (

</>復制代碼

  1. `sku` char(8) NOT NULL,
  2. ...
  3. `title` varchar(255) DEFAULT NULL,
  4. `rating` char(8) DEFAULT NULL,
  5. ...,
  6. PRIMARY KEY(`sku`))

...
這種做法的主要問題在于

針對每個新的商品分類,都需要創建新的表

應用程序開發者必須顯式的將請求分發到對應的表上來查詢,一次查詢多種商品實現起來比較麻煩

所有商品存儲到單張表
CREATE TABLE product (

</>復制代碼

  1. `sku` char(8) NOT NULL,
  2. ...
  3. `artist` varchar(255) DEFAULT NULL,
  4. `genre_0` varchar(255) DEFAULT NULL,
  5. `genre_1` varchar(255) DEFAULT NULL,
  6. ...
  7. `title` varchar(255) DEFAULT NULL,
  8. `rating` char(8) DEFAULT NULL,
  9. ..., PRIMARY KEY(`sku`))

將所有的商品存儲到一張表,這張表包含所有商品需要的屬性,不同的商品根據需要設置不同的屬性,這種方法使得商品查詢比較簡單,并且允許一個查詢跨多種商品,但缺點是浪費的空間比較多。

提取公共屬性,多表繼承
CREATE TABLE product (

</>復制代碼

  1. `sku` char(8) NOT NULL,
  2. `title` varchar(255) DEFAULT NULL,
  3. `description` varchar(255) DEFAULT NULL,
  4. `price`, ...
  5. PRIMARY KEY(`sku`))

CREATE TABLE product_audio_album (

</>復制代碼

  1. `sku` char(8) NOT NULL,
  2. ...
  3. `artist` varchar(255) DEFAULT NULL,
  4. `genre_0` varchar(255) DEFAULT NULL,
  5. `genre_1` varchar(255) DEFAULT NULL,
  6. ...,
  7. PRIMARY KEY(`sku`),
  8. FOREIGN KEY(`sku`) REFERENCES `product`(`sku`))

...
CREATE TABLE product_film (

</>復制代碼

  1. `sku` char(8) NOT NULL,
  2. ...
  3. `title` varchar(255) DEFAULT NULL,
  4. `rating` char(8) DEFAULT NULL,
  5. ...,
  6. PRIMARY KEY(`sku`),
  7. FOREIGN KEY(`sku`) REFERENCES `product`(`sku`))

...
上述方案將所有商品公共的屬性提取出來,將公共屬性存儲到一張表里,每種商品根據自身的需要創建新的表,新表里只存儲該商品特有的信息。

Entity Attribute Values 形式存儲
所有的數據按照 的3元組的形式存儲,這個方案實際上是把關系型數據庫當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 與關系型數據庫不同,其無schema,文檔內容可以非常靈活的定制,能很好的使用上述商品分類存儲的需求; 將商品信息存儲在一個集合里,集合里不同的商品可以自定義文檔內容。

比如一個音樂專輯可以類似如下的文檔結構

{
sku: "00e8da9b",
type: "Audio Album",
title: "A Love Supreme",
description: "by John Coltrane",
asin: "B0000A118M",

shipping: {

</>復制代碼

  1. weight: 6,
  2. dimensions: {
  3. width: 10,
  4. height: 10,
  5. depth: 1
  6. },

},

pricing: {

</>復制代碼

  1. list: 1200,
  2. retail: 1100,
  3. savings: 100,
  4. pct_savings: 8

},

details: {

</>復制代碼

  1. title: "A Love Supreme [Original Recording Reissued]",
  2. artist: "John Coltrane",
  3. genre: [ "Jazz", "General" ],
  4. ...
  5. tracks: [
  6. "A Love Supreme Part I: Acknowledgement",
  7. "A Love Supreme Part II - Resolution",
  8. "A Love Supreme, Part III: Pursuance",
  9. "A Love Supreme, Part IV-Psalm"
  10. ],

},
}
而一部電影則可以存儲為

{
sku: "00e8da9d",
type: "Film",
...,
asin: "B000P0J0AQ",

shipping: { ... },

pricing: { ... },

details: {

</>復制代碼

  1. title: "The Matrix",
  2. director: [ "Andy Wachowski", "Larry Wachowski" ],
  3. writer: [ "Andy Wachowski", "Larry Wachowski" ],
  4. ...,
  5. aspect_ratio: "1.66:1"

},
}
所有商品都擁有一些共同的基本信息,特定的商品可以根據需要擴展獨有的內容,非常方便; 基于上述模型,MongoDB 也能很好的服務各類查詢。

查詢某個演員參演的所有電影,并按發型日志排序
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({

</>復制代碼

  1. "type": "Film",
  2. "title": {"$regex": ".*hacker.*", "$options":"i"}}).sort({"details.issue_date", -1})

可建立如下索引來加速查詢

db.products.createIndex({ type: 1, details.issue_date: -1, title: 1 })
擴展
當單個節點無法滿足海量商品信息存儲的需求時,就需要使用MongoDB sharding來擴展,假定大量的查詢都是都會基于商品類型,那么就可以使用商品類型字段來進行分片。

db.shardCollection("products", { key: {type: 1} })
分片時,盡量使用復合的索引字段,這樣能滿足更多的查詢需求,比如基于商品類型之后,還會經常根據商品的風格標簽來查詢,則可以把商品的標簽字段作為第二分片key。

db.shardCollection("products", { key: {type: 1, "details.genre": 1} })
如果某種類型的商品,擁有相同標簽的特別多,則會出現jumbo chunk的問題,導致無法遷移,可以進一步的優化分片key,以避免這種情況。

db.shardCollection("products", { key: {type: 1, "details.genre": 1, sku: 1} })
加入第3分片key之后,即使類型、風格標簽都相同,但其sku信息肯定不同,就肯定不會出現超大的chunk。

網易云MongoDB 服務為開發者提供了一站式的 MongoDB 云端解決方案,包括提供三節點復制集的高可用架構,故障切換,并提供專業的備份、監控以及性能優化方案,徹底免除開發者的運維煩惱。點擊可免費試用。

網易云免費體驗館,0成本體驗20+款云產品!

更多網易技術、產品、運營經驗分享請點擊。

文章來源: 網易云社區

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/25275.html

相關文章

  • 一些基于React、Vue、Node.js、MongoDB技術棧的實踐項目

    摘要:利用中間件實現異步請求,實現兩個用戶角色實時通信。目前還未深入了解的一些概念。往后會寫更多的前后臺聯通的項目。刪除分組會連同組內的所有圖片一起刪除。算是對自己上次用寫后臺的一個強化,項目文章在這里。后來一直沒動,前些日子才把后續的完善。 歡迎訪問我的個人網站:http://www.neroht.com/? 剛學vue和react時,利用業余時間寫的關于這兩個框架的訓練,都相對簡單,有的...

    tangr206 評論0 收藏0
  • node+express+MongoDB實現小商城服務端

    摘要:地址前端地址服務端地址運行環境主要功能購物車綁定手機用戶登錄添加商品推薦商品商品列表優惠券地址管理上傳圖片接口列表管理刪除用戶刪除商品添加商品添加分類刪除分類添加分類添加優惠券所有優惠券上傳首頁獲取獲取推薦列表獲取列表獲取詳情訂單創建訂單獲 GitHub地址 前端地址:https://github.com/FZliweilia... 服務端地址:https://github.com/F...

    wushuiyong 評論0 收藏0
  • node+express+MongoDB實現小商城服務端

    摘要:地址前端地址服務端地址運行環境主要功能購物車綁定手機用戶登錄添加商品推薦商品商品列表優惠券地址管理上傳圖片接口列表管理刪除用戶刪除商品添加商品添加分類刪除分類添加分類添加優惠券所有優惠券上傳首頁獲取獲取推薦列表獲取列表獲取詳情訂單創建訂單獲 GitHub地址 前端地址:https://github.com/FZliweilia... 服務端地址:https://github.com/F...

    Anshiii 評論0 收藏0
  • node+express+MongoDB實現小商城服務端

    摘要:地址前端地址服務端地址運行環境主要功能購物車綁定手機用戶登錄添加商品推薦商品商品列表優惠券地址管理上傳圖片接口列表管理刪除用戶刪除商品添加商品添加分類刪除分類添加分類添加優惠券所有優惠券上傳首頁獲取獲取推薦列表獲取列表獲取詳情訂單創建訂單獲 GitHub地址 前端地址:https://github.com/FZliweilia... 服務端地址:https://github.com/F...

    sf190404 評論0 收藏0
  • vue全家桶網易嚴選,體驗網易嚴選購物流程

    摘要:項目預覽線上訪問或者二維碼掃描項目描述全家桶模仿網易嚴選瀏覽,購物流程,好的生活,沒那么貴。對狀態管理有了進一步的了解在項目過程中每一個組件都應用了這個組件,切換的時候每次當前選中的選項都是第一項成選中狀態,究其原因的他們的狀態沒有共享。 項目預覽 showImg(https://segmentfault.com/img/remote/1460000009660678?w=1481&h...

    alaege 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<