我是CouchDB
和NoSQL
场景的新手,来自SQL
背景。我对引用完整性有一些疑问,例如我有一个产品文档如下
{
type: "product"
name: "Sweet Necklace"
category: "necklace"
}
每个类别都有自己的文档
{
type: "category",
name: "necklace",
custom_attr: ".."
}
仅仅为了争论,当利益相关者选择从"项链"重新命名类别时会发生什么?对于"配件",将类别字段设置为""?的产品会发生什么?我是否对所有类别为项链的产品进行批量更新? (我不认为CouchDB
允许我们执行"更新所有地点"有点声明)
处理此类情况的最佳做法是什么?
P / S :我选择在产品文档中保存类别名称而不是类别ID,因为NoSQL
无论如何都会鼓励非规范化。
答案 0 :(得分:0)
如果您为该类别维护单独的文档,那么您根本不会对数据进行非规范化。事实上,通过做你正在做的事情,你会得到两个世界中最糟糕的 - 没有规范化,也没有非规范化。
尝试这样的事情:
产品文档:
{
_id:"product:first_product",
name:"First Product"
category:"category:category_1"
}
分类文件:
{
_id:"category:category_1",
name:"Category 1",
custom_attr: {}
}
这样,当您更改类别的名称时,您仍然会引用具有此类别的所有产品文档中的正确文档。
注意:您仍然可以拥有type
字段,并让_id
保持原样。
修改强>
要获取产品/类别信息,您可以定义类似的地图功能:
function(doc){
if(doc.id.indexOf('product:') === 0){
// or if(doc.type === 'product') if you use the type field
emit(doc, {'_id': doc.category});
}
}
现在,只要您使用此视图并将include_docs
设置为true,类别信息就会包含在您的搜索结果中。