在FISCO BCOS CRUD中,是有update修改函数的,但为什么在实际应用中,有部分是通过向表中插入一个新的 Entry 来实现的,而不是直接修改现有的记录?这种方法其实是 “追加式” 数据更新的思想。这种思想常用于区块链应用或某些数据库系统中,特别是那些追求数据的不可变性和审计追踪的场景。
代码演示:
请看以下代码,功能分别是“能源新增接口”和”能源修改接口“,但细心的同学就可以发现了,它的修改方法不直接调用CRUD中的update函数,而是又是使用一个insert函数实现修改功能。
-
insert
函数: 这个函数向表中插入一个新条目,初始的energy
值为0
。它确保_numid
不为空后才执行插入操作。 -
update
函数: 在执行更新时,并没有直接修改表中的现有数据,而是插入了一个新的记录。新的记录会使用随机生成的produce_random
数值作为energy
,然后通过insert
方法将其添加到表中。
function insert(string memory _numid) public returns(int) {
int count = int(0);
Table table = tf.openTable(TABLE_NAME);
if(!_numid.empty()){
Entry entry = table.newEntry();
entry.set("energy", int(0));
count = table.insert(_numid,entry);
}
emit Result(count);
return count;
}
function update(string memory _numid) public returns(int) {
int count = int(0);
int produce_random = rand();
Table table = tf.openTable(TABLE_NAME);
if(!_numid.empty()){
Entry entry = table.newEntry();
entry.set("energy",produce_random);
count = table.insert(_numid,entry);
}
emit Result(count);
return count;
}
追加式数据更新的思想
-
数据不可变性: 在区块链的设计中,数据通常是不可变的。这意味着一旦数据写入链上,就不应该被修改或删除。这有助于保证数据的完整性和安全性,使得所有数据操作都是可追溯的。
-
历史追踪: 通过插入新的记录而不是修改原有记录,你可以保留所有的历史操作,这对于审计、回溯和验证操作的正确性非常有用。这意味着你能够追踪到每个操作产生的数据,并能够随时检查历史记录。
-
版本管理: 类似于版本控制系统,每次更新都会生成一个新的版本,而不是直接覆盖旧版本。这允许系统回滚到先前的版本或者检查某个时间点的数据状态。
那么可能有同学要问了,我如果修改全部变成新增的话,那我如何知道哪些数据是新的呢?
其实,要解决这类问题只需要在字段中添加一个时间类字段即可(这里只简单回答)
何时适用这种方法?
-
区块链应用: 由于区块链上数据的不可篡改性,这种方法特别适合在区块链上使用,确保所有交易和状态变化都被记录下来。
-
日志和审计系统: 在一些需要严格的历史追踪和审计记录的系统中,这种方式能够提供非常有价值的记录和追踪能力。
-
分布式系统: 在某些分布式数据库或系统中,数据的追加式更新有助于保证系统的一致性和容错能力。
总结
在这种设计中,每次更新都会插入一个新的记录,而不是修改现有的记录。这种方法有助于保留历史信息,追踪变化,并确保数据的完整性和不可篡改性。这种设计思想特别适用于区块链和其他需要高度可信的应用场景。