我对如何在Hyperledger Composer .cto文件中定义关系感到有些困惑。请参阅下面的具体问题:
这里我粘贴了https://github.com/IBM/Decentralized-Energy-Composer/blob/master/models/model.cto:
中的.cto文件的部分内容participant Resident identified by residentID {
o String residentID
o String firstName
o String lastName
--> Coins coins
--> Cash cash
--> Energy energy
}
asset Coins identified by coinsID {
o String coinsID
o Double value
o String ownerID
o OwnerEntity ownerEntity
}
asset Energy identified by energyID {
o String energyID
o String units
o Double value
o String ownerID
o OwnerEntity ownerEntity
}
asset Cash identified by cashID {
o String cashID
o String currency
o Double value
o String ownerID
o OwnerEntity ownerEntity
}
是否应将其视为a Resident owns assets which are Coins, Cash and Energy
?这可以用其他方式编写(见下文)吗?
participant Resident identified by residentID {
o String residentID
o String firstName
o String lastName
}
asset Coins identified by coinsID {
o String coinsID
o Double value
-->Resident owner
}
asset Energy identified by energyID {
o String energyID
o String units
o Double value
--> Resident owner
}
asset Cash identified by cashID {
o String cashID
o String currency
o Double value
--> Resident owner
}
所以,这基本上说每个资产都归某人所有。哪种设计被认为更好,为什么?请解释一下。
答案 0 :(得分:1)
第二种设计,最有可能的是,从设计的角度来看,它更normalized
。 (应该想象当前的设计是针对示例演示设置的水平设置,而不是为了更好的准备就绪的详尽设计)。业务网络模型(以及其他内容)描述了participants
,assets
和transactions
- 建模网络 - 资源及其字段/属性/类型的声明 - 当然还有关系 - 一般来说,与old school
数据库设计并不太相似。更好的解释here (scroll down)。
这段关系说:
在上面的设计2中:经典地,owner
字段(在assets
中)是一个关系字段 - 并且在引用中映射到participant
记录(通过其标识字段)参与者班。在您的事务逻辑中,您可以检查相关参与者的owner.firstName
值(一个示例)。
这种关系是单向的。通过添加关系字段,参与者(在#2的情况下)可以从任何上述资产资源类型中引用(例如,来自您的交易处理逻辑/代码,智能合约的一部分)。关系不是强制执行的(它不是关系数据库),但您可以在添加/删除时自行添加逻辑以进行检查。希望这会有所帮助。