Couchdb N个不同版本的单个键指向大小为M的json值,还是N个大小为M/N的不同键?

Couchdb N个不同版本的单个键指向大小为M的json值,还是N个大小为M/N的不同键?,couchdb,hyperledger-fabric,hyperledger,Couchdb,Hyperledger Fabric,Hyperledger,我想问,哪种方法更好——使用N个不同版本的单个键来指向大小为M的json值,还是使用N个不同的键来指向大小为M/N的json值 我用CouchDB作为国家数据库 例如: 具有多个版本的单个键(每个值将在不同的链码调用后插入): 具有一个版本的多个密钥: "key1:1" -> {"value":"v1"} "key2:1" -> {"value":"v2"} "key3:1" -> {"value":"v3"} ... "keym:1" -> {"value":"vm"}

我想问,哪种方法更好——使用N个不同版本的单个键来指向大小为M的json值,还是使用N个不同的键来指向大小为M/N的json值

我用CouchDB作为国家数据库

例如:

具有多个版本的单个键(每个值将在不同的链码调用后插入):

具有一个版本的多个密钥:

"key1:1" -> {"value":"v1"}
"key2:1" -> {"value":"v2"}
"key3:1" -> {"value":"v3"}
...
"keym:1" -> {"value":"vm"}

账本中的持久化数组是否有一些优化?例如,只保留更改而不复制所有内容。

不知道我是否正确理解了您的问题。但通常有两种方法可以做到这一点。但在详细讨论之前,将带有数组的单个键存储为附加每个版本的值是严格禁止的

这是因为,当您同时或在同一块中的不同事务中修改同一个密钥时,您最终肯定会出现MVCC_READ_冲突错误

这是因为Fabric使用乐观锁定来提交读/写集

回到方法[两种方法都是StateDB不可知的,您可以使用coach/goLevelDB]:

方法1: 如果在获取值时需要使用版本,请将每个键存储为复合键

key1-ver1 -> val1
key1-ver2 -> val2
.. and so on

方法2: 如果在获取时不需要该版本,只需要获取以前的版本,那么Fabric会使用自己的机制在内部存储密钥修改的历史记录。您可以使用链码的API查询此历史记录

您可以查看大理石示例,了解这两种方法:

key1-ver1 -> val1
key1-ver2 -> val2
.. and so on