CouchDB参考完整性

时间:2016-08-29 08:46:35

标签: couchdb referential-integrity nosql

我是CouchDBNoSQL场景的新手,来自SQL背景。我对引用完整性有一些疑问,例如我有一个产品文档如下

{
  type: "product"
  name: "Sweet Necklace"
  category: "necklace"
}

每个类别都有自己的文档

{
  type: "category",
  name: "necklace",
  custom_attr: ".."
}

仅仅为了争论,当利益相关者选择从"项链"重新命名类别时会发生什么?对于"配件",将类别字段设置为""?的产品会发生什么?我是否对所有类别为项链的产品进行批量更新? (我不认为CouchDB允许我们执行"更新所有地点"有点声明)

处理此类情况的最佳做法是什么?

P / S :我选择在产品文档中保存类别名称而不是类别ID,因为NoSQL无论如何都会鼓励非规范化。

1 个答案:

答案 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,类别信息就会包含在您的搜索结果中。