i.a*_*els 9 database-design schema-design mongodb
我正在设计一个多语言的电子商务网站.产品具有不同的属性.某些属性对于每种语言(如颜色)都不同,其他属性对于所有语言(如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")]
}
Run Code Online (Sandbox Code Playgroud)
是否有更好的替代方案?使用此架构时会遇到什么问题?
比我预期的要晚,但这是我们现在正在实施的......
背景:我们的系统应该能够从多个电子商务网站导入产品库存,因此灵活性和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.