CouchDB支持引用完整性吗?

CouchDB支持引用完整性吗?,couchdb,referential-integrity,Couchdb,Referential Integrity,我是CouchDB的新手,正在学习它。我没有遇到CouchDB对引用完整性的支持。 我们可以为CouchDB文档中的字段创建外键吗 例如,是否可以确保订单文档中使用的供应商名称在供应商数据库中可用 CouchDB支持引用完整性吗? 是否可以将文档中的字段作为主键?不,CouchDB不做外键,因此您无法让它为您处理系统的引用完整性。您需要在应用程序级别检查供应商 至于是否可以将字段作为主键,主键是_id字段,但是可以使用任何有效的json作为db上视图的键。因此,例如,您可以创建一个订单视图,以其

我是CouchDB的新手,正在学习它。我没有遇到CouchDB对引用完整性的支持。 我们可以为CouchDB文档中的字段创建外键吗

例如,是否可以确保订单文档中使用的供应商名称在供应商数据库中可用

CouchDB支持引用完整性吗?
是否可以将文档中的字段作为主键?

不,CouchDB不做外键,因此您无法让它为您处理系统的引用完整性。您需要在应用程序级别检查供应商

至于是否可以将字段作为主键,主键是_id字段,但是可以使用任何有效的json作为db上视图的键。因此,例如,您可以创建一个订单视图,以其供应商为键

差不多

function(doc) {
  if (doc.type == 'order')
    emit(doc.vendor,doc);
}
将获取数据库中具有值顺序的type属性的所有文档,并使用其供应商作为键将它们添加到视图中


这些问题都是关系数据库特有的

在CouchDB或任何其他非RDBMS中,您不会像在RDBMS中那样存储数据,因此以这种方式设计关系可能不是最好的。但是,为了让您了解如何做到这一点,让我们假设您有一个供应商文档和一组订单文档,这些文档需要“关联”到供应商文档

没有主键,文档有一个_id,它是一个uuid。如果您有供应商的文档,并且您正在为订单之类的内容创建新文档,则可以引用供应商文档id

{"type":"order","vendor-id":"asd7d7f6ds76f7d7s"}
要查找特定供应商的所有订单,您将有一个类似以下内容的地图视图:

function(doc) { if (doc.type == 'order') {emit(doc['vendor-id'], doc)}}
文档id不会更改,因此存在“完整性”,即使您更改了供应商文档上的其他属性,如名称或账单信息。如果将供应商文档中的供应商名称或其他属性直接粘贴到订单文档中,如果要批量更改,则需要编写脚本


希望这能有所帮助。

虽然无法创建FK约束,但可以使用Coach的
验证功能

function(newDoc, oldDoc, userCtx, secObj) {
    if(newDoc && newDoc.type) switch(newDoc.type){
        case 'fish':
            var allSpecies = ['trout','goldfish'];
            if(!allSpecies.contains(newDoc.species)){
                throw({forbidden : 'fish must be of a know species'});
            }
            break;
        case 'mammals':
            if(!['M','F'].contains(newDoc.sex)){
                throw({forbidden : 'mammals must have their sex listed'});
            }
            break;
    }
}
现在,如果一个人真的很聪明(我不是),他们可能会打电话给DB自己,要物种列表。。。那将是一个外键

您可能还需要阅读以下内容:

换句话说,引用完整性就是自己动手。程序员必须记住首先创建供应商文档,然后编写引用其_id的项,因为CouchDB无法为它们强制执行。类似地,删除时的程序员必须记住,在删除供应商之前,首先删除与供应商关联的订单-CouchDB不会这样做。所以CouchDB会让你不断进入不一致的状态;不支持针对它进行保护。我不会将没有引用的悬空文档称为“不一致状态”,因为本例中的状态是将被删除的其他文档中的引用。但你们在这里对语义的描述是准确的。引用只是索引,删除文档并不意味着会有更大的事务清理后台引用,尽管它会清理前向引用。更重要的是,couchdb服务器支持REST-3(如果需要使用设计文档,可以构建REST-4功能)。应用术语“引用完整性”对文档数据库的意义不亚于对视频游戏的意义。它不是关系数据库,也不假装是关系数据库。