CouchDB是否支持参照完整性?

Sun*_*dar 13 referential-integrity couchdb

我是CouchDB的新手并且了解它.我没有遇到CouchDB对参照完整性的支持.我们可以在CouchDB文档中为字段创建外键吗?

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

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

Bar*_*cat 11

不,CouchDB不会这样做外键,因此您不能让它为您处理系统的参照完整性.您需要在应用程序级别处理供应商的检查.

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

就像是

function(doc) {
  if (doc.type == 'order')
    emit(doc.vendor,doc);
}
Run Code Online (Sandbox Code Playgroud)

将获取数据库中具有值顺序的type属性的所有文档,并使用其供应商作为键将它们添加到视图中.

CouchDB视图简介


mik*_*eal 8

这些问题是特定的关系数据库.

在CouchDB或任何其他非RDBMS中,您不会像在RDBMS中那样存储数据,因此以这种方式设计关系可能不是最好的.但是,为了让您了解如何执行此操作,我们假设您有一个供应商的文档和一堆文档,用于需要"关联"到供应商文档的订单.

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

{"type":"order","vendor-id":"asd7d7f6ds76f7d7s"}
Run Code Online (Sandbox Code Playgroud)

要查找特定供应商的所有订单,您需要具有以下内容的地图视图:

function(doc) { if (doc.type == 'order') {emit(doc['vendor-id'], doc)}}
Run Code Online (Sandbox Code Playgroud)

文档_id不会更改,因此即使您更改供应商文档上的其他属性(如名称或帐单信息),也会存在"完整性".如果您将供应商名称或供应商文档中的其他属性直接粘贴到订单文档中,则需要编写脚本(如果您想要批量更改它们).

希望有点帮助.

  • 换句话说,参照完整性就是自己动手.程序员必须首先记住创建供应商文档,然后编写引用其**_ id**的项目,因为CouchDB不能为它们强制执行.同样,删除后的程序员必须记住在删除供应商之前首先删除与供应商关联的订单 - CouchDB不会为他们执行此操作.所以CouchDB会让你不断进入不一致的状态; 没有人支持保护它. (2认同)