Search code examples
hyperledger-fabricblockchainhyperledger-composer

How to normalize blockchain storage?


I am wondering how to model my assets, participants, transactions en events. I have already looked on documentation on how to do it syntax wise, but I was wondering if there is a structured way to do it. Just like the way normalization is done on relational databases.

If someone has principles about blockchain data storage, i would love to hear it.


Solution

  • Hyperledger Fabric is based on key-value stores (LevelDB and CouchDB), so you don't really gain any benefit from normalizing data. In relational databases you do it for easy indexing and joins, but in key-value-stores there is no such thing as joins.

    What you can do is create indexes on your data for faster querying. This is covered in the Marbles tutorial chaincode (l.108+):

    let indexName = 'color~name'
    let colorNameIndexKey = await stub.createCompositeKey(indexName, [marble.color, marble.name]);
    

    For modeling your assets in Hyperledger Composer you can use .cto definitions.