2011-09-23 88 views
8

我設計一個多語種電子商務網站。產品具有不同的屬性。對於每種語言(例如顏色),某些屬性是不同的,其他屬性對於所有語言(例如SKU)都是相同的。屬性不是預定義的,例如汽車具有除意式咖啡機之外的其他屬性。多語言電子商務網站的高效MongoDB模式設計是什麼?

我想設計數據庫模式使得:

  1. 搜索和代表從X類所有產品在語言Y是快速
  2. 重複數據量是低
  3. 我不「不想使用的文件與翻譯

我想使用的模式是這樣的:

{ 
_id: ObjectID("5dd87bd8d77d094c458d2a33"), 

multi-lingual-properties: ["name", "description"], 

name: { en: "Super fast car", 
     nl: "Hele snelle auto"}, 

description: { en: "Buy this car", 
       nl: "Koop deze auto"}, 

price: 20000, 

sku: "SFC106X", 

categories: [ObjectID("4bd87bd8277d094c458d2a43")] 
} 

是否有這個模式一個更好的選擇?我使用這種模式時會遇到什麼問題?

+3

以我的經驗,電子商務系統往往有高度關係數據庫模式UI浮出水面 - 你確定MongoDB是正確的呢? –

+0

@Neville答:是:http://spf13.com/post/mongodb-ecommerce-a-perfect-combination和 http://kylebanker.com/blog/2010/04/30/mongodb-and-ecommerce/ –

+0

我完全準備接受我是一個憤世嫉俗的老山羊,但事實上MongoDB的支持者在這方面贊成MongoDB並不足以影響我。 我很喜歡的一個電子商務網站的目錄部分的NoSQL的想法 - 產品是出了名的多態。我不知道我想要做的業務邏輯部分 - 購物車,退房,支付,解決,落實 - 沒有我的關係舒適毯子...... –

回答

5

後來比我預期的,但在這裏就是我們現在實行...

背景:我們的系統應該是能夠從多個電子商務網站導入的產品庫存,所以靈活性&國際化是很重要的。

EAV模型:

db.products.find() 

{ "_id" : ObjectId("4e9bfb4b4403871c0f080000"), 
"name" : "some internal name", 
"sku" : "10001", 
"company" : { /* reference to another collection */ }, "price" : 99.99, 
"attributes": { 
    "description": { "en": "english desc", "de": "deutsche Beschreibung" }, 
    "another_field": { "en": "something", "de": "etwas"}, 
    "non_i18n_field": { "*": xxx } 
} 
} 

我們還需要元數據屬性,其中包括管理員編輯提示(什麼樣的輸入形式使用)和國際化的名稱的屬性。例如:

db.eav.attributes.find() 

{ "_id" : ObjectId("127312318"), 
"code" : "description", 
"labels" : { "en" : "Description", "de": "Beschreibung" }, 
"type" : "text-long", 
"options" : [], 
"constraints" : [ ] 
} 

這個想法是,屬性元數據會很大,不會被複制。大部分時間操作將使用(動態)屬性的值完成。如果屬性元數據是必要的,以顯示UI等可以裝載&分別緩存,和由屬性代碼中引用。

所以默認情況下一切的屬性是啓用國際化 - 。

查詢啓用了國際化-的屬性很簡單:

db.products.find:

非翻譯屬性可能是一個麻煩,雖然因爲({attributes.description.en 「搜索VAL」})他們會需要查詢的特殊待遇:

attributes.description *

不知道是什麼,我們會與這些屬性還沒有做。例如。數值不需要翻譯。任何想法都是值得歡迎的。

我們還沒有采用這種結構的,所以這些都是真正實施前的想法。我希望有更多的問題,我們開始在實踐中使用此同時,即做的CRUD操作等

+1

FWIW只是上述解決方案的擴展:我們實際使用的大多數屬性不需要國際化,因爲它們是數字或跨語言代碼(例如UPC/EAN產品代碼)。 因此,爲了使事情變得更簡單,我們不使用「*」爲假冒的語言環境,以避免不必要的嵌套。所以對於像「weight」這樣的非i18n屬性,我們只需{...屬性:{weight:100; ...}},並且只適用於像'description'這樣的實際文本multilang屬性,我們將有額外的嵌套,例如{... atributes:{desc:{'en':...,'de':...}}} HTH –