假设我有一个KVS数据库,其中的键是文档ID。这些文档是JSON和XML,可以在其中获取文档ID。例如:
c62a3ecd-696b-4c9e:{"document-id": "c62a3ecd-696b-4c9e", ... }
同时拥有ID是否是一种好习惯?
如果不是,是否应检索将其植入JSON / XML中?以及我们如何知道数据库是否损坏?
如果是,是否每次检索都需要仔细检查它们是否相同?
答案 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文档(注意:在这种情况下是不可能发生突变的),您最终将获得性能较低的代码
代码中存在的内容与数据库中存在的内容不同。要记住的重要一点是,在代码中您需要跟踪文档的标识符。