如何在CouchDB / NoSQL中实现多态对象?

时间:2012-08-21 20:45:59

标签: nosql couchdb polymorphism

我想在NoSQL / Document DB中实现Polymorphic对象? 什么是最佳做法?

实施例: 硕士课 项目对象(所有应该有Item.Title,Item.Subtitle,Item.IconURL)

子类:ItemPhoto,ItemPDF,ItemURL,ItemHTML (每个子类都有不同的属性)

我想列出所有项目 - 然后在我向下钻取时获取具体数据。

可能的选项:

保存两份不同的文件 - 主人/儿童类型& ID 将所有内容保存为具有内部项目对象的子类文档

其他选项??

由于

1 个答案:

答案 0 :(得分:1)

CouchDB存储文档(数据),而不是类(带代码的数据)。 map,validation,list和show函数中的代码处理文档,但这些文档只是带有数据的普通对象。

在您的示例中,您可以定义库函数以检查给定文档是否包含项目的数据,然后使用此函数来决定要执行的操作。例如:

// in a "appTypes" library:
exports.isItem = function(doc) {
  return doc.Title && doc.Subtitle && doc.IconURL;
}

// in a map function
function(doc) {
  var appTypes = require('appTypes');
  if (appTypes.isItem(doc)) {
    // doc is an Item...
  }
}

显然,您可以将属于Item的所有代码放在Item类中,并使用doc中的数据创建该类的实例。但这是您的选择,并不会改变CouchDB处理文档的方式。