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

i.a*_*els 9 database-design schema-design mongodb

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

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

  1. 在语言y中搜索和表示x类别的所有产品的速度很快
  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")]
}
Run Code Online (Sandbox Code Playgroud)

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

Jak*_* P. 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 } 
 }
}
Run Code Online (Sandbox Code Playgroud)

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

db.eav.attributes.find()

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

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

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

对i18n-enabled属性的查询很简单:

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

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

attributes.description.*

不知道我们将如何处理这些属性.例如,数值不需要翻译.对此有任何想法都是受欢迎的.

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