什么是多语言电子商务网站的高效MongoDB架构设计?

时间:2011-09-23 12:11:03

标签: mongodb database-design schema-design

我正在设计一个多语种电子商务网站。产品具有不同的属性。某些属性对于每种语言(如颜色)都不同,其他属性对于所有语言(如SKU)都是相同的。属性未预定义,例如汽车具有除浓缩咖啡机之外的其他属性。

我想设计数据库模式,以便:

  1. 在语言y中搜索和表示x类别的所有产品很快
  2. 重复数据量不足
  3. 我不想使用带翻译的文件
  4. 我正在考虑使用这样的架构:

    {
     _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")]
    }
    

    是否有更好的替代方案?使用此架构时会遇到什么问题?

1 个答案:

答案 0 :(得分:6)

比我预期的要晚,但这是我们现在正在实施的......

背景:我们的系统应该可以从多个电子商务网站导入产品库存,因此灵活性和i18n很重要。

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 } 
 }
}

我们还需要属性的元数据,其中包括管理编辑提示(要使用的输入表单)和属性的名称的i18n。例如:

db.eav.attributes.find()

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

这个想法是属性元数据将非常大并且不会被复制。大多数时候操作将使用(动态)属性的值来完成。如果需要属性元数据来显示UI等,则可以加载&单独缓存,并由属性代码引用。

因此,默认情况下,所有属性都是启用了i18n。

对i18n-enabled-attributes的查询很简单:

db.products.find({attributes.description.en:“搜索val”})

非翻译属性可能很麻烦,因为他们需要在查询中进行特殊处理:

attributes.description。*

我们还不确定我们会对这些属性做些什么。例如。数值不需要翻译。欢迎任何想法。

我们仍然没有使用这种结构,所以这些都是实施前的想法。当我们在实践中开始使用它时,我期待更多的问题浮出水面,即为CRUD操作做UI。