12

我正在设计一个多语言电子商务网站。产品有不同的属性。每种语言的某些属性不同(例如颜色),所有语言的其他属性都相同(例如 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")]
}

这个模式有更好的选择吗?使用这个架构会遇到什么问题?

4

1 回答 1

7

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

背景:我们的系统应该能够从多个电子商务网站导入产品库存,因此灵活性和 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: "searched val" })

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

属性.描述。*

不确定我们将如何处理这些属性。例如,数值不需要翻译。欢迎对此提出任何想法。

不过,我们仍然没有使用这种结构,所以这些实际上是实现前的想法。当我们开始在实践中使用它时,我预计会出现更多问题,即为 CRUD 操作做 UI 等。

于 2011-10-17T10:14:28.830 回答