我正在设计一个多语种电子商务网站。产品具有不同的属性。某些属性对于每种语言(如颜色)都不同,其他属性对于所有语言(如SKU)都是相同的。属性未预定义,例如汽车具有除浓缩咖啡机之外的其他属性。
我想设计数据库模式,以便:
我正在考虑使用这样的架构:
{
_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")]
}
是否有更好的替代方案?使用此架构时会遇到什么问题?
答案 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。