--- title: data model for CH2 tags: data_model --- ## Operations for CH1.5 ```rust // Insert transaction row insert_to_tx_table(hash, trytes, milestone); // Insert ADDRESS hint row (address hint with year/month clustered) insert_to_hint_table(address, ADDRESS, year, month, milestone); // Insert address data row (so we can query w/ (address, year, month)) insert_to_data_table(address, year, month, address_kind, // (value < 0) ? INPUT:OUTPUT timestamp_ms, hash, value, milestone); let itr: [(&str, &str, &str, u8); 4] = [ (trytes.trunk(), APPROVEE, TRUNK, 4), (trytes.branch(), APPROVEE, BRANCH, 6), (trytes.bundle(), BUNDLE, BUNDLE, 8), (tag, TAG, TAG, 10), ]; for (vertex, hint_kind, data_kind, query_id) in &itr { // Insert trunk/branch/bundle/tag hint row (vertex hint with year/month clustered) insert_to_hint_table(vertex, hint_kind, year, month, milestone); // Insert trunk/branch/bundle/tag data row (so we can query w/ (vertex, year, month)) insert_to_data_table(vertex, year, month, data_kind, timestamp_ms, hash, value, milestone); } ``` ## Tables for CH1.5 - Transaction table ```sql CREATE TABLE IF NOT EXISTS keyspace_name.transaction ( hash varchar, payload varchar, address varchar, value varchar, obsolete_tag varchar, timestamp varchar, current_index varchar, last_index varchar, bundle varchar, trunk varchar, branch varchar, tag varchar, attachment_timestamp varchar, attachment_timestamp_lower varchar, attachment_timestamp_upper varchar, nonce varchar, milestone bigint, PRIMARY KEY(hash, payload, address, value, obsolete_tag, timestamp, current_index, last_index, bundle, trunk, branch, tag, attachment_timestamp,attachment_timestamp_lower,attachment_timestamp_upper, nonce) ); ``` - Hint table ```sql= CREATE TABLE IF NOT EXISTS keyspace_name.hint ( vertex varchar, kind varchar, year smallint, month tinyint, milestone bigint, PRIMARY KEY(vertex, kind, year, month) ) WITH CLUSTERING ORDER BY (kind DESC, year DESC, month DESC); ``` - Data table ```sql= CREATE TABLE IF NOT EXISTS keyspace_name.data ( vertex varchar, year smallint, month tinyint, kind varchar, timestamp bigint, tx varchar, value bigint, milestone bigint, PRIMARY KEY((vertex,year,month), kind, timestamp, tx, value) ) WITH CLUSTERING ORDER BY (kind DESC, timestamp DESC); ``` ## CH2 Message Spec - Specs - [Transaction](https://github.com/iotaledger/protocol-rfcs/blob/faa8857719264f7b028bcf6712c021f5fb0fc6c7/text/0000-transaction-payload/0000-transaction-payload.md) - [Milestone](https://github.com/iotaledger/protocol-rfcs/blob/002b8db2ab1ac044273e43dd1dce23745140436d/text/0019-milestone-payload/0019-milestone-payload.md) - [Indexation]() - [bee-message]() ## Supported API for CH2 - `messageID` - which returns complete message payload - Query Message Table - `milestoneIndex` - returns milestone index details - Query Hint Table -> Data Table - We calculate the milestone index details from the payload - Another way: we store the milestone index details in Data Table - `indexationKey` - returns all items with matching indexation key - Query Hint Table -> Data Table - We return the messageID stored in the Data Table - `addressHash` (hex or bech32) - returns balance and outputIDs - Query Hint Table -> Data Table - We calculate the balance and outputIDs from the payload - Another way: we store the balance and outputIDs in Data Table - `outputID` - returns output details - Query Hint Table -> Data Table - We calculate the output details from the payload - Another way: we store the output details in Data Table - `getMessageMetadata` - Query Message Table - We calculate the metadata from the payload - Another way: we store the metadata in the Message Table - `getMessageChildIDs` - Query Message Table - Another way: we store the ChildIDs in the Message Table ## Tables for CH2 - Message table ```sql CREATE TABLE IF NOT EXISTS keyspace_name.message ( id varchar, // messageID type int, // 0: Transaction, 1: MileStone, 2: Indexation payload blob, // The whole field for the given message type PRIMARY KEY(id, type, payload) ); ``` - Hint table - Insert address/trunk/branch/bundle/tag hint row (vertex hint with shard clustered) - kind - MILESTONE (vertex is milestoneIndex) - INDEXATION (vertex is indexationKey) - ADDRESS (vertex is address) ```sql= CREATE TABLE IF NOT EXISTS keyspace_name.hint ( vertex varchar, kind varchar, shard bigint, PRIMARY KEY(vertex, kind, shard) ) WITH CLUSTERING ORDER BY (kind DESC, shard DESC); ``` - Data table - Insert address/trunk/branch/bundle/tag data row (so we can query w/ (vertex, shard)) - kind - MILESTONE (vertex is (milestoneIndex, shard)) - INDEXATION (vertex is (indexationKey, shard)) - INPUT (vertex is (address, shard)) - OUTPUT (vertex is (address, shard)) ```sql= CREATE TABLE IF NOT EXISTS keyspace_name.data ( vertex varchar, shard bigint, kind varchar, id varchar, // messageID payload blob, PRIMARY KEY((vertex,shard), kind, id, payload) ) WITH CLUSTERING ORDER BY (kind DESC, shard DESC); ``` ## Data Model w/o Payload Calculation for Each API Calls - Message table ```sql CREATE TABLE IF NOT EXISTS keyspace_name.message ( id varchar, // messageID type int, // 0: Transaction, 1: MileStone, 2: Indexation payload blob, // The whole field for the given message type metadata varchar, child_ids varchar, PRIMARY KEY(id, type, payload, metadata) ); ``` - Hint table - Insert address/trunk/branch/bundle/tag hint row (vertex hint with shard clustered) - kind - MILESTONE (vertex is milestoneIndex) - INDEXATION (vertex is indexationKey) - ADDRESS (vertex is address) ```sql= CREATE TABLE IF NOT EXISTS keyspace_name.hint ( vertex varchar, kind varchar, shard bigint, PRIMARY KEY(vertex, kind, shard) ) WITH CLUSTERING ORDER BY (kind DESC, shard DESC); ``` - Data table - Insert address/trunk/branch/bundle/tag data row (so we can query w/ (vertex, shard)) - kind - MILESTONE (vertex is (milestoneIndex, shard)) - INDEXATION (vertex is (indexationKey, shard)) - INPUT (vertex is (address, shard)) - OUTPUT (vertex is (address, shard)) ```sql= CREATE TABLE IF NOT EXISTS keyspace_name.data ( vertex varchar, shard bigint, kind varchar, id varchar, // messageID payload blob, milestone_details varchar, balance bigint, outputIDs varchar, output_details varchar, PRIMARY KEY((vertex,shard), kind, id, payload, milestone_details, balance, outputIDs, output_details) ) WITH CLUSTERING ORDER BY (kind DESC, shard DESC); ``` ## Unsolved Questions - The balance definition? (Not found in the transaction spec) - The outputIDs definition? (Not found in the transaction spec) - The output details definition? (Not found in the transaction spec) - The metadata definition? (Not found in the transaction spec) - ChildIDs definition? ((Not found in the transaction spec))