KVS如果ID是密钥,ID应该在文档中吗?

时间:2020-01-12 00:18:08

标签: database-design nosql

假设我有一个KVS数据库,其中的键是文档ID。这些文档是JSON和XML,可以在其中获取文档ID。例如:

c62a3ecd-696b-4c9e:{"document-id": "c62a3ecd-696b-4c9e", ... }

同时拥有ID是否是一种好习惯?

如果不是,是否应检索将其植入JSON / XML中?以及我们如何知道数据库是否损坏?

如果是,是否每次检索都需要仔细检查它们是否相同?

1 个答案:

答案 0 :(得分:0)

在KV数据库的JSON或XML值中复制标识符不是一个好主意。如果您“克隆”文档,它将复制信息,并且可能会变得不同步。也就是说,如果要基于先前存储的文档插入新文档,则需要更新document["uid"]字段。

简单地说,您不需要在值中存储UID,因为它已经存储在键中。

但是,在代码中,当您检索给定对象时,可以将其与标识符关联。这样您就可以更新正确的记录文档。

在JavaScript中,您将得到以下内容


function ref(uid) { /* retrieve the JSON document with the given UID */ }
function update(uid, object) { /* update the record UID with the JSON object OBJECT */ }


// let's say you know the identifier (UID) of a document, you can retrieve
// it with the `ref` function

let uid = 'P4X432'
let myDocument = ref(uid)

// update one field of the document

myDocument["website"] = "https://hyper.dev"

// now you need to save it, re-use the original identifier

update(uid, myDocument)

因此,最后,您可能会得到一个JavaScript对象或类似于以下内容的类:

myDatabaseRecord = {
  "uid": "P4X432", 
  "document": {
    "website": "https://hyper.dev", ...
  }
}

那是mongodb客户端执行此操作的方式。如果我没记错的话,在nodejs mongodb客户端库中,objectid使用特殊键$id来描述文档的标识符,例如:

object = { 
  "$id": "P4X432",
  "website": "https://hyper.dev",
  ...
}

$id以外的所有内容都将存储在KV数据库的值中。该方法的工作程度是需要进行部分复制(!)来构造将存储在数据库中的JSON文档(注意:在这种情况下是不可能发生突变的),您最终将获得性能较低的代码

代码中存在的内容与数据库中存在的内容不同。要记住的重要一点是,在代码中您需要跟踪文档的标识符。

相关问题